Ukufunda ukuhambisa ii-microservices. Icandelo 1. I-Spring Boot kunye ne-Docker

Ukufunda ukuhambisa ii-microservices. Icandelo 1. I-Spring Boot kunye ne-Docker

Molo, Habr.

Kweli nqaku, ndifuna ukuthetha ngamava am okudala indawo yokufunda yokulinga ii-microservices. Xa ndifunda zonke izixhobo ezitsha, bendisoloko ndifuna ukuzama kungekuphela nje kumatshini wam wasekhaya, kodwa nakwiimeko ezinokwenyani. Ngoko ke, ndaye ndagqiba ekubeni ndenze isicelo se-microservice esilula, esinokuthi kamva "sixhonywe" nazo zonke iintlobo zobuchwepheshe obunomdla. Eyona mfuno iphambili yeprojekthi kukusondele kakhulu ekusebenzeni kwayo kwinkqubo yokwenyani.

Ekuqaleni, ndahlula ukudalwa kweprojekthi ngamanyathelo amaninzi:

  1. Yenza iinkonzo ezimbini-'backend' kunye 'nesango', zipakishe kwimifanekiso yedocker kwaye uziqwalasele ukuba zisebenze kunye

    Amagama angundoqo: iJava 11, iSpring Boot, iDocker, ukwenziwa komfanekiso

  2. Uphuhliso lwe-Kubernetes yoqwalaselo kunye nenkqubo yokuthunyelwa kwi-Google Kubernetes Engine

    Amagama angundoqo: I-Kubernetes, i-GKE, ulawulo lwemithombo, i-autoscaling, iimfihlo

  3. Yenza itshathi usebenzisa iHelm 3 yolawulo olululo lweqela

    Amagama angundoqo: Helm 3, ukuthunyelwa kwetshathi

  4. Ukumisela i-Jenkins kunye nombhobho ukuhambisa ngokuzenzekelayo ikhowudi kwiqela

    Amagama angundoqo: Uqwalaselo lweJenkins, iiplagi, iindawo zokugcina ezohlukeneyo

Ndiceba ukunikela inqaku elahlukileyo kwinqanaba ngalinye.

Ingqwalasela yolu ngcelele lwamanqaku ayikho indlela yokubhala i-microservices, kodwa indlela yokwenza ukuba isebenze kwinkqubo enye. Ngelixa zonke ezi zinto ziqhele ukuba ngaphandle koxanduva lomphuhlisi, ndicinga ukuba kuseluncedo ukuba okungenani ube ngama-20% uqhelene nazo (eyaziwa ngokuba yi-80% yesiphumo). Ezinye izihloko ezibaluleke kakhulu, ezinjengokhuseleko, ziya kushiywa ngaphandle kule projekthi, kuba umbhali eyiqonda kancinci malunga nale nto; inkqubo yenzelwe kuphela usetyenziso lomntu. Ndiyazamkela naziphi na izimvo kunye nokugxeka okwakhayo.

Ukudala iiMicroservices

Iinkonzo zabhalwa kwiJava 11 kusetyenziswa iSpring Boot. Unxibelelwano phakathi kweenkonzo luququzelelwe kusetyenziswa i-REST. Iprojekthi iya kubandakanya inani elincinci leemvavanyo (ukuze kamva kubekho into yokuvavanya eJenkins). Ikhowudi yomthombo weenkonzo iyafumaneka kwi-GitHub: ngasemva ΠΈ Isango.

Ukuze ukwazi ukujonga imeko yenkonzo nganye, i-Spring Actuator yongezwa ekuxhomekeke kwabo. Kuya kudala isiphelo / i-actuator / impilo kwaye iya kubuyisela isimo se-200 ukuba inkonzo ilungele ukwamkela i-traffic, okanye i-504 kwimeko yeengxaki. Kule meko, oku kutshekishwa okungeyonyani, kuba iinkonzo zilula kakhulu, kwaye phantsi kohlobo oluthile lwe-force majeure kunokwenzeka ukuba zingafumaneki ngokupheleleyo kunokuhlala zisebenza ngokuyinxenye. Kodwa kwiinkqubo zokwenyani, iActuator inokunceda ukufumanisa ingxaki ngaphambi kokuba abasebenzisi baqale ukubetha kuyo. Ngokomzekelo, ukuba iingxaki zivela ngokufikelela kwisiseko sedatha, siya kukwazi ukuphendula ngokuzenzekela koku ngokuyeka ukuqhubekeka kwezicelo ngomzekelo owaphukileyo wenkonzo.

