Baro sida loo geeyo adeegaha yaryar Qeybta 1. Kabaha Guga iyo Docker

Baro sida loo geeyo adeegaha yaryar Qeybta 1. Kabaha Guga iyo Docker

Haye Habr.

Maqaalkan, waxaan rabaa inaan ka hadlo waayo-aragnimadayda abuurista jawi waxbarasho oo lagu tijaabinayo adeegyada yaryar. Markii aan bartay qalab kasta oo cusub, waxaan had iyo jeer doonayay inaan isku dayo ma aha oo kaliya mashiinka maxalliga ah, laakiin sidoo kale xaalado badan oo macquul ah. Sidaa darteed, waxaan go'aansaday in aan abuuro codsi microservice la fududeeyay, kaas oo mar dambe lagu "daboolan karo" dhammaan noocyada tignoolajiyada xiisaha leh. Shuruudda ugu weyn ee mashruucu waa u dhawaanshaha shaqada ugu badan ee nidaamka dhabta ah.

Markii hore, waxaan u jebiyey abuuritaanka mashruuca dhowr tallaabo:

  1. Abuur laba adeeg - 'backend' (backend) iyo 'alteway' (albaab), ku xidho sawirada docker oo u habso inay wada shaqeeyaan

    Erayada furaha: Java 11, Boot Guga, Docker, hagaajinta sawirka

  2. Horumarinta habaynta Kubernetes iyo habaynta nidaamka Google Kubernetes Engine

    Erayada furaha: Kubernetes, GKE, maaraynta khayraadka, autoscaling, siraha

  3. Abuuritaanka jaantus leh Helm 3 si loo maareeyo kooxeedka wanaagsan

    Tags: Helm 3, jaantus geynta

  4. Dejinta Jenkins iyo dhuumaha si toos ah koodka loogu geeyo kooxda

    Erayada furaha: Qaabeynta Jenkins, plugins, meelaynta kala duwan ee kaydinta

Waxa aan qorshaynayaa in aan maqaal gaar ah u hibeeyo tallaabo kasta.

Ujeeddada maqaalladan taxanaha ah maaha sida loo qoro adeeg-yaraha, balse waa sidii looga dhigi lahaa inay ku shaqeeyaan hal nidaam. Inkasta oo dhammaan waxyaalahan oo dhan ay inta badan ka baxsan yihiin mas'uuliyadda horumariyaha, waxaan u maleynayaa inay weli faa'iido u leedahay in la barto iyaga ugu yaraan 20% (taas oo, sida aad ogtahay, sii 80% natiijada). Qaar ka mid ah mawduucyada muhiimka ah ee shuruud la'aanta ah, sida amniga, ayaa laga tagi doonaa mashruucan, maadaama qoraagu wax yar ka fahmay nidaamkan loo abuuray oo keliya isticmaalka shakhsi ahaaneed. Waxaan soo dhawaynayaa ra'yi kasta iyo dhaleecayn wax dhisaysa.

Abuuritaanka adeeg-yaraha

Adeegyada waxaa lagu qoray Java 11 iyadoo la isticmaalayo Spring Boot. Isdhexgalka interservice waxaa loo habeeyey iyadoo la isticmaalayo REST. Mashruucu waxa ku jiri doona tirada ugu yar ee imtixaanada (si markaas hadhow u jiro wax lagu tijaabiyo Jenkins). Koodhka isha ee adeegyada ayaa laga heli karaa GitHub: dhabarka dambe ΠΈ Gateway.

Si aad u awooddo in aad hubiso xaaladda mid kasta oo ka mid ah adeegyada, jileeyaha Spring ayaa lagu daray ku tiirsanaanta. Waxay abuuri doontaa / actuator/caafimaadka dhamaadka waxayna soo celin doontaa heerka 200 haddii adeeggu diyaar u yahay inuu aqbalo taraafikada, ama 504 haddii ay dhibaato jirto. Xaaladdan oo kale, tani waa jeeg khiyaali ah, maadaama adeegyadu aad u fudud yihiin, iyo haddii ay dhacdo xoog majeure, waxay u badan tahay inay noqdaan kuwo gebi ahaanba aan la heli karin intii ay qayb ahaan sii shaqayn lahaayeen. Laakiin nidaamyada dhabta ah, Actuator wuxuu kaa caawin karaa in la ogaado dhibaatada ka hor intaan isticmaalayaashu bilaabin inay la dagaallamaan. Tusaale ahaan, haddii ay jiraan dhibaatooyin gelitaanka xogta xogta, waxaanu si toos ah uga jawaabi karnaa tan annagoo joojinayna codsiyada ka shaqaynta tusaale adeeg oo jabay.

