Dzidza maitiro ekutumira mamicroservices. Chikamu 1. Spring Boot uye Docker

Dzidza maitiro ekutumira mamicroservices. Chikamu 1. Spring Boot uye Docker

Hei Habr.

Muchikamu chino, ndinoda kutaura nezve ruzivo rwangu mukugadzira nzvimbo yekudzidza yekuyedza ne microservices. Pandakadzidza chimwe nechimwe chitsva, ndaigara ndichida kuedza kwete chete pamushini wemunharaunda, asiwo mumamiriro ezvinhu chaiwo. Naizvozvo, ndakafunga kugadzira yakareruka microservice application, iyo inogona gare gare "yakafukidzwa" nemhando dzese dzetekinoroji dzinonakidza. Chinodiwa chikuru chepurojekiti ndeyekunyanya kushanda kwayo kuswedera kune chaiyo system.

Pakutanga, ndakatyora kusikwa kweprojekiti kuita matanho akati wandei:

  1. Gadzira masevhisi maviri - 'backend' (backend) uye 'gedhi' (gedhi), zvirongedze mumifananidzo yedocker uye woimisa kuti ishande pamwe chete.

    Keywords: Java 11, Spring Boot, Docker, mufananidzo optimization

  2. Kuvandudzwa kweKubernetes kumisikidza uye sisitimu yekuisa muGoogle Kubernetes Injini

    Keywords: Kubernetes, GKE, zviwanikwa maneja, autoscaling, zvakavanzika

  3. Kugadzira chati ine Helm 3 kuitira zvirinani manejimendi emasumbu

    Tags: Helm 3, chati yekuendesa

  4. Kumisikidza Jenkins uye pombi yekuendesa otomatiki kodhi kune sumbu

    Keywords: Jenkins kumisikidza, plugins, yakaparadzana configs repository

Ndinoronga kugovera chinyorwa chakasiyana kune imwe neimwe nhanho.

Kutarisisa kweiyi nhevedzano yezvinyorwa haisi maitiro ekunyora mamicroservices, asi maitiro ekuita kuti ashande mune imwechete system. Kunyangwe zvese izvi zvinhu zvinowanzopfuura basa remugadziri, ndinofunga zvichiri kubatsira kuti ujairane nazvo zvishoma 20% (iyo, sezvamunoziva, inopa makumi masere muzana emhedzisiro). Mimwe misoro yakakosha isina magumo, senge chengetedzo, ichasiiwa kunze kwechirongwa ichi, nekuti munyori anonzwisisa zvishoma nezve system iyi inogadzirwa kuti ishandiswe wega. Ndinogamuchira chero maonero uye kutsoropodza kunovaka.

Kugadzira microservices

Iwo masevhisi akanyorwa muJava 11 uchishandisa Spring Boot. Interservice yekudyidzana inorongwa uchishandisa REST. Iyo purojekiti ichasanganisira huwandu hushoma hwekuyedzwa (kuitira kuti gare gare pane chimwe chinhu chekuyedza muJenkins). Iyo kodhi kodhi yemasevhisi inowanikwa paGitHub: backend ΠΈ Gateway.

Kuti ukwanise kutarisa mamiriro eimwe neimwe yemasevhisi, Spring Actuator yakawedzerwa kune avo vanotsamira. Ichagadzira iyo / actuator/health endpoint uye ichadzosa chimiro che200 kana sevhisi yakagadzirira kugamuchira traffic, kana 504 kana paine dambudziko. Muchiitiko ichi, iyi icheki yekufungidzira, sezvo masevhisi ari nyore kwazvo, uye kana pane imwe simba majeure, anogona kunge asingawanikwe zvachose pane kuramba achishanda zvishoma. Asi mumasisitimu chaiwo, Actuator inogona kubatsira kuongorora dambudziko vashandisi vasati vatanga kurwisa nezvazvo. Semuenzaniso, kana paine matambudziko ekuwana dhatabhesi, isu tinogona kungopindura kune izvi nekumisa zvikumbiro zvekugadzirisa neyakaputsika sevhisi sevhisi.

