рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕рд╣рд░реВ рдХрд╕рд░реА рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреЗ рд╕рд┐рдХреНрдиреБрд╣реЛрд╕реНред рднрд╛рдЧ рез. рд╡рд╕рдиреНрдд рдмреБрдЯ рд░ рдбрдХрд░

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕рд╣рд░реВ рдХрд╕рд░реА рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреЗ рд╕рд┐рдХреНрдиреБрд╣реЛрд╕реНред рднрд╛рдЧ рез. рд╡рд╕рдиреНрдд рдмреБрдЯ рд░ рдбрдХрд░

рд╣реЗрд░ Habr.

рдпрд╕ рд▓реЗрдЦрдорд╛, рдо рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕реЗрд╕рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд┐рдХреНрдиреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдореЗрд░реЛ рдЕрдиреБрднрд╡рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред рдЬрдм рдореИрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рдЙрдкрдХрд░рдг рд╕рд┐рдХреЗрдВ, рдо рд╕рдзреИрдВ рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рдЕрдЭ рдпрдерд╛рд░реНрдердкрд░рдХ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдкрдирд┐ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдереЗрдВред рддреНрдпрд╕рдХрд╛рд░рдг, рдореИрд▓реЗ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рдЬреБрди рдкрдЫрд┐ рд╕рдмреИ рдкреНрд░рдХрд╛рд░рдХрд╛ рд░реЛрдЪрдХ рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВрд╕рдБрдЧ "рдХрднрд░" рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд┐рдХрдЯрддрд╛ рд╣реЛред

рд╕реБрд░реБрдорд╛, рдореИрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдирд┐рд░реНрдорд╛рдгрд▓рд╛рдИ рдзреЗрд░реИ рдЪрд░рдгрд╣рд░реВрдорд╛ рддреЛрдбреЗрдВ:

  1. рджреБрдИ рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН - 'рдмреНрдпрд╛рдХрдПрдиреНрдб' (рдмреНрдпрд╛рдХрдПрдиреНрдб) рд░ 'рдЧреЗрдЯрд╡реЗ' (рдЧреЗрдЯрд╡реЗ), рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдбрдХрд░ рдЫрд╡рд┐рд╣рд░реВрдорд╛ рдкреНрдпрд╛рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдБрдЧреИ рдХрд╛рдо рдЧрд░реНрди рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

    рдХреАрд╡рд░реНрдбрд╣рд░реВ: рдЬрд╛рднрд╛ 11, рд╡рд╕рдиреНрдд рдмреБрдЯ, рдбрдХрд░, рдЫрд╡рд┐ рдЕрдиреБрдХреВрд▓рди

  2. Google Kubernetes рдЗрдиреНрдЬрд┐рдирдорд╛ Kubernetes рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд░ рдкреНрд░рдгрд╛рд▓реА рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯрдХреЛ рд╡рд┐рдХрд╛рд╕

    рдХреАрд╡рд░реНрдбрд╣рд░реВ: Kubernetes, GKE, рд╕рдВрд╕рд╛рдзрди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди, рд╕реНрд╡рдд: рд╕реНрдХреЗрд▓рд┐рдЩ, рд░рд╣рд╕реНрдп

  3. рд░рд╛рдореНрд░реЛ рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирдХреЛ рд▓рд╛рдЧрд┐ Helm 3 рд╕рдБрдЧ рдЪрд╛рд░реНрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

    Tags: Helm 3, рдЪрд╛рд░реНрдЯ рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ

  4. рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдХреЛрдбрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдбреЗрд▓рд┐рднрд░реАрдХреЛ рд▓рд╛рдЧрд┐ рдЬреЗрдирдХрд┐рдиреНрд╕ рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯ рдЧрд░реНрджреИ

    рдХреАрд╡рд░реНрдбрд╣рд░реВ: рдЬреЗрдирдХрд┐рдиреНрд╕ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди, рдкреНрд▓рдЧрдЗрдирд╣рд░реВ, рдЫреБрдЯреНрдЯреИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рднрдгреНрдбрд╛рд░

