НаучСтС ΠΊΠ°ΠΊΠΎ Π΄Π° распорСдитС микросСрвис. Π”Π΅Π» 1. Spring Boot ΠΈ Docker

НаучСтС ΠΊΠ°ΠΊΠΎ Π΄Π° распорСдитС микросСрвис. Π”Π΅Π» 1. Spring Boot ΠΈ Docker

Π•Ρ˜ Π₯Π°Π±Ρ€.

Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, сакам Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌ Π·Π° ΠΌΠΎΠ΅Ρ‚ΠΎ искуство Π·Π° создавањС срСдина Π·Π° ΡƒΡ‡Π΅ΡšΠ΅ Π·Π° Π΅ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΡšΠ΅ со микросСрвиси. Кога ја ΡƒΡ‡Π΅Π² сСкоја Π½ΠΎΠ²Π° Π°Π»Π°Ρ‚ΠΊΠ°, сСкогаш сакав Π΄Π° ја ΠΏΡ€ΠΎΠ±Π°ΠΌ Π½Π΅ само Π½Π° ΠΌΠΎΡ˜Π°Ρ‚Π° Π»ΠΎΠΊΠ°Π»Π½Π° машина, Ρ‚ΡƒΠΊΡƒ ΠΈ Π²ΠΎ ΠΏΠΎΡ€Π΅Π°Π»Π½ΠΈ услови. Π—Π°Ρ‚ΠΎΠ°, Ρ€Π΅ΡˆΠΈΠ² Π΄Π° создадам поСдноставСна Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° микросСрвис, која ΠΏΠΎΠ΄ΠΎΡ†Π½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС β€žΠ·Π°ΠΊΠ°Ρ‡ΠΈβ€œ со сСкакви интСрСсни Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. Π“Π»Π°Π²Π½ΠΈΠΎΡ‚ услов Π·Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π΅ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° максимална Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π° Π±Π»ΠΈΠ·ΠΈΠ½Π° Π½Π° Ρ€Π΅Π°Π»Π½ΠΈΠΎΡ‚ систСм.

ΠŸΡ€Π²ΠΈΡ‡Π½ΠΎ, Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΠ² ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π²ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Ρ‡Π΅ΠΊΠΎΡ€ΠΈ:

  1. Π‘ΠΎΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ Π΄Π²Π΅ услуги - 'backend' ΠΈ 'gateway', ΡΠΏΠ°ΠΊΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π³ΠΈ Π²ΠΎ Π΄ΠΎΠΊΠ΅Ρ€ слики ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ

    ΠšΠ»ΡƒΡ‡Π½ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ: Java 11, Spring Boot, Docker, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π½Π° слики

  2. Развој Π½Π° систСмот Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΈ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Kubernetes Π²ΠΎ Google Kubernetes Engine

    ΠšΠ»ΡƒΡ‡Π½ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ: Kubernetes, GKE, ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со рСсурси, автоматско ΡΠΊΠ°Π»ΠΈΡ€Π°ΡšΠ΅, Ρ‚Π°Ρ˜Π½ΠΈ

  3. НаправСтС Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Helm 3 Π·Π° поСфикасно ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со кластСритС

    ΠšΠ»ΡƒΡ‡Π½ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ: ΠΊΠΎΡ€ΠΌΠΈΠ»Π° 3, Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈ

  4. ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Jenkins ΠΈ pipeline Π·Π° автоматско Π΄ΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π΄ΠΎ кластСрот

    ΠšΠ»ΡƒΡ‡Π½ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ: ЏСнкинс ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°, ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΡ†ΠΈ, посСбно ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

ΠŸΠ»Π°Π½ΠΈΡ€Π°ΠΌ Π΄Π° посвСтам посСбна ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π½Π° сСкој Ρ‡Π΅ΠΊΠΎΡ€.

Ѐокусот Π½Π° ΠΎΠ²Π°Π° ΡΠ΅Ρ€ΠΈΡ˜Π° написи Π½Π΅ Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° сС Π½Π°ΠΏΠΈΡˆΠ°Ρ‚ микросСрвиситС, Ρ‚ΡƒΠΊΡƒ ΠΊΠ°ΠΊΠΎ Π΄Π° сС Π½Π°Ρ‚Π΅Ρ€Π°Π°Ρ‚ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π²ΠΎ Π΅Π΄Π΅Π½ СдинствСн систСм. Иако ситС ΠΎΠ²ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ одговорноста Π½Π° Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΎΡ‚, мислам Π΄Π΅ΠΊΠ° сСпак Π΅ корисно Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π°Ρ‚ Π±Π°Ρ€Π΅ΠΌ 20% со Π½ΠΈΠ² (ΡˆΡ‚ΠΎ Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎ Π΄Π΅ΠΊΠ° сочинува 80% ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚). НСкои апсолутно Π²Π°ΠΆΠ½ΠΈ Ρ‚Π΅ΠΌΠΈ, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ бСзбСдноста, ќС Π±ΠΈΠ΄Π°Ρ‚ изоставСни ΠΎΠ΄ овој ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, бидСјќи Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚ ΠΌΠ°Π»ΠΊΡƒ Ρ€Π°Π·Π±ΠΈΡ€Π° Π·Π° ΠΎΠ²Π°; систСмот сС создава исклучиво Π·Π° Π»ΠΈΡ‡Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. Π“ΠΎ ΠΏΠΎΠ·Π΄Ρ€Π°Π²ΡƒΠ²Π°ΠΌ сСкоС мислСњС ΠΈ конструктивна ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ°.

