ãããããã«ã
ãã®èšäºã§ã¯ããã€ã¯ããµãŒãã¹ãå®éšããããã®åŠç¿ç°å¢ãäœæããç§ã®çµéšã«ã€ããŠè©±ããããšæããŸãã æ°ããããŒã«ãåŠã¶ãã³ã«ãããŒã«ã« ãã·ã³ã ãã§ãªããããçŸå®çãªæ¡ä»¶ã§ãè©ŠããŠã¿ãããšåžžã«æã£ãŠããŸããã ãããã£ãŠãç§ã¯ãåŸã§ããããçš®é¡ã®èå³æ·±ããã¯ãããžã§ãã«ããŒãã§ãããç°¡çŽ åããããã€ã¯ããµãŒãã¹ ã¢ããªã±ãŒã·ã§ã³ãäœæããããšã«ããŸããã ãã®ãããžã§ã¯ãã®äž»ãªèŠä»¶ã¯ãå®éã®ã·ã¹ãã ã«æ倧éã®æ©èœçè¿æ¥æ§ãæãããããšã§ãã
æåã«ããããžã§ã¯ãã®äœæãããã€ãã®ã¹ãããã«åããŸããã
-
XNUMX ã€ã®ãµãŒãã¹ - ãbackendã (ããã¯ãšã³ã) ãšãgatewayã (ã²ãŒããŠã§ã€) ãäœæãããããã Docker ã€ã¡ãŒãžã«ããã¯ããŠãé£æºããŠåäœããããã«èšå®ããŸãã
ããŒã¯ãŒã: Java 11ãSpring BootãDockerãã€ã¡ãŒãžã®æé©å
-
Google Kubernetes Engine ã§ã® Kubernetes æ§æã®éçºãšã·ã¹ãã ã®ãããã€ã¡ã³ã ããŒã¯ãŒã: KubernetesãGKEããªãœãŒã¹ç®¡çãèªåã¹ã±ãŒãªã³ã°ãã·ãŒã¯ã¬ãã
-
Helm 3 ã§ãã£ãŒããäœæããŠã¯ã©ã¹ã¿ãŒç®¡çãæ¹åãã
ã¿ã°: Helm 3ããã£ãŒãã®å±é
-
ã³ãŒããã¯ã©ã¹ã¿ãŒã«èªåé ä¿¡ããããã® Jenkins ãšãã€ãã©ã€ã³ã®ã»ããã¢ãã
ããŒã¯ãŒã: Jenkins æ§æããã©ã°ã€ã³ãåå¥ã®æ§æãªããžããª
åã¹ãããã«ã€ããŠã¯å¥ã®èšäºã«ãŸãšããäºå®ã§ãã
ãã®äžé£ã®èšäºã®çŠç¹ã¯ããã€ã¯ããµãŒãã¹ã®äœææ¹æ³ã§ã¯ãªãããã€ã¯ããµãŒãã¹ãåäžã®ã·ã¹ãã ã§åäœãããæ¹æ³ã§ãã éåžžãããããã¹ãŠã®ããšã¯éçºè ã®è²¬ä»»ã®ç¯å²å€ã§ãããå°ãªããšã 20% ã¯ç¥ã£ãŠãããšåœ¹ã«ç«ã€ãšæããŸã (ãåãã®ãšãããçµæã® 80% ãåŸãããŸã)ã äœæè ã¯ãã®ã·ã¹ãã ãå人䜿çšã®ã¿ãç®çãšããŠäœæããããã®ã§ããããšãã»ãšãã©ç解ããŠããªããããã»ãã¥ãªãã£ãªã©ã®ç¡æ¡ä»¶ã«éèŠãªãããã¯ã¯ãã®ãããžã§ã¯ãããé€å€ãããŸãã ããããæèŠã建èšçãªæ¹å€ãæè¿ããŸãã
ãã€ã¯ããµãŒãã¹ã®äœæ
ãµãŒãã¹ã¯ Spring Boot ã䜿çšã㊠Java 11 ã§äœæãããŸããã ãµãŒãã¹éã®å¯Ÿè©±ã¯ REST ã䜿çšããŠçµç¹ãããŸãã ãããžã§ã¯ãã«ã¯æå°éã®ãã¹ããå«ãŸããŸã (åŸã§ Jenkins ã§ãã¹ããããã®ãããããã«ãããã)ã ãµãŒãã¹ã®ãœãŒã¹ ã³ãŒã㯠GitHub ã§å
¥æã§ããŸãã
åãµãŒãã¹ã®ã¹ããŒã¿ã¹ã確èªã§ããããã«ããããã«ã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"
ããã¯ãšã³ãã¢ããã¿ãŒ:
@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")
ãã¹ãŠãæ©èœããŠããŸãã 泚ææ·±ãèªè
ã¯ãã²ãŒããŠã§ã€ããã€ãã¹ããŠããã¯ãšã³ãã«çŽæ¥ã¢ã¯ã»ã¹ããããšã劚ãããã®ã¯äœããªãããšã«æ°ã¥ãã§ããã (
ãŸããäž¡æ¹ã®ãµãŒãã¹ã¯ XNUMX ã€ã®ãã¡ã€ã« ã·ã¹ãã ãå
±æããã¹ããªãŒã ãçæããããç¬éã«çžäºã«å¹²æžãå§ããå¯èœæ§ããããŸãã ãã€ã¯ããµãŒãã¹ãåé¢ãããšè¯ãã§ãããã ããã¯ãã¢ããªã±ãŒã·ã§ã³ãç°ãªããã·ã³ã«åæ£ãã (å€é¡ã®è²»çšãããããå°é£)ãä»®æ³ãã·ã³ã䜿çšãã (ãªãœãŒã¹ã倧éã«æ¶è²»ããèµ·åã«æéãããã)ããŸãã¯ã³ã³ããåã䜿çšããããšã«ãã£ãŠå®çŸã§ããŸãã äºæ³ã©ãããXNUMX çªç®ã®ãªãã·ã§ã³ãéžæããŸãã
ããã«ãŒ
ã€ãŸããdocker ã¯ã¢ããªã±ãŒã·ã§ã³ããšã« XNUMX ã€ãã€ãåé¢ãããã³ã³ãããŒãäœæããŸãã Docker ã䜿çšããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠå®è¡ããããã®æé ã§ãã Dockerfile ãäœæããå¿
èŠããããŸãã 次ã«ãã€ã¡ãŒãžãæ§ç¯ããã€ã¡ãŒãž ã¬ãžã¹ããªã«ã¢ããããŒãããŸã (ãããã
ããã«ãŒãã¡ã€ã«
ç»åã®æãéèŠãªç¹æ§ã® XNUMX ã€ã¯ãã®ãµã€ãºã§ãã ã³ã³ãã¯ããªã€ã¡ãŒãžã¯ãªã¢ãŒã ãªããžããªããã®ããŠã³ããŒããéããªããå æããã¹ããŒã¹ãå°ãªããªãããµãŒãã¹ã®éå§ãéããªããŸãã ãã¹ãŠã®ã€ã¡ãŒãžã¯åºæ¬ã€ã¡ãŒãžã«åºã¥ããŠæ§ç¯ããããããæãæå°éã®ãªãã·ã§ã³ãéžæããããšããå§ãããŸãã è¯ãéžæè¢ã¯ãæå°éã®ããã±ãŒãžãåããå®å šãª Linux ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ãã Alpine ã§ãã
ãŸãã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 ããã§ã«ã€ã³ã¹ããŒã«ãããŠãã Alpine ããŒã¹ã®ããŒã¹ ã€ã¡ãŒãžã䜿çšããŠãããžã§ã¯ããæ§ç¯ããŠããŸãã ADD ã³ãã³ãã䜿çšããŠãçŸåšã® src ãã£ã¬ã¯ããªãã€ã¡ãŒãžã«è¿œå ãããããäœæ¥äž (WORKDIR) ãšããŠããŒã¯ãããã«ããéå§ããŸãã EXPOSE 8080 ã³ãã³ãã¯ãã³ã³ããå ã®ã¢ããªã±ãŒã·ã§ã³ãããŒã 8080 ã䜿çšããããšã Docker ã«ä¿¡å·ã§äŒããŸã (ããã«ãããã¢ããªã±ãŒã·ã§ã³ãå€éšããã¢ã¯ã»ã¹ã§ããããã«ãªããŸãããããšãã°ãåã Docker ãããã¯ãŒã¯äžã®å¥ã®ã³ã³ããããã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸã) ïŒã
ãµãŒãã¹ãã€ã¡ãŒãžã«ããã±ãŒãžåããã«ã¯ãåãããžã§ã¯ãã®ã«ãŒãããã³ãã³ããå®è¡ããå¿ èŠããããŸãã
docker image build . -t msvc-backend:1.0.0
çµæ㯠456 MB ã®ã€ã¡ãŒãžã«ãªããŸã (ãã®ãã¡ãããŒã¹ã® JDK ã€ã¡ãŒãžã¯ 340 MB ãå ããŠããŸãã)ã ããã¯ãç§ãã¡ã®ãããžã§ã¯ãã®ã¯ã©ã¹ãæã§æ°ããããã»ã©ã§ãããšããäºå®ã«ããããããã§ãã ç»åã®ãµã€ãºãå°ããããã«ã¯:
- å€æ®µéã¢ã»ã³ããªã䜿çšããŸãã æåã®ã¹ãããã§ãããžã§ã¯ãããã«ãããXNUMX çªç®ã®ã¹ããã㧠JRE ãã€ã³ã¹ããŒã«ããXNUMX çªç®ã®ã¹ãããã§ãã¹ãŠãæ°ããã¯ãªãŒã³ãª Alpine ã€ã¡ãŒãžã«ã³ããŒããŸãã æçµçãªã€ã¡ãŒãžã«ã¯ãåèšã§å¿ èŠãªã³ã³ããŒãã³ãã®ã¿ãå«ãŸããŸãã
- Javaã®ã¢ãžã¥ãŒã«åã䜿ã£ãŠã¿ãŸãããã 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 MB ã«æžããŸããã æªããªãã ãã®åŸãæ¢è£œã®ã€ã¡ãŒãžãã€ã¡ãŒãž ã¬ãžã¹ããªã«ã¢ããããŒãããŠãã€ã¡ãŒãžãã€ã³ã¿ãŒãããããããŠã³ããŒãã§ããããã«ããŸãã
Docker ã§ãµãŒãã¹ãå ±åå®è¡ãã
ãŸããåœç€Ÿã®ãµãŒãã¹ã¯åããããã¯ãŒã¯äžã«ååšããå¿ èŠããããŸãã Docker ã«ã¯ããã€ãã®çš®é¡ã®ãããã¯ãŒã¯ããããç§ãã¡ã¯ãã®äžã§æãåå§çãªããªããžã䜿çšããŸããããã«ãããåããã¹ãäžã§å®è¡ãããŠããã³ã³ããããããã¯ãŒã¯åã§ããŸãã 次ã®ã³ãã³ãã䜿çšããŠãããã¯ãŒã¯ãäœæããŸãã
docker network create msvc-network
次ã«ãmicroservices-backend:1.0.0 ã€ã¡ãŒãžã䜿çšããŠãbackendããšããååã®ããã¯ãšã³ã ã³ã³ãããŒãèµ·åããŸãã
docker run -dit --name backend --network msvc-net microservices-backend:1.0.0
ããªããž ãããã¯ãŒã¯ã§ã¯ãååã«ããã³ã³ãããŒã®ããã«äœ¿çšã§ãããµãŒãã¹æ€åºãæäŸãããããšã¯æ³šç®ã«å€ããŸãã ã€ãŸããããã¯ãšã³ã ãµãŒãã¹ã¯ Docker ãããã¯ãŒã¯å
ã§å©çšå¯èœã«ãªããŸãã
ã²ãŒããŠã§ã€ã®èµ·å:
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 ã®ããããã£ããªãŒããŒã©ã€ãããŸãã
éå§åŸã«åŒã³åºããŸã
ãŸãšã
ãã®çµæãXNUMX ã€ã®åçŽãªãã€ã¯ããµãŒãã¹ãäœæãããããã Docker ã³ã³ãããŒã«ããã±ãŒãžåããŠãåããã·ã³äžã§äžç·ã«èµ·åããŸããã ãã ããçµæãšããŠåŸãããã·ã¹ãã ã«ã¯ã次ã®ãããªå€ãã®æ¬ ç¹ããããŸãã
- èé害æ§ãäœã - XNUMX å°ã®ãµãŒããŒã§ãã¹ãŠãæ©èœãã
- ã¹ã±ãŒã©ããªãã£ãäœã - è² è·ãå¢å ããå Žåãè¿œå ã®ãµãŒãã¹ ã€ã³ã¹ã¿ã³ã¹ãèªåçã«ãããã€ããŠããããã®éã§è² è·ã®ãã©ã³ã¹ããšããšããã§ãããã
- èµ·åã®è€éã - å°ãªããšã 3 ã€ã®ã³ãã³ããšç¹å®ã®ãã©ã¡ãŒã¿ãŒãå ¥åããå¿ èŠããããŸãã (ãã㯠2 ã€ã®ãµãŒãã¹ã®ã¿ã«é©çšãããŸã)ã
äžèšã®åé¡ã解決ããã«ã¯ãDocker SwarmãNomadãKubernetesãOpenShift ãªã©ã®å€ãã®ãœãªã¥ãŒã·ã§ã³ããããŸãã ã·ã¹ãã å
šäœã Java ã§æžãããŠããå Žåã¯ãSpring Cloud (
Ð
åºæïŒ habr.com