Back end service

Iyo backend sevhisi inongoverenga uye kudzosera nhamba yezvikumbiro zvakagamuchirwa.

Controller kodhi:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Controller bvunzo:

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

Service Gateway

Iyo gedhi inoendesa chikumbiro kune iyo backend sevhisi, ichiwedzera iyo inotevera ruzivo:

  • gateway id. Inodiwa kuitira kuti zvikwanise kusiyanisa imwe muenzaniso yegedhi kubva kune imwe nemhinduro ye server
  • Zvimwe "zvakavanzika" zvinozoita basa repassword yakakosha (nhamba yekiyi yekuvharira yecookie yakakosha)

Kugadzirisa mune application.properties:

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

Backend adapta:

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

Launch:

Tinotanga backend:

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

Kutanga gedhi:

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

Tinotarisa:

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

Zvose zviri kushanda. Muverengi anoteerera anozoona kuti hapana chinotitadzisa kuwana backend zvakananga, tichipfuura gedhi (http://localhost:8081/requests) Kugadzirisa izvi, masevhisi anofanirwa kusanganiswa kuita network imwe, uye chete gedhi rinofanira "kubuda" kunze.
Zvakare, ese ese masevhisi anogovera imwe faira system, gadzira hova uye pane imwe nguva inogona kutanga kupindirana. Zvingave zvakanaka kuparadzanisa mamicroservices edu. Izvi zvinogona kuwanikwa nekugovera zvikumbiro pamichina yakasiyana (mari yakawanda, yakaoma), uchishandisa michina yemhando (yakakura sosi, kutanga kwenguva refu), kana kushandisa mudziyo. Sezvinotarisirwa, tinosarudza sarudzo yechitatu uye Docker sechishandiso chekuisa midziyo.

Docker

Muchidimbu, docker inogadzira midziyo yakasarudzika, imwe pakushandisa. Kuti ushandise docker, unofanirwa kunyora Dockerfile - mirairo yekuvaka uye kumhanyisa application. Tevere, iwe unogona kuvaka mufananidzo, wouisa kune iyo mufananidzo registry (No. Dockerhub) uye shandisa microservice yako mune chero dockerized nharaunda mune imwechete kuraira.

dockerfile

Chimwe chezvinhu zvinonyanya kukosha zvemufananidzo hukuru hwayo. Mufananidzo wakakwana unodhawunirodha nekukurumidza kubva kunzvimbo iri kure, kutora nzvimbo shoma, uye sevhisi yako inotanga nekukurumidza. Chero mufananidzo wakavakirwa pahwaro hwechifananidzo chegadziko, uye zvinokurudzirwa kusarudza yakanyanya minimalistic sarudzo. Sarudzo yakanaka ndeyeAlpine, yakazara Linux kugovera ine mashoma mapakeji.

Kutanga, ngatiedzei kunyora Dockerfile "pahuma" (ini ndichataura pakarepo kuti iyi inzira yakaipa, usazviita):

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

Pano tiri kushandisa Alpine based base image neJDK yatoiswa kare kuvaka purojekiti yedu. Nekuraira kweADD, isu tinowedzera ikozvino src dhairekitori kumufananidzo, nyora sekushanda (WORKDIR) uye tanga kuvaka. Iyo EXPOSE 8080 yekuraira inosaina kune docker kuti application iri mugaba ichashandisa chiteshi chayo 8080 (izvi hazvizoite kuti application iwanikwe kubva kunze, asi inobvumira kuti application iwanikwe, semuenzaniso, kubva kune imwe mudziyo pane imwechete docker network. )

Kurongedza masevhisi mumifananidzo, unofanirwa kumhanyisa mirairo kubva pamudzi wepurojekiti yega yega:

docker image build . -t msvc-backend:1.0.0

Mhedzisiro ndeye 456 MB mufananidzo (iyo iyo base JDK mufananidzo wakagara 340 MB). Uye zvose pasinei nokuti makirasi ari mubasa redu anogona kuverengwa pamunwe. Kuderedza saizi yemufananidzo wedu:

  • Isu tinoshandisa multi-step assembly. Muchikamu chekutanga tichavaka purojekiti, muchikamu chechipiri tichaisa JRE, uye munhanho yechitatu tichaikopa yose mumufananidzo mutsva wakachena weAlpine. Pakazara, chete zvikamu zvinodiwa zvichange zviri mumufananidzo wekupedzisira.
  • Ngatishandisei modularization yejava. Kutanga neJava 9, unogona kushandisa jlink chishandiso kugadzira JRE kubva kumamodule chete aunoda

Kune vanobvunza, heino chinyorwa chakanaka pamaitiro ekuderedza mifananidzo. https://habr.com/ru/company/ruvds/blog/485650/.

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

Isu tinodzokorora mufananidzo, uye semhedzisiro, yakarasika ka6 uremu hwayo, hunosvika 77 MB. Kusaipa. Mushure meizvozvo, mifananidzo yakagadzirwa-yakagadzirirwa inogona kuiswa kune registry yemifananidzo kuitira kuti mifananidzo yako iwanikwe kurodha kubva paInternet.

Co-running masevhisi muDocker

Kutanga, masevhisi edu anofanira kunge ari panetiweki imwe chete. Kune akati wandei marudzi emanetiweki mu docker, uye isu tinoshandisa yakanyanya primitive yavo - bhiriji, iyo inobvumidza iwe kune network midziyo inomhanya pane imwechete saiti. Gadzira network nemirairo inotevera:

docker network create msvc-network

Tevere, tanga mudziyo wekumashure unonzi 'backend' uine microservices-backend:1.0.0 mufananidzo:

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

Izvo zvakakosha kucherechedza kuti iyo bhiriji network inopa kunze kwebhokisi sevhisi kuwanikwa kwemidziyo nemazita avo. Ndokunge, iyo backend sevhisi ichave iripo mukati meiyo docker network pa http://backend:8080.

Kutanga gedhi:

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

Mukuraira uku, isu tinoratidza kuti tiri kutumira port 80 yemuiti wedu kuchiteshi 8080 chemudziyo. Isu tinoshandisa env sarudzo kuseta nharaunda zvinoshanduka izvo zvinozoerekana kuverengwa nechirimo uye nekupfuura zvivakwa kubva kune application.properties.

Mushure mekutanga, tinofona http://localhost/ uye ita shuwa kuti zvese zvinoshanda, senge mune yapfuura kesi.

mhedziso

Nekuda kweizvozvo, isu takagadzira maviri akareruka mamicroservices, akaaisa mumidziyo yedocker ndokuatanga pamwechete pamushini mumwe chete. Iyo inokonzeresa sisitimu, zvisinei, ine huwandu hwekuipa:

  • Kutadza kushivirira kukanganisa - zvese zvinoshanda kwatiri pane imwe server
  • Kusakwana scalability - kana mutoro ukawedzera, zvingave zvakanaka kuti uise otomatiki mamwe masevhisi zviitiko uye kuenzanisa mutoro pakati pavo.
  • Kuoma kwekutanga - isu taida kuisa kanenge 3 mirairo, uye nemamwe ma parameter (izvi ndezve2 masevhisi chete)

Kugadzirisa matambudziko ari pamusoro, pane akati wandei emhinduro senge Docker Swarm, Nomad, Kubernetes kana OpenShift. Kana iyo yese sisitimu yakanyorwa muJava, unogona kutarisa kuChitubu Cloud (chinyorwa chakanaka).

Π’ chikamu chinotevera Ini ndichataura nezve magadzirirwo andakaita Kubernetes uye nekuendesa purojekiti kuGoogle Kubernetes Injini.

Source: www.habr.com

Voeg