Pagkat-on unsaon pag-deploy ang mga microservice. Bahin 1. Spring Boot ug Docker

Pagkat-on unsaon pag-deploy ang mga microservice. Bahin 1. Spring Boot ug Docker

Uy Habr.

Niini nga artikulo, gusto nakong hisgutan ang akong kasinatian sa paghimo og usa ka palibot sa pagkat-on alang sa pag-eksperimento sa mga microservice. Kung nahibal-an ang matag bag-ong himan, gusto nako kanunay nga sulayan kini dili lamang sa akong lokal nga makina, apan usab sa mas realistiko nga mga kahimtang. Busa, nakahukom ko sa paghimo sa usa ka gipasimple nga microservice nga aplikasyon, nga sa ulahi mahimong "gibitay" sa tanang matang sa makapaikag nga mga teknolohiya. Ang nag-unang kinahanglanon alang sa proyekto mao ang labing kaduol nga pagpaandar niini sa tinuud nga sistema.

Sa sinugdan, gibahin nako ang paghimo sa proyekto sa daghang mga lakang:

  1. Paghimo og duha ka serbisyo - 'backend' ug 'gateway', i-pack kini sa mga docker nga mga imahe ug i-configure kini aron magtinabangay

    Mga keyword: Java 11, Spring Boot, Docker, pag-optimize sa imahe

  2. Pagpalambo sa Kubernetes configuration ug deployment system sa Google Kubernetes Engine

    Mga keyword: Kubernetes, GKE, pagdumala sa kahinguhaan, autoscaling, mga sekreto

  3. Paghimo og tsart gamit ang Helm 3 para sa mas episyente nga pagdumala sa cluster

    Keyword: Helm 3, pag-deploy sa tsart

  4. Pag-set up sa Jenkins ug pipeline aron awtomatiko nga ihatud ang code sa cluster

    Keyword: Jenkins configuration, plugins, bulag nga configs repository

Nagplano ako nga maggahin ug lahi nga artikulo sa matag lakang.

Ang pokus sa kini nga serye sa mga artikulo dili kung giunsa pagsulat ang mga microservice, apan kung giunsa kini mahimo nga molihok sa usa ka sistema. Samtang ang tanan niini nga mga butang kasagaran sa gawas sa responsibilidad sa developer, sa akong hunahuna kini mapuslanon gihapon nga mahimong labing menos 20% nga pamilyar niini (nga nahibal-an nga nagkantidad sa 80% sa resulta). Ang pila ka hinungdanon nga mga hilisgutan, sama sa seguridad, ibilin sa kini nga proyekto, tungod kay gamay ra ang nasabtan sa tagsulat bahin niini; ang sistema gihimo alang lamang sa personal nga paggamit. Gidawat nako ang bisan unsang mga opinyon ug makatabang nga pagsaway.

Paghimo og mga microservice

Ang mga serbisyo gisulat sa Java 11 gamit ang Spring Boot. Ang inter-service nga komunikasyon giorganisar gamit ang REST. Ang proyekto maglakip sa usa ka minimum nga gidaghanon sa mga pagsulay (aron sa ulahi adunay usa ka butang nga sulayan sa Jenkins). Ang source code alang sa mga serbisyo anaa sa GitHub: backend ΠΈ Gateway.

Aron masusi ang kahimtang sa matag usa sa mga serbisyo, usa ka Spring Actuator ang gidugang sa ilang pagsalig. Maghimo kini usa ka endpoint / actuator / kahimsog ug ibalik ang usa ka kahimtang nga 200 kung ang serbisyo andam nga modawat sa trapiko, o 504 kung adunay mga problema. Sa kini nga kaso, kini usa ka dili tinuod nga pagsusi, tungod kay ang mga serbisyo yano ra kaayo, ug sa ilawom sa usa ka matang sa force majeure mas lagmit nga sila mahimong hingpit nga dili magamit kaysa magpabilin nga partially operational. Apan sa tinuod nga mga sistema, ang Actuator makatabang sa pag-diagnose sa usa ka problema sa dili pa magsugod ang mga tiggamit niini. Pananglitan, kung adunay mga problema sa pag-access sa database, mahimo namon nga awtomatiko nga matubag kini pinaagi sa paghunong sa pagproseso sa mga hangyo nga adunay usa ka guba nga pananglitan sa serbisyo.

Serbisyo sa backend

Ang serbisyo sa backend mag-ihap ug ibalik ang gidaghanon sa gidawat nga mga hangyo.