рдо рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдгрдорд╛ рдЫреБрдЯреНрдЯреИ рд▓реЗрдЦ рд╕рдорд░реНрдкрд┐рдд рдЧрд░реНрдиреЗ рдпреЛрдЬрдирд╛ рдЧрд░реНрдЫреБред

рд▓реЗрдЦрд╣рд░реВрдХреЛ рдпрд╕ рд╢реГрдЩреНрдЦрд▓рд╛рдХреЛ рдлреЛрдХрд╕ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕реЗрд╕рд╣рд░реВ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ рднрдиреНрдиреЗ рд╣реЛрдЗрди, рддрд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдПрдХрд▓ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рд╣реЛред рдпрджреНрдпрдкрд┐ рдпреА рд╕рдмреИ рдЪреАрдЬрд╣рд░реВ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдХреЛ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реА рдмрд╛рд╣рд┐рд░ рдЫрдиреН, рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рдХрд┐ рдпреЛ рдЕрдЭреИ рдкрдирд┐ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рдкрд░рд┐рдЪрд┐рдд рд╣реБрди рдЙрдкрдпреЛрдЧреА рдЫ рдХрдореНрддрд┐рдорд╛ 20% (рдЬреБрди, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ, рдкрд░рд┐рдгрд╛рдордХреЛ 80% рджрд┐рдиреБрд╣реЛрд╕реН)ред рдХреЗрд╣реА рдмрд┐рдирд╛ рд╢рд░реНрдд рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдпрд╣рд░реВ, рдЬрд╕реНрддреИ рд╕реБрд░рдХреНрд╖рд╛, рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдмрд╛рдЯ рдЫреЛрдбрд┐рдиреЗрдЫ, рдХрд┐рдирднрдиреЗ рд▓реЗрдЦрдХрд▓реЗ рдпреЛ рдкреНрд░рдгрд╛рд▓реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рд╣реЛ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдереЛрд░реИ рдмреБрдЭреЗрдХрд╛ рдЫрдиреНред рдо рдХреБрдиреИ рдкрдирд┐ рд╡рд┐рдЪрд╛рд░ рд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рд╕реНрд╡рд╛рдЧрдд рдЧрд░реНрджрдЫреБред

рд▓рдШреБ рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

рд╕реЗрд╡рд╛рд╣рд░реВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреБрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Java 11 рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛред Interservice рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ REST рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдВрдЧрдард┐рдд рдЫред рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ (рдпрд╕рдХрд╛рд░рдг рдкрдЫрд┐ рдЬреЗрдирдХрд┐рдиреНрд╕рдорд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдХреЗрд╣рд┐ рдЫ)ред рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдорд╛ рдЙрдкрд▓рдмреНрдз рдЫ: рдмреНрдпрд╛рдХрдЗрдиреНрдб ╨╕ рдЧреЗрдЯрд╡реЗ.

рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛рдХреЛ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐, рддрд┐рдиреАрд╣рд░реВрдХреЛ рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВрдорд╛ рд╡рд╕рдиреНрдд рдПрдХреНрдЪреБрдПрдЯрд░ рдердкрд┐рдПрдХреЛ рдЫред рдпрд╕рд▓реЗ / actuator/health endpoint рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫ рд░ рдпрджрд┐ рд╕реЗрд╡рд╛ рдЯреНрд░рд╛рдлрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрди рддрдпрд╛рд░ рдЫ рднрдиреЗ 200 рд╕реНрдерд┐рддрд┐ рдлрд░реНрдХрд╛рдЙрдиреЗрдЫ, рд╡рд╛ рдХреБрдиреИ рд╕рдорд╕реНрдпрд╛ рднрдПрдорд╛ 504ред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреЛ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЬрд╛рдБрдЪ рд╣реЛ, рдХрд┐рдирдХрд┐ рд╕реЗрд╡рд╛рд╣рд░реВ рдзреЗрд░реИ рд╕рд░рд▓ рдЫрдиреН, рд░ рдХреЗрд╣рд┐ рдмрд▓ рдорд╛рдЬреНрдпреЛрд░рдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддрд┐рдиреАрд╣рд░реВ рдЖрдВрд╢рд┐рдХ рд░реВрдкрдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рд░рд╣рдиреБ рднрдиреНрджрд╛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реБрдиреЗ рд╕рдореНрднрд╛рд╡рдирд╛ рдмрдвреА рд╣реБрдиреНрдЫред рддрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдорд╛, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓рдбреНрди рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐ Actuator рд▓реЗ рд╕рдорд╕реНрдпрд╛рдХреЛ рдирд┐рджрд╛рди рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдбрд╛рдЯрд╛рдмреЗрд╕ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рд╣рд╛рдореА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдмрд┐рдЧреНрд░рд┐рдПрдХреЛ рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд╕рд╛рде рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдмрдиреНрдж рдЧрд░реЗрд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рди рд╕рдХреНрдЫреМрдВред

рдкрдЫрд╛рдбрд┐ рдЕрдиреНрдд рд╕реЗрд╡рд╛

рдмреНрдпрд╛рдХрдПрдиреНрдб рд╕реЗрд╡рд╛рд▓реЗ рдорд╛рддреНрд░ рд╕реНрд╡реАрдХреГрдд рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдЧрдгрдирд╛ рд░ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫред

рдирд┐рдпрдиреНрддреНрд░рдХ рдХреЛрдб:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/requests")
    public Long getRequestsCount() {
        return counter.incrementAndGet();
    }
}

рдирд┐рдпрдиреНрддреНрд░рдХ рдкрд░реАрдХреНрд╖рдг:

@WebMvcTest(RequestsCounterController.class)
public class RequestsCounterControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void firstRequest_one() throws Exception {
        mockMvc.perform(get("/requests"))
            .andExpect(status().isOk())
            .andExpect(MockMvcResultMatchers.content().string("1"));
    }
}

рд╕реЗрд╡рд╛ рдЧреЗрдЯрд╡реЗ

рдЧреЗрдЯрд╡реЗрд▓реЗ рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рдмреНрдпрд╛рдХрдЗрдиреНрдб рд╕реЗрд╡рд╛рдорд╛ рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реНрдиреЗрдЫ, рдпрд╕рд▓рд╛рдИ рдирд┐рдореНрди рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕рд╛рде рдкреВрд░рдХ рдЧрд░реНрджреИ:

  • рдЧреЗрдЯрд╡реЗ рдЖрдИрдбреАред рдпреЛ рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рд╕рд░реНрднрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрд░реНрдХреЛрдмрд╛рдЯ рдЧреЗрдЯрд╡реЗрдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЫреБрдЯреНрдпрд╛рдЙрди рд╕рдореНрднрд╡ рдЫред
  • рдХреЗрд╣рд┐ "рдЧреЛрдкреНрдп" рдЬрд╕рд▓реЗ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдкрд╛рд╕рд╡рд░реНрдбрдХреЛ рднреВрдорд┐рдХрд╛ рдЦреЗрд▓реНрдиреЗрдЫ (рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреБрдХреАрдХреЛ рдЗрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдЮреНрдЬреАрдХреЛ рд╕рдВрдЦреНрдпрд╛)

application.properties рдорд╛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди:

backend.url=http://localhost:8081
instance.id=${random.int}
secret="default-secret"

рдмреНрдпрд╛рдХрдПрдиреНрдб рдПрдбрд╛рдкреНрдЯрд░:

@Service
public class BackendAdapter {

    private static final String REQUESTS_ENDPOINT = "/requests";

