НаучСтС ΠΊΠ°ΠΊ Π΄Π° внСдряватС микроуслуги. Част 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 Π·Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈ

    Π•Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ: Helm 3, внСдряванС Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°

  4. НастройванС Π½Π° ДТСнкинс ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ доставянС Π½Π° ΠΊΠΎΠ΄ към ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°

    ΠšΠ»ΡŽΡ‡ΠΎΠ²ΠΈ Π΄ΡƒΠΌΠΈ: Jenkins конфигурация, плъгини, ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Бмятам Π΄Π° посвСтя ΠΎΡ‚Π΄Π΅Π»Π½Π° статия Π½Π° всяка ΡΡ‚ΡŠΠΏΠΊΠ°.

Π€ΠΎΠΊΡƒΡΡŠΡ‚ Π½Π° Ρ‚Π°Π·ΠΈ сСрия ΠΎΡ‚ статии Π½Π΅ Π΅ ΠΊΠ°ΠΊ Π΄Π° напишСм микроуслуги, Π° ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ Π½Π°ΠΊΠ°Ρ€Π°ΠΌΠ΅ Π΄Π° работят Π² Π΅Π΄Π½Π° систСма. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ всички Ρ‚Π΅Π·ΠΈ Π½Π΅Ρ‰Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ са извън отговорността Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, мисля, Ρ‡Π΅ всС ΠΏΠ°ΠΊ Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° стС Π·Π°ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ с тях ΠΏΠΎΠ½Π΅ 20% (ΠΊΠΎΠ΅Ρ‚ΠΎ, ΠΊΠ°ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚Π΅, Π΄Π°Π²Π° 80% ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°). Някои бСзусловно Π²Π°ΠΆΠ½ΠΈ Ρ‚Π΅ΠΌΠΈ, ΠΊΠ°Ρ‚ΠΎ сигурността, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ оставСни извън Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π°Π²Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ€Π°Π·Π±ΠΈΡ€Π° ΠΌΠ°Π»ΠΊΠΎ Π·Π° Ρ‚Π°Π·ΠΈ систСма, създадСна СдинствСно Π·Π° Π»ΠΈΡ‡Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. ΠŸΡ€ΠΈΠ΅ΠΌΠ°ΠΌ всякакви мнСния ΠΈ Π³Ρ€Π°Π΄ΠΈΠ²Π½Π° ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ°.

БъздаванС Π½Π° микроуслуги

УслугитС са написани Π½Π° Java 11 с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Spring Boot. ΠœΠ΅ΠΆΠ΄ΡƒΡΠ΅Ρ€Π²ΠΈΠ·Π½ΠΎΡ‚ΠΎ взаимодСйствиС сС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° REST. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ Ρ‰Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π±Ρ€ΠΎΠΉ тСстовС (Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΠΎ-късно Π΄Π° ΠΈΠΌΠ° ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° сС тСства Π² Jenkins). Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈΡΡ‚ ΠΊΠΎΠ΄ Π·Π° услугитС Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π½Π° GitHub: Π±Π΅ΠΊΠ΅Π½Π΄ ΠΈ Gateway.

Π—Π° Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° провСряватС статуса Π½Π° всяка ΠΎΡ‚ услугитС, към Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ зависимости Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Spring Actuator. Π’ΠΎΠΉ Ρ‰Π΅ създадС ΠΊΡ€Π°ΠΉΠ½Π° Ρ‚ΠΎΡ‡ΠΊΠ° /actuator/health ΠΈ Ρ‰Π΅ Π²ΡŠΡ€Π½Π΅ статус 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"));
    }
}

Π‘Π΅Ρ€Π²ΠΈΠ·Π΅Π½ шлюз

Π¨Π»ΡŽΠ·ΡŠΡ‚ Ρ‰Π΅ ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΈ заявката към Π±Π΅ΠΊΠ΅Π½Π΄ услугата, допълвайки я със слСдната информация:

  • ID Π½Π° шлюза. Π’ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° Π΅ възмоТно Π΄Π° сС Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡ΠΈ Π΅Π΄Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° шлюза ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎ Ρ‡Ρ€Π΅Π· ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°
  • Някаква "Ρ‚Π°ΠΉΠ½Π°", която Ρ‰Π΅ ΠΈΠ³Ρ€Π°Π΅ ролята Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Π° ΠΏΠ°Ρ€ΠΎΠ»Π° (Π½ΠΎΠΌΠ΅Ρ€ Π½Π° ΠΊΠ»ΡŽΡ‡Π° Π·Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Π²Π°ΠΆΠ½Π° бисквитка)

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π² application.properties:

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

Backend Π°Π΄Π°ΠΏΡ‚Π΅Ρ€:

@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 - инструкции Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ стартиранС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π΄Π° Π³ΠΎ ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° изобраТСнията (No. Dockerhub) ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚Π΅ Π²Π°ΡˆΠ°Ρ‚Π° микроуслуга във всяка Π΄ΠΎΠΊΠ΅Ρ€ΠΈΠ·ΠΈΡ€Π°Π½Π° срСда с Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.