БоздавањС микросСрвис

УслугитС Π±Π΅Π° напишани Π²ΠΎ Java 11 ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Spring Boot. ΠšΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΌΠ΅Ρ“Ρƒ услугитС сС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π° со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° REST. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ ќС Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π±Ρ€ΠΎΡ˜ Π½Π° тСстови (Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΏΠΎΠ΄ΠΎΡ†Π½Π° ќС ΠΈΠΌΠ° ΡˆΡ‚ΠΎ Π΄Π° сС тСстира Π²ΠΎ ЏСнкинс). Π˜Π·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° услугитС Π΅ достапСн Π½Π° GitHub: Π·Π°Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π» ΠΈ ΠŸΠΎΡ€Ρ‚Π°.

Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° Π½Π° сСкоја ΠΎΠ΄ услугитС, Π½Π° Π½ΠΈΠ²Π½Π°Ρ‚Π° зависност бСшС Π΄ΠΎΠ΄Π°Π΄Π΅Π½ Spring Actuator. ЌС создадС ΠΊΡ€Π°Ρ˜Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° /Π°ΠΊΡ‚ΠΈΠ²Π°Ρ‚ΠΎΡ€/Π·Π΄Ρ€Π°Π²Ρ˜Π΅ ΠΈ ќС Π²Ρ€Π°Ρ‚ΠΈ статус ΠΎΠ΄ 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). Π—Π° Π΄Π° сС ΠΏΠΎΠΏΡ€Π°Π²ΠΈ ΠΎΠ²Π°, услугитС ΠΌΠΎΡ€Π° Π΄Π° сС ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ Π²ΠΎ Π΅Π΄Π½Π° ΠΌΡ€Π΅ΠΆΠ°, Π° само ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° β€žΠΈΠ·Π»Π΅Π·Π΅β€œ Π½Π°Π΄Π²ΠΎΡ€.
Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΈ Π΄Π²Π΅Ρ‚Π΅ услуги Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ истиот Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π΅Π½ систСм, Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π°Ρ‚ нишки ΠΈ Π²ΠΎ Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΡ‡Π½Π°Ρ‚ Π΄Π° сС ΠΌΠ΅ΡˆΠ°Π°Ρ‚ Π΅Π΄Π½ΠΈ со Π΄Ρ€ΡƒΠ³ΠΈ. Π‘ΠΈ Π±ΠΈΠ»ΠΎ ΡƒΠ±Π°Π²ΠΎ Π΄Π° Π³ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°ΠΌΠ΅ Π½Π°ΡˆΠΈΡ‚Π΅ микросСрвиси. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° сС постигнС со Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ машини (ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠ°Ρ€ΠΈ, Ρ‚Π΅ΡˆΠΊΠΎ), со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини (ΠΈΠ½Ρ‚Π΅Π½Π·ΠΈΠ²Π½ΠΈ рСсурси, Π΄ΠΎΠ»Π³ΠΎ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅) ΠΈΠ»ΠΈ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°. ΠžΡ‡Π΅ΠΊΡƒΠ²Π°Π½ΠΎ, ја ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° ΠΎΠΏΡ†ΠΈΡ˜Π° ΠΈ ΠΏΡ€ΠΈΡΡ‚Π°Π½ΠΈΡˆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ ΠΊΠ°ΠΊΠΎ Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°.

ΠΏΡ€ΠΈΡΡ‚Π°Π½ΠΈΡˆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ

Накратко, Docker создава ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½ΠΈ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ, ΠΏΠΎ Π΅Π΄Π΅Π½ ΠΏΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. Π—Π° Π΄Π° Π³ΠΎ користитС Docker, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Dockerfile - инструкции Π·Π° Π³Ρ€Π°Π΄Π΅ΡšΠ΅ ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π‘Π»Π΅Π΄Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ сликата, Π΄Π° ја поставитС Π²ΠΎ рСгистарот Π½Π° слики (Π±Ρ€. Π”ΠΎΠΊΠ΅Ρ€Π₯Π°Π±) ΠΈ распорСдСтС Π³ΠΎ Π²Π°ΡˆΠΈΠΎΡ‚ микросСрвис Π²ΠΎ која Π±ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡Π΅Π½Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π° со Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.

dockerfile