    private final RestTemplate restTemplate;

    @Value("${backend.url}")
    private String backendUrl;

    public BackendAdapter(RestTemplateBuilder builder) {
        restTemplate = builder.build();
    }

    public String getRequests() {
        ResponseEntity<String> response = restTemplate.getForEntity(
backendUrl + REQUESTS_ENDPOINT, String.class);
        return response.getBody();
    }
}

рдирд┐рдпрдиреНрддреНрд░рдХ:

@RestController
@RequiredArgsConstructor
public class EndpointController {

    private final BackendAdapter backendAdapter;

    @Value("${instance.id}")
    private int instanceId;

    @Value("${secret}")
    private String secret;

    @GetMapping("/")
    public String getRequestsCount() {
        return String.format("Number of requests %s (gateway %d, secret %s)", backendAdapter.getRequests(), instanceId, secret);
    }
}

рд╕реБрд░реБрд╡рд╛рдд:

рд╣рд╛рдореА рдмреНрдпрд╛рдХрдПрдиреНрдб рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ:

./mvnw package -DskipTests
java -Dserver.port=8081 -jar target/microservices-backend-1.0.0.jar

рдЧреЗрдЯрд╡реЗ рд╕реБрд░реБ рдЧрд░реНрджреИ:

./mvnw package -DskipTests
java -jar target/microservices-gateway-1.0.0.jar

рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ:

$ curl http://localhost:8080/
Number of requests 1 (gateway 38560358, secret "default-secret")

рд╕рдмреИ рдХрд╛рдо рднрдЗрд░рд╣реЗрдХреЛ рдЫред рдПрдХ рд╕рдЪреЗрдд рдкрд╛рдардХрд▓реЗ рдиреЛрдЯ рдЧрд░реНрдиреЗрдЫ рдХрд┐ рдЧреЗрдЯрд╡реЗ (http://localhost:8081/requests)ред рдпрд╕рд▓рд╛рдИ рдареАрдХ рдЧрд░реНрди, рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдЙрдЯреИ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рдЬреЛрдбрд┐рдиреБрдкрд░реНрдЫ, рд░ рдХреЗрд╡рд▓ рдЧреЗрдЯрд╡реЗ рдмрд╛рд╣рд┐рд░ "рд╕реНрдЯрд┐рдХ рдЖрдЙрдЯ" рд╣реБрдиреБрдкрд░реНрдЫред
рд╕рд╛рдереИ, рджреБрдмреИ рд╕реЗрд╡рд╛рд╣рд░реВрд▓реЗ рдПрдЙрдЯреИ рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реА рд╕рд╛рдЭреЗрджрд╛рд░реА рдЧрд░реНрджрдЫ, рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВ рдЙрддреНрдкрд╛рджрди рдЧрд░реНрджрдЫ рд░ рдПрдХ рдХреНрд╖рдгрдорд╛ рдПрдХ рдЕрд░реНрдХрд╛рд╕рдБрдЧ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдЫред рд╣рд╛рдореНрд░рд╛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕реЗрд╕рд╣рд░реВрд▓рд╛рдИ рдЕрд▓рдЧ рдЧрд░реНрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫред рдпреЛ рд╡рд┐рднрд┐рдиреНрди рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ (рдзреЗрд░реИ рдкреИрд╕рд╛, рдЧрд╛рд╣реНрд░реЛ), рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВ (рд╕реНрд░реЛрдд рдЧрд╣рди, рд▓рд╛рдореЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк) рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд╛ рдХрдиреНрдЯреЗрдирд░рд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд╡рд┐рддрд░рдг рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдкрдорд╛, рд╣рд╛рдореА рддреЗрд╕реНрд░реЛ рд╡рд┐рдХрд▓реНрдк рдЫрдиреМрдЯ рдЧрд░реНрдЫреМрдВ рд░ рдбрдХрд░ рдХрдиреНрдЯреЗрдирд░рд╛рдЗрдЬреЗрд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЙрдкрдХрд░рдгрдХреЛ рд░реВрдкрдорд╛ред

рдбрдХрд░

рдЫреЛрдЯрдХрд░реАрдорд╛, рдбрдХрд░рд▓реЗ рдкреГрдердХ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫ, рдПрдХ рдкреНрд░рддрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧред рдбрдХрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ рдбрдХрд░рдлрд╛рдЗрд▓ рд▓реЗрдЦреНрдиреБ рдкрд░реНрдЫ - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг рд░ рдЪрд▓рд╛рдЙрдирдХрд╛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВред рдЕрд░реНрдХреЛ, рддрдкрд╛рдЗрдБ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдпрд╕рд▓рд╛рдИ рдЫрд╡рд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдиред рдбрдХрд░рд╣рдм) рд░ рддрдкрд╛рдЗрдБрдХреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕рд▓рд╛рдИ рдХреБрдиреИ рдкрдирд┐ рдбрдХрд░рд╛рдЗрдЬреНрдб рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдПрдХ рдЖрджреЗрд╢рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдбрдХрд░рдлрд╛рдЗрд▓