Adeegga dhamaadka dambe

Adeegga dhabarka ayaa si fudud u tirin doona oo soo celin doona tirada codsiyada la aqbalay.

Koodhka xakamaynta:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Tijaabada xakamaynta:

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

Kadinka Adeegga

Albaabka ayaa codsiga u gudbin doona adeega dhabarka, isagoo ku kordhin doona macluumaadka soo socda:

  • irridda id. Waxaa loo baahan yahay si ay suurtogal u tahay in la kala saaro hal tusaale oo ka mid ah albaabbada mid kale iyada oo loo marayo jawaabta serverka
  • Qaar ka mid ah "sirta" oo ciyaari doona doorka erayga sirta ah ee aadka muhiimka ah (lambarka furaha sirta ah ee buskudka muhiimka ah)

Habaynta codsiga.hantiyada:

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

Adabtarka dhabarka dambe:

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

Xakameeyaha:

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

Bilaw

Waxaan bilownaa dhabarka dambe:

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

Bilaabida albaabka:

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

Hubinta:

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

Wax walba way shaqaynayaan. Akhristaha fiiro gaar ah leh wuxuu ogaan doonaa in aysan jirin wax naga horjoogsanaya inaan si toos ah u galno dhabarka dambe, annagoo ka gudubnay albaabka (http://localhost:8081/requests). Si taas loo hagaajiyo, adeegyada waa in lagu daraa hal shabakad, oo albaabka kaliya waa inuu "ku dhego" dibadda.
Sidoo kale, labada adeegba waxay wadaagaan hal nidaam faylal, waxay soo saaraan durdurro iyo hal daqiiqo waxay bilaabi karaan inay farageliyaan midba midka kale. Way fiicnaan lahayd in la go'doomiyo adeegyadeena yaryar. Tan waxaa lagu gaari karaa iyadoo loo qaybinayo codsiyada mashiinada kala duwan (lacag aad u badan, adag), iyadoo la adeegsanayo mashiinnada farsamada (khayraadka degdega ah, bilawga dheer), ama isticmaalka weelka. Sida la filayo, waxaan dooran doorashada saddexaad iyo Docker sida qalab weel.

Docker

Marka la soo koobo, docker wuxuu abuuraa weelal go'doonsan, hal codsi kasta. Si aad u isticmaasho docker, waxaad u baahan tahay inaad qorto Dockerfile - tilmaamaha dhismaha iyo socodsiinta arjiga. Marka xigta, waxaad dhisi kartaa sawirka, geli kartaa diiwaanka sawirka (No. Dockerhub) oo geli adeeg-yarahaaga deegaan kasta oo xiran hal amar.

Dockerfile

Mid ka mid ah sifooyinka ugu muhiimsan ee sawirku waa cabbirkiisa. Sawir kooban ayaa si degdeg ah uga soo degi doona kaydka fog, waxa uu qaadanayaa boos yar, adeegaagu si degdeg ah ayuu u bilaaban doonaa. Sawir kasta ayaa lagu dhisay iyadoo lagu saleynayo sawirka saldhigga, waxaana lagu talinayaa in la doorto ikhtiyaarka ugu yar. Ikhtiyaarka wanaagsan waa Alpine, qaybinta Linux dhamaystiran oo leh baakadaha ugu yar.

Marka hore, aan isku dayno inaan ku qorno Dockerfile "fooraska" (waxaan isla markiiba dhihi doonaa in tani ay tahay hab xun, ha sameynin):

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

Halkan waxaan ku isticmaaleynaa sawirka saldhigga Alpine ee JDK horay loogu rakibay si loo dhiso mashruuceena. Amarka ADD, waxaan ku darnaa tusaha src ee hadda sawirka, ku calaamadee inuu shaqeynayo (WORKDIR) oo bilow dhismaha. Amarka EXPOSE 8080 wuxuu calaamad u dhigayaa in arjiga ku jira weelka uu isticmaali doono dekeddiisa 8080 (tani kama dhigi doonto codsiga dibadda laga heli karo, laakiin waxay u oggolaan doontaa in codsiga laga galo, tusaale ahaan, weel kale oo ku yaal isla shabakadda docker. ).

Si aad adeegyada ugu xirto sawirrada, waxaad u baahan tahay inaad amarrada ka socodsiiso xididka mashruuc kasta:

docker image build . -t msvc-backend:1.0.0

Natiijadu waa sawir 456 MB ah (kaas oo sawirka salka JDK uu qabsaday 340 MB). Iyo dhammaan inkastoo xaqiiqda ah in fasalada mashruucayaga lagu tirin karo farta. Si loo dhimo cabbirka sawirkayaga:

  • Waxaan isticmaalnaa isku-dubarid dhowr tallaabo ah. Tallaabada ugu horreysa waxaan ku dhisi doonaa mashruuca, tallaabada labaad waxaan ku rakibi doonaa JRE ah, iyo in tallaabada saddexaad waxaan ku koobiyeyn doonaa oo dhan galay image cusub oo Alpine nadiif ah. Guud ahaan, kaliya qaybaha lagama maarmaanka ah ayaa ku jiri doona sawirka kama dambaysta ah.
  • Aynu isticmaalno habaynta Java. Laga bilaabo Java 9, waxaad isticmaali kartaa qalabka jlink si aad u abuurto JRE kaliya cutubyada aad u baahan tahay

Qofka wax weydiinaya, halkan waxaa ah maqaal wanaagsan oo ku saabsan hababka dhimista sawirka. https://habr.com/ru/company/ruvds/blog/485650/.

Faylka ugu dambeeya:

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

Waxaan dib u abuurnaa sawirka, natiijaduna, waxay lumisay 6 jeer miisaankeeda, oo gaaraya 77 MB. Ma xuma. Intaa ka dib, sawirada diyaarsan waxaa lagu dhejin karaa diiwaanka sawirka si sawiradaadu diyaar ugu noqdaan in laga soo dejiyo internetka.

Adeegyada wada shaqaynta ee Docker

Si aan ku bilowno, adeegyadeenu waa inay ahaadaan kuwo isku shabakad ah. Waxaa jira dhowr nooc oo shabakado ah oo ku yaala docker, waxaanan isticmaalnaa kuwa ugu qadiimiga ah - buundada, taas oo kuu ogolaaneysa inaad ku xirto weelasha isku midka ah ee ku socda isla martida. Samee shabakad leh amarka soo socda:

docker network create msvc-network

Marka xigta, ku billow weelka dambe ee loo yaqaan 'backend' oo wata adeegaha-yaraha: 1.0.0 sawirka:

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

Waxaa xusid mudan in shabakadda buundada ay bixiso sanduuqa helitaanka adeegga weelasha magacyadooda. Taasi waa, adeegga dhabarka ayaa laga heli doonaa gudaha shabakadda docker-ka http://backend:8080.

Bilaabida albaabka:

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

Amarkan, waxaanu ku muujinaynaa inaanu u gudbinayno dekedda 80 ee aanu martida u nahay dekedda 8080 ee konteenarka. Waxaan u isticmaalnaa ikhtiyaarka env si aan u dejino doorsoomayaasha deegaanka oo si toos ah loo akhrin doono gu'ga oo aan ka saarno guryaha app-ka.

Ka dib bilawga, waanu wacnaa http://localhost/ oo hubi in wax walba ay shaqeeyaan, sida kiiskii hore.

gunaanad

Natiijo ahaan, waxaanu abuurnay laba adeeg oo yar yar, waxaanu ku xidhnay weelasha docker-ka oo aanu ku wada dirnay isla mishiinka. Nidaamka ka soo baxay, si kastaba ha ahaatee, wuxuu leeyahay tiro faa'iido darrooyin ah:

  • Dulqaad xumo liidata - wax walbaa waxay noogu shaqeeyaan hal server
  • Miisaanka liidata - marka rarka uu kordho, way fiicnaan lahayd in si toos ah loo geeyo tusaaleyaal adeeg oo dheeraad ah oo la isku dheelitiro culeyska dhexdooda
  • Kakanaanta bilawga - waxaan u baahanahay inaan galno ugu yaraan 3 amarro, iyo cabbirro gaar ah (tani waxay kaliya u tahay 2 adeegyo)

Si loo xaliyo dhibaatooyinka kor ku xusan, waxaa jira tiro xalal ah sida Docker Swarm, Nomad, Kubernetes ama OpenShift. Haddii nidaamka oo dhan uu ku qoran yahay Java, waxaad eegi kartaa dhinaca Spring Cloud (maqaal wanaagsan).

Π’ qaybta xigta Waxaan ka hadli doonaa sidaan u dejiyay Kubernetes oo aan u geeyay mashruuca Google Kubernetes Engine.

Source: www.habr.com

Add a comment