Π•Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ карактСристики Π½Π° сликата Π΅ Π½Π΅Ρ˜Π·ΠΈΠ½Π°Ρ‚Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°. ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π°Ρ‚Π° слика ќС сС ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅ ΠΏΠΎΠ±Ρ€Π·ΠΎ ΠΎΠ΄ далСчинското ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅, ќС Π·Π°Π·Π΅ΠΌΠ° ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ простор ΠΈ Π²Π°ΡˆΠ°Ρ‚Π° услуга ќС Π·Π°ΠΏΠΎΡ‡Π½Π΅ ΠΏΠΎΠ±Ρ€Π·ΠΎ. БСкоја слика Π΅ ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½Π° Π²Ρ€Π· основа Π½Π° основна слика ΠΈ сС ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π° Π΄Π° сС ΠΈΠ·Π±Π΅Ρ€Π΅ Π½Π°Ρ˜ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ‚ΠΈΡ‡ΠΊΠ°Ρ‚Π° ΠΎΠΏΡ†ΠΈΡ˜Π°. Π”ΠΎΠ±Ρ€Π° ΠΎΠΏΡ†ΠΈΡ˜Π° Π΅ Alpine, ΠΏΠΎΠ»Π½ΠΎΠΏΡ€Π°Π²Π½Π° Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π° Π½Π° Linux со ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.

ΠŸΡ€Π²ΠΎ, Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° напишСмС Dockerfile β€žΠ³Π»Π°Π²Π½ΠΎβ€œ (вСднаш ќС ΠΊΠ°ΠΆΠ°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π΅ лош Π½Π°Ρ‡ΠΈΠ½, Π½Π΅ Π³ΠΎ ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Ρ‚ΠΎΠ°):

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 ΠΌΠΎΠ΄ΡƒΠ»Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°. ΠŸΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ со Java 9, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја користитС Π°Π»Π°Ρ‚ΠΊΠ°Ρ‚Π° jlink Π·Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ JRE само ΠΎΠ΄ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Π²ΠΈ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ

Π—Π° Ρ™ΡƒΠ±ΠΎΠΏΠΈΡ‚Π½ΠΈΡ‚Π΅, Π΅Π²Π΅ Π΄ΠΎΠ±Ρ€Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π·Π° пристапитС Π·Π° Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° сликитС https://habr.com/ru/company/ruvds/blog/485650/.

ΠšΠΎΠ½Π΅Ρ‡Π½Π° Docker-Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°:

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

Π—Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ, Π½Π°ΡˆΠΈΡ‚Π΅ услуги ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ Π½Π° истата ΠΌΡ€Π΅ΠΆΠ°. ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ²ΠΈ Π½Π° ΠΌΡ€Π΅ΠΆΠΈ Π²ΠΎ Docker, Π° Π½ΠΈΠ΅ Π³ΠΈ користимС Π½Π°Ρ˜ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ ΠΎΠ΄ Π½ΠΈΠ² - bridge, кој Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° Π³ΠΈ Π²ΠΌΡ€Π΅ΠΆΡƒΠ²Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π½Π° истиот хост. АјдС Π΄Π° создадСмС ΠΌΡ€Π΅ΠΆΠ° со слСднава ΠΊΠΎΠΌΠ°Π½Π΄Π°:

docker network create msvc-network

Π‘Π»Π΅Π΄Π½ΠΎ, ајдС Π΄Π° лансирамС ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ Π·Π° Π·Π°Π΄Π½ΠΈΠ½Π° Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° β€žΠ·Π°Π΄Π½ΠΈΠ½Π°β€œ со сликата microservices-backend:1.0.0:

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

Π’Ρ€Π΅Π΄ΠΈ Π΄Π° сС Π½Π°ΠΏΠΎΠΌΠ΅Π½Π΅ Π΄Π΅ΠΊΠ° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π½Π° мостот ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° услуга ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ ΠΊΡƒΡ‚ΠΈΡ˜Π°Ρ‚Π° Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈ со Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ имиња. Односно, услугата Π·Π° Π·Π°Π΄Π½ΠΈΠ½Π° ќС Π±ΠΈΠ΄Π΅ достапна Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Docker Π½Π° 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 услуги)

Π—Π° Π΄Π° сС Ρ€Π΅ΡˆΠ°Ρ‚ Π³ΠΎΡ€Π΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ˜Π° ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС Docker Swarm, Nomad, Kubernetes ΠΈΠ»ΠΈ OpenShift. Ако Ρ†Π΅Π»ΠΈΠΎΡ‚ систСм Π΅ напишан Π²ΠΎ Java, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΊΠΎΠ½ Spring Cloud (Π΄ΠΎΠ±Ρ€Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°).

Π’ слСдниот Π΄Π΅Π» ЌС Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π³ΠΎ поставив Kubernetes ΠΈ Π³ΠΎ распорСдив ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ Π½Π° Google Kubernetes Engine.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€