рдЫрд╡рд┐рдХреЛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рдпрд╕рдХреЛ рдЖрдХрд╛рд░ рд╣реЛред рдПрдЙрдЯрд╛ рдХрдореНрдкреНрдпрд╛рдХреНрдЯ рдЫрд╡рд┐ рд░рд┐рдореЛрдЯ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрдмрд╛рдЯ рдЫрд┐рдЯреЛ рдбрд╛рдЙрдирд▓реЛрдб рд╣реБрдиреЗрдЫ, рдХрдо рдард╛рдЙрдБ рд▓рд┐рдиреБрд╣реЛрд╕реН, рд░ рддрдкрд╛рдИрдВрдХреЛ рд╕реЗрд╡рд╛ рдЫрд┐рдЯреЛ рд╕реБрд░реБ рд╣реБрдиреЗрдЫред рдХреБрдиреИ рдкрдирд┐ рдЫрд╡рд┐ рдЖрдзрд╛рд░ рдЫрд╡рд┐рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдмрдирд╛рдЗрдПрдХреЛ рдЫ, рд░ рдпреЛ рд╕рдмреИрднрдиреНрджрд╛ рдиреНрдпреВрдирддрдо рд╡рд┐рдХрд▓реНрдк рдЫрдиреМрдЯ рдЧрд░реНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫред рдПрдХ рд░рд╛рдореНрд░реЛ рд╡рд┐рдХрд▓реНрдк рдЕрд▓реНрдкрд╛рдЗрди рд╣реЛ, рдиреНрдпреВрдирддрдо рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВрдХреЛ рд╕рд╛рде рдкреВрд░реНрдг рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдгред

рд╕реБрд░реБрдорд╛, "рдирд┐рдзрд╛рд░рдорд╛" рдбрдХрд░рдлрд╛рдЗрд▓ рд▓реЗрдЦреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ (рдо рддреБрд░реБрдиреНрддреИ рднрдиреНрдЫреБ рдХрд┐ рдпреЛ рдЦрд░рд╛рдм рддрд░рд┐рдХрд╛ рд╣реЛ, рдпреЛ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН):

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests
EXPOSE 8080
ENTRYPOINT ["java","-jar","target/microservices-gateway-1.0.0.jar"]