Kodigo sa tigkontrol:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/requests")
    public Long getRequestsCount() {
        return counter.incrementAndGet();
    }
}

Pagsulay sa controller:

@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"));
    }
}

Serbisyo sa gateway

Ipasa sa gateway ang hangyo sa serbisyo sa backend, dugangan kini sa mosunod nga impormasyon:

  • gateway id. Gikinahanglan kini aron ang usa ka pananglitan sa gateway mailhan gikan sa lain pinaagi sa tubag sa server
  • Usa ka piho nga "sekreto" nga magdula sa papel sa usa ka hinungdanon kaayo nga password (panguna nga numero alang sa pag-encrypt sa usa ka hinungdanon nga cookie)

Pag-configure sa application.properties:

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

Adapter alang sa komunikasyon sa 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();
    }
}

Controller:

@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);
    }
}

Paglusad:

Atong ilunsad ang backend:

./mvnw package -DskipTests
java -Dserver.port=8081 -jar target/microservices-backend-1.0.0.jar

Atong sugdan ang ganghaan:

./mvnw package -DskipTests
java -jar target/microservices-gateway-1.0.0.jar

Pagsusi:

$ curl http://localhost:8080/
Number of requests 1 (gateway 38560358, secret "default-secret")

Ang tanan nagtrabaho. Ang matinagdanon nga magbabasa makamatikod nga wala’y makapugong kanamo sa direkta nga pag-access sa backend, pag-agi sa ganghaan (http://localhost:8081/requests). Aron ayohon kini, ang mga serbisyo kinahanglan nga gihiusa sa usa ka network, ug ang ganghaan lamang ang kinahanglan nga "mag-itsa" sa gawas.
Usab, ang duha nga mga serbisyo nag-ambit sa parehas nga sistema sa file, nagmugna og mga hilo, ug sa usa ka punto mahimong magsugod sa pagpanghilabot sa usag usa. Maayo nga ihimulag ang among mga microservice. Mahimo kini nga makab-ot pinaagi sa pag-apod-apod sa mga aplikasyon sa lainlaing mga makina (daghang salapi, lisud), gamit ang mga virtual nga makina (gidaghanon sa kapanguhaan, dugay nga pagsugod) o paggamit sa containerization. Sama sa gipaabut, gipili namon ang ikatulo nga kapilian ug Docker isip usa ka himan alang sa containerization.

Docker

Sa laktud, ang Docker nagmugna og nahilit nga mga sudlanan, usa matag aplikasyon. Aron magamit ang Docker, kinahanglan nimo nga magsulat usa ka Dockerfile - mga panudlo alang sa pagtukod ug pagpadagan sa aplikasyon. Sunod, mahimo nimong tukuron ang imahe, i-upload kini sa rehistro sa imahe (No. Dockerhub) ug i-deploy ang imong microservice sa bisan unsang dockerized environment sa usa ka command.

Dockerfile

Usa sa labing importante nga mga kinaiya sa usa ka hulagway mao ang gidak-on niini. Ang usa ka compact nga imahe mas paspas nga mag-download gikan sa usa ka hilit nga tipiganan, mokuha ug gamay nga espasyo, ug ang imong serbisyo magsugod nga mas paspas. Ang bisan unsang imahe gitukod pinasukad sa usa ka sukaranan nga imahe, ug girekomenda nga pilion ang labing minimalist nga kapilian. Ang usa ka maayong kapilian mao ang Alpine, usa ka bug-os nga pag-apod-apod sa Linux nga adunay labing gamay nga mga pakete.

Una, sulayan nato ang pagsulat sa usa ka Dockerfile nga "head-on" (Isulti ko dayon nga kini usa ka dili maayo nga paagi, ayaw kini buhata):

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"]

Dinhi naggamit kami usa ka base nga imahe sa Alpine nga adunay JDK nga na-install na aron matukod ang among proyekto. Gamit ang ADD command, among idugang ang kasamtangan nga src directory sa imahe, markahan kini nga nagtrabaho (WORKDIR) ug sugdan ang pagtukod. Ang EXPOSE 8080 command signal sa docker nga ang aplikasyon sa sudlanan mogamit sa iyang port 8080 (kini dili makahimo sa aplikasyon nga ma-access gikan sa gawas, apan tugotan ang aplikasyon nga ma-access, pananglitan, gikan sa laing sudlanan sa samang docker network. ).

Aron ma-package ang mga serbisyo sa mga imahe, kinahanglan nimo nga ipadagan ang mga mando gikan sa gamut sa matag proyekto:

docker image build . -t msvc-backend:1.0.0

Ingon usa ka sangputanan, nakakuha kami usa ka imahe nga 456 MB ang gidak-on (diin ang base nga JDK 340 nga imahe gikuha MB). Ug ang tanan bisan pa sa kamatuoran nga ang mga klase sa among proyekto maihap sa usa ka tudlo. Aron maminusan ang gidak-on sa among imahe:

  • Gigamit namon ang multi-step assembly. Sa unang lakang atong tipunon ang proyekto, sa ikaduha atong i-install ang JRE, ug sa ikatulo nga lakang atong kopyahon kining tanan ngadto sa bag-ong limpyo nga Alpine nga larawan. Sa kinatibuk-an, ang katapusan nga imahe maglangkob lamang sa gikinahanglan nga mga sangkap.
  • Gamiton nato ang java modularization. Sugod sa Java 9, mahimo nimong gamiton ang jlink tool sa paghimo og JRE gikan lamang sa mga module nga imong gikinahanglan

Para sa mga kuryuso, aniay maayong artikulo bahin sa mga pamaagi sa pagpakunhod sa gidak-on sa imahe https://habr.com/ru/company/ruvds/blog/485650/.

Katapusan nga 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"]

Among gimugna pag-usab ang hulagway, ug kini nahimong 6 ka pilo nga mas nipis, nga mikabat sa 77 MB. Dili daotan. Pagkahuman, ang nahuman nga mga imahe mahimong ma-upload sa rehistro sa imahe aron ang imong mga imahe magamit aron ma-download gikan sa Internet.

Pagdagan sa mga serbisyo nga magkauban sa Docker

Sa pagsugod, ang among mga serbisyo kinahanglan naa sa parehas nga network. Adunay ubay-ubay nga mga matang sa mga network sa Docker, ug gigamit namon ang labing karaan niini - tulay, nga nagtugot kanimo sa mga sudlanan sa network nga nagdagan sa parehas nga host. Maghimo kita og network nga adunay mosunod nga sugo:

docker network create msvc-network

Sunod, maglansad ta ug backend nga sudlanan nga ginganlag 'backend' nga adunay imahe nga microservices-backend:1.0.0:

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

Angay nga matikdan nga ang network sa tulay naghatag og pagdiskubre sa serbisyo gikan sa kahon alang sa mga sudlanan sa ilang mga ngalan. Kana mao, ang serbisyo sa backend mahimong magamit sa sulod sa Docker network sa http://backend:8080.

Atong sugdan ang ganghaan:

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

Niini nga sugo atong gipakita nga atong gipasa ang port 80 sa atong host ngadto sa port 8080 sa sudlanan. Gigamit namo ang mga opsyon sa env aron itakda ang mga variable sa palibot nga awtomatik nga basahon sa tingpamulak ug i-override ang mga kabtangan gikan sa application.properties.

Human sa paglansad, tawag http://localhost/ ug siguruha nga ang tanan molihok, sama sa miaging kaso.

konklusyon

Ingon nga resulta, naghimo kami og duha ka yano nga microservices, giputos kini sa mga docker container ug gilunsad kini sa samang makina. Ang resulta nga sistema, bisan pa, adunay daghang mga disbentaha:

  • Dili maayo nga pagtugot sa sayup - ang tanan molihok sa usa ka server alang kanamo
  • Dili maayo nga scalability - samtang nagkadaghan ang load, mas maayo nga awtomatiko nga i-deploy ang dugang nga mga higayon sa serbisyo ug balansehon ang load sa taliwala nila
  • Ang pagkakomplikado sa paglansad - kinahanglan namon nga mosulod labing menos 3 nga mga mando, nga adunay piho nga mga parameter (kini alang lamang sa 2 nga mga serbisyo)

Aron masulbad ang mga problema sa ibabaw, adunay daghang mga solusyon sama sa Docker Swarm, Nomad, Kubernetes o OpenShift. Kung ang tibuuk nga sistema gisulat sa Java, mahimo nimong tan-awon ang Spring Cloud (maayong artikulo).

Π’ sunod nga bahin Isulti ko kanimo kung giunsa nako pag-set up ang Kubernetes ug gi-deploy ang proyekto sa Google Kubernetes Engine.

Source: www.habr.com

Idugang sa usa ka comment