แฐแแ แฐแแแ .
แแ แกแขแแขแแแจแ แแแแแ แแแกแแฃแแ แ แฉแแแก แแแแแชแแแแแแแแ แแแแ แแกแแ แแแกแแแแก แแฅแกแแแ แแแแแขแแแแกแแแแก แกแแกแฌแแแแ แแแ แแแแก แจแแฅแแแแก แจแแกแแฎแแ. แ แแแแกแแช แงแแแแ แแฎแแ แฎแแแกแแฌแงแแก แแกแฌแแแแแแแ, แงแแแแแแแแก แแแแแแแ แแแกแ แแแแแชแแ แแ แ แแฎแแแแ แแแแแแแแ แแ แแแแ แแขแแ, แแ แแแแ แฃแคแ แ แ แแแแแกแขแฃแ แแแ แแแแแจแแช. แแแแขแแ แแแแแแฌแงแแแขแ แจแแแแฅแแแ แแแแแ แขแแแแแฃแแ แแแแ แแกแแ แแแกแแก แแแแแแแชแแ, แ แแแแแแช แจแแแแแแแจแ แจแแแซแแแแ โแแแคแแ แแกโ แงแแแแแแแแ แ แกแแแแขแแ แแกแ แขแแฅแแแแแแแแ. แแ แแแฅแขแแก แแแแแแ แ แแแแฎแแแแแ แแแกแ แแแฅแกแแแแแฃแ แ แคแฃแแฅแชแแแแแแฃแ แ แกแแแฎแแแแ แ แแแแฃแ แกแแกแขแแแแกแแแ.
แแแแแแแแ แแแแแ, แแ แแแแงแแแ แแ แแแฅแขแแก แจแแฅแแแ แ แแแแแแแแ แแขแแแแ:
-
แจแแฅแแแแแ แแ แ แกแแ แแแกแ - 'backend' (backend) แแ 'gateway' (gateway), แฉแแแแแแแ แแกแแแ แแแแแ แแก แกแฃแ แแแแแจแ แแ แแแแงแแแแ แแกแแแ แแ แแแ แแแฃแจแแแ
แกแแแแแแซแ แกแแขแงแแแแ: Java 11, Spring Boot, Docker, แแแแแกแแฎแฃแแแแแก แแแขแแแแแแชแแ
-
แกแแแแแแซแ แกแแขแงแแแแ: Kubernetes, GKE, แ แแกแฃแ แกแแแแก แแแ แแแ, แแแขแแกแแแแแ แแแ, แกแแแแฃแแแแแแแแ
-
แฉแแ แขแแก แจแแฅแแแ Helm 3-แแ แแแแกแขแแ แแก แฃแแแแแกแ แแแ แแแแกแแแแก
แขแแแแแ: Helm 3, แแแแแ แแแแก แแแแแแแแแ
-
แฏแแแแแแกแแก แแ แแแแกแแแแแแก แแแงแแแแแ แแแแกแขแแ แจแ แแแแแก แแแขแแแแขแฃแ แ แแแฌแแแแแแกแแแแก
แกแแแแแแซแ แกแแขแงแแแแ: แฏแแแแแแกแแก แแแแคแแแฃแ แแชแแ, แแแแแแแขแแแ, แแแแคแแแฃแ แแชแแแก แชแแแแแฃแแ แกแแชแแแ
แแแแแ แแ แแแแแแฃแ แแแแแฏแก แชแแแแ แกแขแแขแแ แแแแฃแซแฆแแแ.
แแ แกแขแแขแแแแแก แกแแ แแแก แคแแแฃแกแ แแ แแก แแ แ แแก, แแฃ แ แแแแ แฃแแแ แแแแฌแแ แแ แแแแ แแกแแ แแแกแแแ, แแ แแแแ แ แแแแ แแแแแแฅแขแแฃแ แแ แแกแแแ แแ แ แกแแกแขแแแแจแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแก แงแแแแแคแแ แ, แ แแแแ แช แฌแแกแ, แแแแแแแแแ แแก แแแกแฃแฎแแกแแแแแแแแแก แแแฆแแแ, แแคแแฅแ แแ, แแแแแช แกแแกแแ แแแแแแ แแแแ แแแชแแแแ แแแแแแฃแ 20%-แแ (แ แแช, แ แแแแ แช แแแแแฎแกแแแแแแ, แแซแแแแ แจแแแแแแก 80%-แก). แแแแแแ แแ แฃแแแ แแแแ แแแแจแแแแแแแแแ แแแแ, แ แแแแ แแชแแ แฃแกแแคแ แแฎแแแแ, แแแ แฉแแแ แแ แแ แแแฅแขแแกแแแ, แ แแแแแ แแแขแแ แก แชแแขแ แ แแ แแกแแแก แแแแก แจแแกแแฎแแ, แ แแ แแก แกแแกแขแแแ แจแแฅแแแแแแ แแฎแแแแ แแแ แแแ แกแแ แแแแแแแแกแแแแก. แแแแแกแแแแแแ แแแแแกแแแแ แแแกแแแ แแแแก แแ แแแแกแขแ แฃแฅแชแแฃแ แแ แแขแแแแก.
แแแแ แแกแแ แแแกแแแแก แจแแฅแแแ
แกแแ แแแกแแแ แแแแฌแแ แ Java 11-แจแ Spring Boot-แแก แแแแแงแแแแแแ. แกแแ แแแกแแแจแแ แแกแ แฃแ แแแแ แแฅแแแแแแ แแ แแแแแแแแฃแแแ REST-แแก แแแแแงแแแแแแ. แแ แแแฅแขแ แแแแชแแแก แขแแกแขแแแแก แแแแแแแแฃแ แ แแแแแแแแแก (แแกแ, แ แแ แแแแแแแแแแแ แฏแแแแแแกแจแ แแ แแก แ แแฆแแช แจแแกแแแแฌแแแแแแ). แกแแ แแแกแแแแก แฌแงแแ แแก แแแแ แฎแแแแแกแแฌแแแแแแ GitHub-แแ:
แแแแแแฃแแ แกแแ แแแกแแก แกแขแแขแฃแกแแก แจแแกแแแแฌแแแแแแ, แแแ แแแแแแแแแแฃแแแแแแก แแแแแแขแ Spring Actuator. แแก แจแแฅแแแแก /actuator/health endpoint-แก แแ แแแแแ แฃแแแแก 200 แกแขแแขแฃแกแก, แแฃ แกแแ แแแกแ แแแแ แแ แแก แขแ แแคแแแแก แแแกแแฆแแแแ, แแ 504-แก, แแฃ แแ แแแแแแ แแ แกแแแแแก. แแ แจแแแแฎแแแแแจแ, แแก แกแแแแแแ แคแแฅแขแแฃแ แ แจแแแแฌแแแแแ, แ แแแแแ แกแแ แแแกแแแ แซแแแแแ แแแ แขแแแแ แแ แแแ แแแแฃแแ แคแแ แกแแแแแ แแก แจแแแแฎแแแแแจแ, แฃแคแ แ แกแแแแ แแฃแแแ, แ แแ แแกแแแ แกแ แฃแแแแ แแแฃแฌแแแแแแแ แแแฎแแแแแแ, แแแแ แ แแแฌแแแแแ แแ แคแฃแแฅแชแแแแแ แแแก. แแแแ แแ แ แแแแฃแ แกแแกแขแแแแแจแ Actuator-แก แจแแฃแซแแแ แแแแฎแแแ แแก แแ แแแแแแแก แแแแแแแกแขแแ แแแแจแ, แกแแแแ แแแแฎแแแ แแแแแแ แแแแฌแงแแแแ แแแกแแ แแ แซแแแแก. แแแแแแแแแ, แแฃ แแแแแชแแแแ แแแแแจแ แฌแแแแแแก แแ แแแแแแแ, แฉแแแ แจแแแแแซแแแ แแแขแแแแขแฃแ แแ แแฃแแแกแฃแฎแแ แแแแก แแ แจแแแแฉแแ แแ แแแแฎแแแแแก แแแแฃแจแแแแแ แแแขแแฎแแแ แกแแ แแแกแแก แแแแแแแแแ.
Back end แกแแ แแแกแ
backend แกแแ แแแกแ แฃแแ แแแแ แแแแแแแก แแ แแแแแ แฃแแแแก แแแฆแแแฃแแ แแแแฎแแแแแแแก แ แแแแแแแแแก.
แแแแขแ แแแแ แแก แแแแ:
@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"));
}
}
แกแแ แแแกแแก แแแ แแแญแ
แแแ แแแญแ แแแแแแแแแก แแแแฎแแแแแก backend แกแแ แแแกแจแ, แแแกแแแก แแแก แจแแแแแแ แแแคแแ แแแชแแแ:
- แแแ แแแญแแก 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);
}
}
แแแจแแแแ:
แฉแแแ แแแฌแงแแแ backend-แก:
./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")
แงแแแแแคแแ แ แแฃแจแแแแก. แงแฃแ แแแฆแแแแแแ แแแแแฎแแแแ แจแแแแจแแแแก, แ แแ แแ แแคแแ แ แแแแจแแแก แฎแแแก, แ แแ แแแ แแแแแ แจแแแแแแ แแแฅแแแแแ, แแแ แแแญแแก แแแแ แแแก แแแแแ (
แแกแแแ, แแ แแแ แกแแ แแแกแ แแแแแ แแแก แแ แ แคแแแแฃแ แกแแกแขแแแแก, แแฌแแ แแแแแก แแแแแแแแก แแ แแ แ แแแแแแขแจแ แจแแแซแแแแ แแแแฌแงแแก แแ แแแแแแแจแ แฉแแ แแแ. แแแ แแ แแฅแแแแแแ แฉแแแแ แแแแ แแกแแ แแแกแแแแก แแแแแแ แแแ. แแแแก แแแฆแฌแแแ แจแแกแแซแแแแแแแ แกแฎแแแแแกแฎแแ แแแแ แแขแแแแ แแแแแแแชแแแแแก แแแแแฌแแแแแแ (แแแแ แ แคแฃแแ, แ แแฃแแ), แแแ แขแฃแแแฃแ แ แแแแฅแแแแแแก แแแแแงแแแแแแ (แ แแกแฃแ แกแแ แแแขแแแกแแฃแ แ, แฎแแแแ แซแแแแ แแแจแแแแ) แแ แแแแขแแแแแ แแแแชแแแก แแแแแงแแแแแแ. แ แแแแ แช แแแกแแแแแแแแ แแงแ, แแแ แฉแแแ แแแกแแแ แแแ แแแแขแก แแ
docker
แแแแแแ, แแแแแ แ แฅแแแแก แแแแแแ แแแฃแ แแแแขแแแแแ แแแก, แแแแ แแแแแแแชแแแแ. แแแแแ แแก แแแแแกแแงแแแแแแแ, แแฅแแแ แฃแแแ แแแฌแแ แแ Dockerfile - แแแกแขแ แฃแฅแชแแแแ แแแแแแแชแแแก แจแแฅแแแแกแ แแ แแแจแแแแแกแแแแก. แจแแแแแแ, แจแแแแซแแแแ แจแแฅแแแแ แกแฃแ แแแ, แแขแแแ แแแ แแแ แแแแแกแแฎแฃแแแแแก แ แแแกแขแ แจแ (No.
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) แแ แแแฌแงแแแ build-แก. EXPOSE 8080 แแ แซแแแแแ แกแแแแแแก แแซแแแแก แแแแแ แก, แ แแ แแแแขแแแแแ แจแ แแ แกแแแฃแแ แแแแแแแชแแ แแแแแแงแแแแแก แแแแแก แแแ แขแก 8080 (แแก แแ แแแฎแแแก แแแแแแแชแแแก แแแ แแแแ แฌแแแแแแก, แแแแ แแ แกแแจแฃแแแแแแก แแแกแชแแแก แแแแแแแชแแแก แฌแแแแแ แฐแฅแแแแแก, แแแแแแแแแ, แแแแแ แแแแแ แแก แฅแกแแแแก แกแฎแแ แแแแขแแแแแ แแแแ. ).
แกแแ แแแกแแแแก แแแแแกแแฎแฃแแแแแแแ แจแแคแฃแแแแกแแแแก, แแฅแแแ แฃแแแ แจแแแกแ แฃแแแ แแ แซแแแแแแแ แแแแแแฃแแ แแ แแแฅแขแแก แซแแ แแแแ:
docker image build . -t msvc-backend:1.0.0
แจแแแแแ แแ แแก 456 MB แกแฃแ แแแ (แแฅแแแแ แกแแแแแแกแ JDK แแแแแกแแฎแฃแแแแ 340 MB). แแ แแก แงแแแแแคแแ แ แแแแกแแ แแแฃแฎแแแแแแ, แ แแ แฉแแแแก แแ แแแฅแขแจแ แแแแแแแแแแแ แแแแแ แจแแแซแแแแ แแแแแแแแแก. แฉแแแแ แกแฃแ แแแแก แแแแแก แจแแกแแแชแแ แแแแแ:
- แฉแแแ แแแงแแแแแ แแ แแแแแกแแคแแฎแฃแ แแแ แจแแแ แแแแก. แแแ แแแ แแขแแแแ แฉแแแ แแแแจแแแแแ แแ แแแฅแขแก, แแแแ แ แแขแแแแ แแแแแแแกแขแแแแ แแแ JRE-แก, แฎแแแ แแแกแแแ แแขแแแแ แงแแแแแคแแ แก แแแแแแแแแ แแแ แแฎแแ แกแฃแคแแ แแแแฃแ แกแฃแ แแแจแ. แแแแแแแแแแจแ, แแฎแแแแ แกแแญแแ แ แแแแแแแแแขแแแ แแฅแแแแ แกแแแแแแ แแแแแกแแฎแฃแแแแแจแ.
- แแแแแ แแแแแแแงแแแแ แฏแแแแก แแแแฃแแแ แแแแชแแ. Java 9-แแแ แแแฌแงแแแฃแแ, แจแแแแซแแแแ แแแแแแงแแแแ jlink แแแกแขแ แฃแแแแขแ JRE-แแก แจแแกแแฅแแแแแแ แแฎแแแแ แแฅแแแแแแแก แกแแญแแ แ แแแแฃแแแแแแแ
แชแแแแแกแแแงแแแ แแแแแกแแแแก แแฅ แแ แแก แแแ แแ แกแขแแขแแ แแแแแกแแฎแฃแแแแแก แจแแแชแแ แแแแก แแแแแแแแแแก แจแแกแแฎแแ.
แกแแแแแแ Dockerfile:
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-แจแ แแ แแแแแแแ แกแแ แแแกแแแ
แแแกแแฌแงแแกแแกแแแแก, แฉแแแแ แกแแ แแแกแแแ แฃแแแ แแงแแก แแแแแ แฅแกแแแจแ. แแแแแ แจแ แแ แกแแแแแก แ แแแแแแแแ แขแแแแก แฅแกแแแ แแ แฉแแแ แแแงแแแแแ แแแแแแ แงแแแแแแ แแ แแแแขแแฃแแก - bridge-แก, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแแจแแ แแ แแแแขแแแแแ แแแ, แ แแแแแแแช แแฃแจแแแแแ แแแแแ แฐแแกแขแแ. แจแแฅแแแแแ แฅแกแแแ แจแแแแแแ แแ แซแแแแแแ:
docker network create msvc-network
แจแแแแแแ, แแแแฌแงแแ backend แแแแขแแแแแ แ แกแแฎแแแแ 'backend' microservices-backend:1.0.0 แกแฃแ แแแแ:
docker run -dit --name backend --network msvc-net microservices-backend:1.0.0
แแฆแกแแแแจแแแแแ, แ แแ แฎแแแแก แฅแกแแแ แฃแแ แฃแแแแแงแแคแก แแแแขแแแแแ แแแแก แแฆแแแฉแแแแก แแแแ แกแแฎแแแฌแแแแแแ. แแแฃ, backend แกแแ แแแกแ แฎแแแแแกแแฌแแแแแ แแฅแแแแ แแแแแ แแก แฅแกแแแแก แจแแแแแ
แแแ แแแญแแก แแแฌแงแแแ:
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-แแแ.
แแแฌแงแแแแก แจแแแแแ แแฃแ แแแแแ
แแแกแแแแ
แจแแแแแแ, แฉแแแ แจแแแฅแแแแแ แแ แ แแแ แขแแแ แแแแ แแกแแ แแแกแ, แจแแแคแฃแแแ แแกแแแ แแแแแ แแก แแแแขแแแแแ แแแจแ แแ แแ แแแ แแแแฃแจแแแ แแแแแ แแแแฅแแแแแ. แแแแกแแแ, แแแฆแแแฃแ แกแแกแขแแแแก แแฅแแก แแแแแ แ แแแ แฃแแ แงแแคแแแ แแฎแแ แแแแ:
- แจแแชแแแแแแแก แชแฃแแ แขแแแแ แแแขแแแ - แงแแแแแคแแ แ แแฃแจแแแแก แฉแแแแแแแก แแ แ แกแแ แแแ แแ
- แชแฃแแ แแแกแจแขแแแแ แแแ - แ แแแแกแแช แแแขแแแ แแแ แแแ แแแแ, แแแ แแ แแฅแแแแ, แ แแ แแแขแแแแขแฃแ แแ แแแแแแแแกแแ แแแแแขแแแแแ แกแแ แแแกแแก แแแกแขแแแชแแแแ แแ แแแแแแแแแกแแ แแแขแแแ แแแ แแแ แจแแ แแก
- แแแจแแแแแก แกแแ แแฃแแ - แแแแแญแแ แแ แแแแแแฃแ 3 แแ แซแแแแแแก แจแแงแแแแ แแ แแแ แแแแฃแแ แแแ แแแแขแ แแแแ (แแก แแ แแก แแฎแแแแ 2 แกแแ แแแกแแกแแแแก)
แแแแแแฆแแแจแแฃแแ แแ แแแแแแแแแก แแแแแกแแญแ แแแแ, แแ แกแแแแแก แแแแแ แ แแแ แแแแแฌแงแแแขแแแแแแแ, แ แแแแ แแชแแ Docker Swarm, Nomad, Kubernetes แแ OpenShift. แแฃ แแแแแ แกแแกแขแแแ Java-แแแ แแแฌแแ แแแ, แจแแแแซแแแแ แแแแฎแแแแ Spring Cloud-แแกแแแ (
ะ
แฌแงแแ แ: www.habr.com