Π”ΠΎΠΊΠ΅Ρ€ Ρ„Π°ΠΉΠ»

Π•Π΄Π½Π° ΠΎΡ‚ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ характСристики Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ нСговият Ρ€Π°Π·ΠΌΠ΅Ρ€. ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ сС изтСгля ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ ΠΎΡ‚ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Ρ‰Π΅ Π·Π°Π΅ΠΌΠ° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ място ΠΈ услугата Π²ΠΈ Ρ‰Π΅ стартира ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ. Всяко ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° основното ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ сС ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π° Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π½Π°ΠΉ-минималистичния Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π”ΠΎΠ±ΡŠΡ€ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅ 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"]

Π’ΡƒΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° Alpine Π±Π°Π·ΠΎΠ²ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с Π²Π΅Ρ‡Π΅ инсталиран JDK, Π·Π° Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π‘ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ADD добавямС Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° src дирСктория към ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°ΠΌΠ΅ я ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° (WORKDIR) ΠΈ Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ. ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° EXPOSE 8080 сигнализира Π½Π° Π΄ΠΎΠΊΠ΅Ρ€Π°, Ρ‡Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° своя ΠΏΠΎΡ€Ρ‚ 8080 (Ρ‚ΠΎΠ²Π° няма Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΎ ΠΎΡ‚Π²ΡŠΠ½, Π½ΠΎ Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² ΡΡŠΡ‰Π°Ρ‚Π° Π΄ΠΎΠΊΠ΅Ρ€ ΠΌΡ€Π΅ΠΆΠ° ).

Π—Π° Π΄Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Ρ‚Π΅ услуги Π² изобраТСния, трябва Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΎΡ‚ ΠΊΠΎΡ€Π΅Π½Π° Π½Π° всСки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

docker image build . -t msvc-backend:1.0.0

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ 456 MB ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΡ‚ΠΎ JDK ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π΅ΠΌΠ° 340 MB). И всичко Ρ‚ΠΎΠ²Π° Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ класовСтС Π² нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС прСброят Π½Π° ΠΏΡ€ΡŠΡΡ‚. Π—Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

  • ИзползвамС ΠΌΠ½ΠΎΠ³ΠΎΠ΅Ρ‚Π°ΠΏΠ½ΠΎ сглобяванС. Π’ ΠΏΡŠΡ€Π²Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Ρ‰Π΅ ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, във Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Ρ‰Π΅ инсталирамС JRE, Π° Π² Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Ρ‰Π΅ Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ всичко Π² Π½ΠΎΠ² чист ΠΎΠ±Ρ€Π°Π· Π½Π° Alpine. ΠšΠ°Ρ‚ΠΎ цяло само Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π² ΠΊΡ€Π°ΠΉΠ½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.
  • НСка ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° 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

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° стартирайтС Π±Π΅ΠΊΠ΅Π½Π΄ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с ΠΈΠΌΠ΅ β€žbackendβ€œ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ 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, Π·Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата, ΠΊΠΎΠΈΡ‚ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Π½ΠΈ ΠΎΡ‚ spring ΠΈ Π΄Π° замСнят свойствата ΠΎΡ‚ application.properties.

Π‘Π»Π΅Π΄ стартиранС сС ΠΎΠ±Π°ΠΆΠ΄Π°ΠΌΠ΅ http://localhost/ ΠΈ сС ΡƒΠ²Π΅Ρ€Π΅Ρ‚Π΅, Ρ‡Π΅ всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ случай.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ Π΄Π²Π΅ прости микроуслуги, ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Ρ…ΠΌΠ΅ Π³ΠΈ Π² Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΈ Π³ΠΈ стартирахмС Π·Π°Π΅Π΄Π½ΠΎ Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° машина. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° систСма ΠΎΠ±Π°Ρ‡Π΅ ΠΈΠΌΠ° Ρ€Π΅Π΄ΠΈΡ†Π° Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ:

  • Π›ΠΎΡˆΠ° толСрантност към Π³Ρ€Π΅ΡˆΠΊΠΈ - всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ Π·Π° нас Π½Π° Π΅Π΄ΠΈΠ½ ΡΡŠΡ€Π²ΡŠΡ€
  • Π›ΠΎΡˆΠ° мащабируСмост - ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ сС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ, Π±ΠΈ Π±ΠΈΠ»ΠΎ Ρ…ΡƒΠ±Π°Π²ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π° сС Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ°Ρ‚ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ СкзСмпляри Π½Π° услугата ΠΈ Π΄Π° сС балансира Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ тях
  • БлоТността Π½Π° стартиранСто - Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° въвСдСм ΠΏΠΎΠ½Π΅ 3 ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ (Ρ‚ΠΎΠ²Π° Π΅ само Π·Π° 2 услуги)

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

Π’ слСдващата част Π©Π΅ говоря Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ настроих Kubernetes ΠΈ Π²Π½Π΅Π΄Ρ€ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Google Kubernetes Engine.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€