рдорд╛рдпрдХреНрд░реЛ рд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕ рдХрд╕реЗ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╢рд┐рдХрд╛. рднрд╛рдЧ 1. рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЖрдгрд┐ рдбреЙрдХрд░

рдорд╛рдпрдХреНрд░реЛ рд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕ рдХрд╕реЗ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рд╛рдпрдЪреЗ рддреЗ рд╢рд┐рдХрд╛. рднрд╛рдЧ 1. рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЖрдгрд┐ рдбреЙрдХрд░

рдЕрд╣реЛ рд╣рдмреНрд░.

рдпрд╛ рд▓реЗрдЦрд╛рдд, рдореА рдорд╛рдпрдХреНрд░реЛ рд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕рд╕рд╣ рдкреНрд░рдпреЛрдЧ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╢рд┐рдХрдгреНрдпрд╛рдЪреЗ рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдорд╛рдЭреНрдпрд╛ рдЕрдиреБрднрд╡рд╛рдмрджреНрджрд▓ рдмреЛрд▓реВ рдЗрдЪреНрдЫрд┐рддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдореА рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди рд╕рд╛рдзрди рд╢рд┐рдХрд▓реЛ рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рддреЗ рдХреЗрд╡рд│ рд╕реНрдерд╛рдирд┐рдХ рдорд╢реАрдирд╡рд░рдЪ рдирд╡реНрд╣реЗ рддрд░ рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд╡рд╛рджреА рдкрд░рд┐рд╕реНрдерд┐рддреАрддрд╣реА рд╡рд╛рдкрд░реВрди рдкрд╣рд╛рдпрдЪреЗ рд╣реЛрддреЗ. рдореНрд╣рдгреВрди, рдореА рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдорд╛рдпрдХреНрд░реЛрд╕рд░реНрд╡реНрд╣рд┐рд╕ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛, рдЬреЛ рдирдВрддрд░ рд╕рд░реНрд╡ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдордиреЛрд░рдВрдЬрдХ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рд╕рд╣ "рдХрд╡реНрд╣рд░" рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдкреНрд░рдХрд▓реНрдкрд╛рдЪреА рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реАрдЪреА рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдореАрдкрддрд╛ рдЖрд╣реЗ.

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

  1. рджреЛрди рд╕реЗрд╡рд╛ рддрдпрд╛рд░ рдХрд░рд╛ - 'рдмреЕрдХрдПрдВрдб' (рдмреЕрдХрдПрдВрдб) рдЖрдгрд┐ 'рдЧреЗрдЯрд╡реЗ' (рдЧреЗрдЯрд╡реЗ), рддреНрдпрд╛рдВрдирд╛ рдбреЙрдХрд░ рдкреНрд░рддрд┐рдорд╛рдВрдордзреНрдпреЗ рдкреЕрдХ рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдПрдХрддреНрд░ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЗрдЯ рдХрд░рд╛

    рдХреАрд╡рд░реНрдб: Java 11, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ, рдбреЙрдХрд░, рдЗрдореЗрдЬ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди

  2. Google Kubernetes Engine рдордзреНрдпреЗ Kubernetes рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯреАрдо рдЙрдкрдпреЛрдЬрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреЗ

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

  3. рдЙрддреНрддрдо рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдирд╛рд╕рд╛рдареА Helm 3 рд╕рд╣ рдЪрд╛рд░реНрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ

    рдЯреЕрдЧреНрдЬ: рд╣реЗрд▓реНрдо 3, рдЪрд╛рд░реНрдЯ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ

  4. рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛ рдХреЛрдбрдЪреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд╡рд┐рддрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬреЗрдирдХрд┐рдиреНрд╕ рдЖрдгрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗрдЯ рдХрд░рдгреЗ

    рдХреАрд╡рд░реНрдб: рдЬреЗрдирдХрд┐рдиреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди, рдкреНрд▓рдЧрдЗрдиреНрд╕, рд╕реНрд╡рддрдВрддреНрд░ рдХреЙрдиреНрдлрд┐рдЧреНрд╕ рд░реЗрдкреЙрдЬрд┐рдЯрд░реА

рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд░реАрд╡рд░ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдЦ рджреЗрдгреНрдпрд╛рдЪреА рдорд╛рдЭреА рдпреЛрдЬрдирд╛ рдЖрд╣реЗ.

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

рдорд╛рдпрдХреНрд░реЛ рд╕рд░реНрд╡реНрд╣рд┐рд╕реЗрд╕ рддрдпрд╛рд░ рдХрд░рдгреЗ

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

рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡реЗрдЪреА рд╕реНрдерд┐рддреА рддрдкрд╛рд╕рдгреНрдпрд╛рдд рд╕рдХреНрд╖рдо рд╣реЛрдгреНрдпрд╛рд╕рд╛рдареА, рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЕрд╡рд▓рдВрдмрдирд╛рдВрдордзреНрдпреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЕреЕрдХреНрдЯреНрдпреБрдПрдЯрд░ рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ. рддреЗ /рдЕреЕрдХреНрдЯреНрдпреБрдПрдЯрд░/рд╣реЗрд▓реНрде рдПрдВрдбрдкреЙрдЗрдВрдЯ рддрдпрд╛рд░ рдХрд░реЗрд▓ рдЖрдгрд┐ рд╕реЗрд╡рд╛ рдЯреНрд░реЕрдлрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдЕрд╕рд▓реНрдпрд╛рд╕ 200 рд╕реНрдерд┐рддреА рджреЗрдИрд▓ рдХрд┐рдВрд╡рд╛ рд╕рдорд╕реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕ 504 рджреЗрдИрд▓. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рд╣реА рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рддрдкрд╛рд╕рдгреА рдЖрд╣реЗ, рдХрд╛рд░рдг рд╕реЗрд╡рд╛ рдЕрдЧрджреА рд╕реЛрдкреНрдпрд╛ рдЖрд╣реЗрдд рдЖрдгрд┐ рдХрд╛рд╣реА рд╕рдХреНрддреАрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рддреЗ рдЕрдВрд╢рддрдГ рдХрд╛рд░реНрдпрд░рдд рд░рд╛рд╣рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдкреВрд░реНрдгрдкрдгреЗ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЬрд╛рд╕реНрдд рдЕрд╕рддреЗ. рдкрд░рдВрддреБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реАрдВрдордзреНрдпреЗ, рд╡рд╛рдкрд░рдХрд░реНрддреЗ рддреНрдпрд╛рдмрджреНрджрд▓ рд▓рдврд╛ рджреЗрдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЕреЕрдХреНрдЯреНрдпреБрдПрдЯрд░ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рджрд╛рди рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реВ рд╢рдХрддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдд рд╕рдорд╕реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рддреБрдЯрд▓реЗрд▓реНрдпрд╛ рд╕реЗрд╡реЗрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╣ рд╡рд┐рдирдВрддреАрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдерд╛рдВрдмрд╡реВрди рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдК рд╢рдХрддреЛ.

рдмреЕрдХ рдПрдВрдб рд╕реЗрд╡рд╛

рдмреЕрдХрдПрдВрдб рд╕реЗрд╡рд╛ рд╕реНрд╡реАрдХрд╛рд░рд▓реЗрд▓реНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдореЛрдЬреЗрд▓ рдЖрдгрд┐ рдкрд░рдд рдХрд░реЗрд▓.

рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб:

@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 рдЪреЗ modularization рд╡рд╛рдкрд░реВ. 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 рдПрдордмреА. рд╡рд╛рдИрдЯ рдирд╛рд╣реА. рддреНрдпрд╛рдирдВрддрд░, рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рдорд╛ рдЗрдореЗрдЬ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрдордзреНрдпреЗ рдЕрдкрд▓реЛрдб рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЬреЗрдгреЗрдХрд░реВрди рддреБрдордЪреНрдпрд╛ рдкреНрд░рддрд┐рдорд╛ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░реВрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЕрд╕рддреАрд▓.

рдбреЙрдХрд░рдордзреНрдпреЗ рд╕рд╣-рдЪрд╛рд▓рд╡рдгрд╛рд▒реНрдпрд╛ рд╕реЗрд╡рд╛

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

docker network create msvc-network

рдкреБрдвреЗ, microservices-backend:1.0.0 image рд╕рд╣ 'рдмреЕрдХрдПрдВрдб' рдирд╛рд╡рд╛рдЪрд╛ рдмреЕрдХрдПрдВрдб рдХрдВрдЯреЗрдирд░ рд╕реБрд░реВ рдХрд░рд╛:

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 рд╕реЗрд╡рд╛рдВрд╕рд╛рдареА рдЖрд╣реЗ)

рд╡рд░реАрд▓ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдбреЙрдХрд░ рд╕реНрд╡реЙрд░реНрдо, рдиреЛрдореЕрдб, рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХрд┐рдВрд╡рд╛ рдУрдкрдирд╢рд┐рдлреНрдЯ рд╕рд╛рд░рдЦреЗ рдЕрдиреЗрдХ рдЙрдкрд╛рдп рдЖрд╣реЗрдд. рдЬрд░ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдгрд╛рд▓реА Java рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣реА рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдбрдХрдбреЗ рдкрд╛рд╣реВ рд╢рдХрддрд╛ (рдЪрд╛рдВрдЧрд▓рд╛ рд▓реЗрдЦ).

╨Т рдкреБрдвреАрд▓ рднрд╛рдЧ рдореА Kubernetes рдХрд╕реЗ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрдгрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ Google Kubernetes Engine рд╡рд░ рдХрд╕рд╛ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдпрд╛рдмрджреНрджрд▓ рдореА рдмреЛрд▓реЗрди.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