рдпрд╣рд╛рдБ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реНрдерд╛рдкрд┐рдд JDK рд╕рдБрдЧ рдЕрд▓реНрдкрд╛рдЗрди рдЖрдзрд╛рд░рд┐рдд рдЖрдзрд╛рд░ рдЫрд╡рд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдЫреМрдВред ADD рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде, рд╣рд╛рдореА рдЫрд╡рд┐рдорд╛ рд╣рд╛рд▓рдХреЛ src рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рдердкреНрдЫреМрдВ, рдпрд╕рд▓рд╛рдИ рдХрд╛рдо рдЧрд░реНрдиреЗ (WORKDIR) рднрдиреА рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдирд┐рд░реНрдорд╛рдг рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реНред EXPOSE 8080 рдЖрджреЗрд╢рд▓реЗ рдбрдХрд░рд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рдХрд┐ рдХрдиреНрдЯреЗрдирд░рдорд╛ рд░рд╣реЗрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдпрд╕рдХреЛ рдкреЛрд░реНрдЯ 8080 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫ (рдпрд╕рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рдмрд╛рд╣рд┐рд░рдмрд╛рдЯ рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп рдмрдирд╛рдЙрдБрджреИрди, рддрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЙрд╣реА рдбрдХрд░ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рдЕрд░реНрдХреЛ рдХрдиреНрдЯреЗрдирд░рдмрд╛рдЯред )ред

рдЫрд╡рд┐рд╣рд░реВрдорд╛ рд╕реЗрд╡рд╛рд╣рд░реВ рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдореВрд▓рдмрд╛рдЯ рдЖрджреЗрд╢рд╣рд░реВ рдЪрд▓рд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

docker image build . -t msvc-backend:1.0.0

рдкрд░рд┐рдгрд╛рдо 456 MB рдЫрд╡рд┐ рд╣реЛ (рдЬрд╕рдХреЛ рдЖрдзрд╛рд░ JDK рдЫрд╡рд┐рд▓реЗ 340 MB рдУрдЧрдЯреЗрдХреЛ рдЫ)ред рд░ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрдХреНрд╖рд╛рд╣рд░реВ рдФрдВрд▓рд╛рдорд╛ рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреНрдиреЗ рддрдереНрдпрдХреЛ рдмрд╛рд╡рдЬреБрдж рд╕рдмреИред рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐рдХреЛ рдЖрдХрд╛рд░ рдШрдЯрд╛рдЙрди:

  • рд╣рд╛рдореА рдмрд╣реБ-рдЪрд░рдг рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреМрдВред рдкрд╣рд┐рд▓реЛ рдЪрд░рдгрдорд╛ рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗрдЫреМрдВ, рджреЛрд╕реНрд░реЛ рдЪрд░рдгрдорд╛ рд╣рд╛рдореА JRE рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ, рд░ рддреЗрд╕реНрд░реЛ рдЪрд░рдгрдорд╛ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдирдпрд╛рдБ рд╕рдлрд╛ рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐рдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреЗрдЫреМрдВред рдХреБрд▓рдорд╛, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХрд╣рд░реВ рдЕрдиреНрддрд┐рдо рдЫрд╡рд┐рдорд╛ рд╣реБрдиреЗрдЫрдиреНред
  • рдЬрд╛рднрд╛рдХреЛ рдореЛрдбреНрдпреБрд▓рд░рд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВред Java 9 рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрджреИ, рддрдкрд╛рдИрд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдмрд╛рдЯ JRE рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди jlink рдЙрдкрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдЬрд┐рдЬреНрдЮрд╛рд╕реБрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдпрд╣рд╛рдБ рдЫрд╡рд┐ рдШрдЯрд╛рдЙрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгрд╣рд░реВрдорд╛ рд░рд╛рдореНрд░реЛ рд▓реЗрдЦ рдЫред https://habr.com/ru/company/ruvds/blog/485650/.

рдЕрдиреНрддрд┐рдо рдбрдХрд░рдлрд╛рдЗрд▓:

FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine as builder
ADD . /src
WORKDIR /src
RUN ./mvnw package -DskipTests

FROM alpine:3.10.3 as packager
RUN apk --no-cache add openjdk11-jdk openjdk11-jmods
ENV JAVA_MINIMAL="/opt/java-minimal"
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink 
    --verbose 
    --add-modules 
        java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument 
    --compress 2 --strip-debug --no-header-files --no-man-pages 
    --release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE" 
    --output "$JAVA_MINIMAL"