Inkonzo yokubuyela umva

Inkonzo yangasemva iya kubala ngokulula kwaye ibuyisele inani lezicelo ezamkelweyo.

Ikhowudi yomlawuli:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Uvavanyo lomlawuli:

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

Inkonzo yesango

Isango liya kudlulisela isicelo kwinkonzo yangasemva, liyongezelela ngolu lwazi lulandelayo:

  • id yesango. Kuyafuneka ukuze umzekelo omnye wesango unokwahlulwa kwenye ngokuphendula komncedisi
  • "Imfihlo" ethile eya kudlala indima yegama eliyimfihlo elibaluleke kakhulu (inombolo ephambili yoguqulelo oluntsonkothileyo lwekuki ebalulekileyo)

Uqwalaselo kwi-application.properties:

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

Iadaptha yonxibelelwano ne-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();
    }
}

Umlawuli:

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

Qalisa:

Masiqalise i-backend:

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

Masiqale isango:

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

Ukuhlola:

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

Yonke into iyasebenza. Umfundi onomdla uya kuqaphela ukuba akukho nto isithintelayo ekufikeleleni umva ngokuthe ngqo, ngokudlula isango (http://localhost:8081/requests). Ukulungisa oku, iinkonzo kufuneka zidibaniswe kwinethiwekhi enye, kwaye kuphela isango kufuneka "liphume" ngaphandle.
Kwakhona, zombini iinkonzo zabelana ngenkqubo yefayile efanayo, zivelise imisonto, kwaye kwinqanaba elinye linokuqalisa ukuphazamisana. Kuya kuba kuhle ukwahlula ii-microservices zethu. Oku kunokufezekiswa ngokusasazwa kwezicelo kumatshini ahlukeneyo (imali eninzi, enzima), kusetyenziswa oomatshini bokwenyani (ubutyebi obunzulu, ukuqalisa ixesha elide) okanye ukusebenzisa isikhongozeli. Njengoko kulindelekile, sikhetha ukhetho lwesithathu kunye Docker njengesixhobo sokuthwala.

Docker

Ngamafutshane, iDocker yenza izikhongozeli ezizimeleyo, esinye isicelo ngasinye. Ukusebenzisa i-Docker, kufuneka ubhale i-Dockerfile-imiyalelo yokwakha kunye nokuqhuba isicelo. Okulandelayo, unokwakha umfanekiso, uwulayishe kwirejista yemifanekiso (No. I-DockerHub) kwaye uthumele i-microservice yakho kuyo nayiphi na imeko edockerized ngomyalelo omnye.

dockerfile

Enye yezona mpawu zibalulekileyo zomfanekiso bubukhulu bawo. Umfanekiso ohlangeneyo uya kukhuphela ngokukhawuleza kwindawo yokugcina ekude, uthathe indawo encinci, kwaye inkonzo yakho iya kuqalisa ngokukhawuleza. Nawuphi na umfanekiso wakhiwe ngesiseko somfanekiso osisiseko, kwaye kuyacetyiswa ukuba ukhethe olona khetho luncinci. Inketho elungileyo yiAlpine, ukuhanjiswa kweLinux ngokupheleleyo kunye nobuncinci bepakethe.

Okokuqala, makhe sizame ukubhala i-Dockerfile "intloko-phezulu" (ndiya kuthi ngoko nangoko ukuba le ndlela imbi, musa ukuyenza):

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

Apha sisebenzisa umfanekiso osekelwe kwi-Alpine kunye ne-JDK esele ifakiwe ukwakha iprojekthi yethu. Ukusebenzisa umyalelo we-ADD, songeza ulawulo lwe-src lwangoku kumfanekiso, phawula njengomsebenzi (WORKDIR) kwaye uqale ukwakha. Umyalelo we-EXPOSE 8080 ubonisa i-docker ukuba isicelo esikwisikhongozeli siya kusebenzisa izibuko 8080 (oku akuyi kwenza isicelo sifumaneke ngaphandle, kodwa kuya kuvumela isicelo ukuba sifikelelwe, umzekelo, kwesinye isikhongozeli kuthungelwano lwedocker efanayo. ).

Ukupakisha iinkonzo kwimifanekiso, kufuneka usebenzise imiyalelo kwingcambu yeprojekthi nganye:

docker image build . -t msvc-backend:1.0.0

Ngenxa yoko, sifumana umfanekiso we-456 MB ngobukhulu (apho umfanekiso we-JDK 340 wesiseko uthathe MB). Kwaye konke nangona iiklasi kwiprojekthi yethu zingabalwa ngomnwe omnye. Ukunciphisa ubungakanani bomfanekiso wethu:

  • Sisebenzisa indibano enamanyathelo amaninzi. Kwisinyathelo sokuqala siya kudibanisa iphrojekthi, okwesibini siya kufaka i-JRE, kwaye kwisinyathelo sesithathu siya kukopisha konke oku kumfanekiso omtsha we-Alpine ococekileyo. Lilonke, umfanekiso wokugqibela uya kuba nezinto eziyimfuneko kuphela.
  • Masisebenzise i-java modularization. Ukuqala ngeJava 9, ungasebenzisa isixhobo se-jlink ukwenza i-JRE kwiimodyuli ozifunayo kuphela

Kwabanomdla, nali inqaku elilungileyo malunga neendlela zokunciphisa ubungakanani bemifanekiso https://habr.com/ru/company/ruvds/blog/485650/.

Ifayile yeDocker yokugqibela:

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

Siphinde sawuphinda umfanekiso, kwaye ekugqibeleni waba ngu-6 amaxesha amancinci, afikelela kwi-77 MB. Akukubanga. Emva koko, imifanekiso egqityiweyo inokulayishwa kwirejista yemifanekiso ukuze imifanekiso yakho ifumaneke ukuba ikhutshelwe kwi-Intanethi.

Ukuqhuba iinkonzo kunye eDocker

Ukuqala, iinkonzo zethu kufuneka zibe kwinethiwekhi efanayo. Kukho iintlobo ezininzi zothungelwano kwi-Docker, kwaye sisebenzisa eyona yakudala kuzo - ibhulorho, ekuvumela ukuba wenze izikhongozeli zenethiwekhi ezisebenza kumsingathi omnye. Masenze inethiwekhi ngalo myalelo ulandelayo:

docker network create msvc-network

Okulandelayo, masiqalise isikhongozeli esingasemva esibizwa ngokuba yi-'backend' ngomfanekiso we-microservices-backend:1.0.0:

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

Kuyaphawuleka ukuba inethiwekhi yebhulorho ibonelela ngokufunyanwa kwenkonzo ngaphandle kwebhokisi yezikhongozeli ngamagama azo. Oko kukuthi, inkonzo ye-backend iya kufumaneka ngaphakathi kwenethiwekhi ye-Docker kwi http://backend:8080.

Masiqale isango:

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

Kulo myalelo sibonisa ukuba sithumela i-port 80 ye-host host yethu kwi-port 8080 yesikhongozeli. Sisebenzisa iinketho ze-env ukuseta izinto eziguquguqukayo zokusingqongileyo eziza kufundwa ngokuzenzekelayo ngentwasahlobo kwaye zigqithise iipropati ezivela kwi-application.properties.

Emva kokuqalisa, fowuna http://localhost/ kwaye uqinisekise ukuba yonke into iyasebenza, njengakwimeko yangaphambili.

isiphelo

Ngenxa yoko, senze ii-microservices ezimbini ezilula, sazipakisha kwizikhongozeli ze-docker kwaye sazisungula kunye kumatshini omnye. Inkqubo yesiphumo, nangona kunjalo, ineqela lezinto ezingalunganga:

  • Ukunyamezela impazamo embi - yonke into isebenza kumncedisi omnye kuthi
  • I-scalability engalunganga-njengoko umthwalo usanda, kuya kuba kuhle ukubeka ngokuzenzekelayo iimeko zenkonzo ezongezelelweyo kunye nokulinganisela umthwalo phakathi kwabo.
  • Qalisa ukuntsokotha-besidinga ukufaka ubuncinane imiyalelo emi-3, kunye neeparamitha ezithile (oku kuphela kweenkonzo ezi-2)

Ukusombulula ezi ngxaki zingentla, kukho inani lezisombululo ezifana neDocker Swarm, Nomad, Kubernetes okanye OpenShift. Ukuba yonke inkqubo ibhaliwe kwiJava, ungajonga ngase Spring Cloud (ngileyo).

Π’ inxalenye elandelayo Ndiza kukuxelela malunga nendlela endiyimise ngayo iKubernetes kwaye ndisasaze iprojekthi kuGoogle Kubernetes Injini.

umthombo: www.habr.com

Yongeza izimvo