FROM alpine:3.10.3
LABEL maintainer="Anton Shelenkov [email protected]"
ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"
COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY --from=builder /src/target/microservices-backend-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

рд╣рд╛рдореА рдЫрд╡рд┐ рдкреБрди: рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ, рд░ рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдпрд╕рд▓реЗ рдпрд╕рдХреЛ рд╡рдЬрди 6 рдЧреБрдгрд╛ рдЧреБрдорд╛рдпреЛ, 77 MB рдХреЛ рдорд╛рддреНрд░рд╛ред рдЦрд░рд╛рдм рдЫреИрдиред рддреНрдпрд╕ рдкрдЫрд┐, рддрдпрд╛рд░ рдЫрд╡рд┐рд╣рд░реВ рдЫрд╡рд┐ рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рддрд╛рдХрд┐ рддрдкрд╛рдЗрдБрдХрд╛ рдЫрд╡рд┐рд╣рд░реВ рдЗрдиреНрдЯрд░рдиреЗрдЯрдмрд╛рдЯ рдбрд╛рдЙрдирд▓реЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрд▓рдмреНрдз рдЫрдиреНред

рдбрдХрд░рдорд╛ рд╕рд╣-рдЪрд╛рд▓рд┐рдд рд╕реЗрд╡рд╛рд╣рд░реВ

рд╕реБрд░реБрдорд╛, рд╣рд╛рдореНрд░рд╛ рд╕реЗрд╡рд╛рд╣рд░реВ рдПрдЙрдЯреИ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ рд╣реБрдиреБрдкрд░реНрдЫред рддреНрдпрд╣рд╛рдБ рдбрдХрд░рдорд╛ рдзреЗрд░реИ рдкреНрд░рдХрд╛рд░рдХрд╛ рд╕рдЮреНрдЬрд╛рд▓рд╣рд░реВ рдЫрдиреН, рд░ рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рд╕рдмреИрднрдиреНрджрд╛ рдЖрджрд┐рдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ - рдмреНрд░рд┐рдЬ, рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдПрдЙрдЯреИ рд╣реЛрд╕реНрдЯрдорд╛ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВ рдиреЗрдЯрд╡рд░реНрдХ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдирд┐рдореНрди рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

docker network create msvc-network

рдЕрд░реНрдХреЛ, microservices-backend:1.0.0 рдЫрд╡рд┐рдХреЛ рд╕рд╛рде 'рдмреНрдпрд╛рдХрдПрдиреНрдб' рдирд╛рдордХ рдмреНрдпрд╛рдХрдПрдиреНрдб рдХрдиреНрдЯреЗрдирд░ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

docker run -dit --name backend --network msvc-net microservices-backend:1.0.0

рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдмреНрд░рд┐рдЬ рдиреЗрдЯрд╡рд░реНрдХрд▓реЗ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдирд╛рдордмрд╛рдЯ рдмрдХреНрд╕ рд╕реЗрд╡рд╛ рдЦреЛрдЬреА рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рддреНрдпреЛ рд╣реЛ, рдмреНрдпрд╛рдХрдПрдиреНрдб рд╕реЗрд╡рд╛ рдбрдХрд░ рдиреЗрдЯрд╡рд░реНрдХ рднрд┐рддреНрд░ рдЙрдкрд▓рдмреНрдз рд╣реБрдиреЗрдЫ http://backend:8080.

рдЧреЗрдЯрд╡реЗ рд╕реБрд░реБ рдЧрд░реНрджреИ:

docker run -dit -p 80:8080 --env secret=my-real-secret --env BACKEND_URL=http://backend:8080/ --name gateway --network msvc-net microservices-gateway:1.0.0

рдпрд╕ рдЖрджреЗрд╢рдорд╛, рд╣рд╛рдореА рд╕рдВрдХреЗрдд рдЧрд░реНрдЫреМрдВ рдХрд┐ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рд╣реЛрд╕реНрдЯрдХреЛ рдкреЛрд░реНрдЯ 80 рд▓рд╛рдИ рдХрдиреНрдЯреЗрдирд░рдХреЛ рдкреЛрд░реНрдЯ 8080 рдорд╛ рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реНрджреИрдЫреМрдВред рд╣рд╛рдореА рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрди env рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рдЬреБрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╡рд╕рдиреНрдд рджреНрд╡рд╛рд░рд╛ рдкрдврд┐рдиреЗрдЫ рд░ application.properties рдмрд╛рдЯ рдЧреБрдгрд╣рд░реВ рдУрднрд░рд░рд╛рдЗрдб рд╣реБрдиреЗрдЫред

рд╕реБрд░реБ рдЧрд░реЗрдкрдЫрд┐, рд╣рд╛рдореА рдХрд▓ рдЧрд░реНрдЫреМрдВ http://localhost/ рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдЕрдШрд┐рд▓реНрд▓реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдЬрд╕реНрддреИ рдХрд╛рдо рдЧрд░реНрджрдЫред

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣рд╛рдореАрд▓реЗ рджреБрдИрд╡рдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрднрд┐рд╕рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдпреМрдВ, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдбрдХрд░ рдХрдиреНрдЯреЗрдирд░рд╣рд░реВрдорд╛ рдкреНрдпрд╛рдХ рдЧрд░реНрдпреМрдВ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдПрдЙрдЯреИ рдореЗрд╕рд┐рдирдорд╛ рд╕рдБрдЧреИ рд▓рдиреНрдЪ рдЧрд░реНрдпреМрдВред рдирддрд┐рдЬрд╛ рдкреНрд░рдгрд╛рд▓реА, рддрдерд╛рдкрд┐, рдзреЗрд░реИ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН:

  • рдЦрд░рд╛рдм рдЧрд▓реНрддреА рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ - рд╕рдмреИ рдХреБрд░рд╛ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕рд░реНрднрд░рдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ
  • рдЦрд░рд╛рдм рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА - рдЬрдм рд▓реЛрдб рдмрдвреНрдЫ, рдпреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рддреИрдирд╛рдд рдЧрд░реНрди рд░ рддрд┐рдиреАрд╣рд░реВ рдмреАрдЪрдХреЛ рднрд╛рд░ рд╕рдиреНрддреБрд▓рди рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫред
  • рдкреНрд░рдХреНрд╖реЗрдкрдгрдХреЛ рдЬрдЯрд┐рд▓рддрд╛ - рд╣рд╛рдореАрд▓реЗ рдХрдореНрддрд┐рдорд╛ 3 рдЖрджреЗрд╢рд╣рд░реВ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрд╕рдБрдЧ (рдпреЛ рдХреЗрд╡рд▓ 2 рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛ)

рдорд╛рдерд┐рдХрд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдЫрдиреН рдЬрд╕реНрддреИ рдбрдХрд░ рд╕реНрд╡рд╛рд░реНрдо, рдиреЛрдореНрдпрд╛рдб, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рд╡рд╛ рдУрдкрдирд╢рд┐рдлреНрдЯред рдпрджрд┐ рд╕рдореНрдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реА рдЬрд╛рднрд╛рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рд╡рд╕рдиреНрдд рдХреНрд▓рд╛рдЙрдб (рд░рд╛рдореНрд░реЛ рд▓реЗрдЦ).

╨Т рдЕрд░реНрдХреЛ рднрд╛рдЧ рдореИрд▓реЗ Kubernetes рдХрд╕рд░реА рд╕реЗрдЯрдЕрдк рдЧрд░реЗрдВ рд░ Google Kubernetes Engine рдорд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реЗрдВ рднрдиреНрдиреЗ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди