A'oa'o pe fa'afefea ona fa'aogaina microservices. Vaega 1. Spring Boot ma Docker

A'oa'o pe fa'afefea ona fa'aogaina microservices. Vaega 1. Spring Boot ma Docker

Talofa Habr.

I lenei tusiga, ou te fia talanoa e uiga i loʻu poto masani i le fatuina o se siosiomaga e aʻoaʻo ai mo le faʻataʻitaʻiga i microservices. Pe a aʻoaʻoina meafaigaluega fou uma, sa ou manaʻo e faʻataʻitaʻi e le gata i luga o laʻu masini faʻapitonuʻu, ae faʻapea foi i tulaga sili atu ona moni. O le mea lea, na ou filifili ai e fatuina se talosaga microservice faigofie, lea e mafai ona "tautau" mulimuli ane i ituaiga uma o tekinolosi manaia. O le mana'oga autu mo le poloketi o lona maualuga maualuga o le fa'atinoina o le latalata i le faiga moni.

I le taimi muamua, na ou vaevaeina le fausiaina o le poloketi i ni laasaga:

  1. Fausia ni 'au'aunaga se lua - 'backend' ma le 'gateway', fa'apipi'i i ata faifa'ato'aga ma fa'atulaga e galulue fa'atasi

    upu autu: Java 11, Spring Boot, Docker, faʻaleleia ata

  2. Atina'e o le Kubernetes le fa'atulagaina ma le fa'aogaina o faiga ile Google Kubernetes Engine

    Keywords: Kubernetes, GKE, pulega o punaoa, autoscaling, mealilo

  3. Fausia se siata e faʻaaoga ai le Helm 3 mo le sili atu ona lelei le puleaina o fuifui

    Upu autu: Helm 3, fa'apipi'iina o siata

  4. Fa'atulaga Jenkins ma le paipa e otometi le tu'uina atu o le code i le fuifui

    Keywords: Jenkins configuration, plugins, eseese configs repository

Ou te fuafua e tuʻuina atu se tusiga eseese i laasaga taʻitasi.

O le taulaiga o lenei faasologa o tala e le o le auala e tusi ai microservices, ae faʻafefea ona faʻaogaina i latou i se faiga e tasi. E ui o nei mea uma e masani lava i fafo atu o le matafaioi a le tagata atiaʻe, ou te manatu e aoga pea le itiiti ifo i le 20% masani ia i latou (lea e iloa e faʻatatau mo le 80% o le taunuuga). O nisi autu taua tele, e pei o le saogalemu, o le a tuʻua i fafo o lenei poloketi, talu ai e itiiti se malamalama o le tusitala e uiga i lenei mea; o le faiga o loʻo faia faʻapitoa mo le faʻaogaina e le tagata lava ia. Ou te talia so'o se manatu ma ni faitioga aoga.

Fausia microservices

O auaunaga na tusia i Java 11 faʻaaoga Spring Boot. O feso'ota'iga va'ava'ai va'ava'ai fa'atulagaina e fa'aaoga ai le REST. O le poloketi o le a aofia ai se numera laʻititi o suʻega (ina ia mulimuli ane iai se mea e suʻe i Jenkins). O loʻo maua le faʻailoga autu mo auaunaga ile GitHub: pito i tua и faitotoa.

Ina ia mafai ona siaki le tulaga o auaunaga taitasi, sa faaopoopo le Spring Actuator i lo latou faalagolago. O le a faia ai se fa'ai'uga / actuator / soifua maloloina ma o le a toe fa'afo'i le tulaga o le 200 pe afai o le 'au'aunaga ua sauni e talia fefa'ataua'iga, po'o le 504 pe a iai ni fa'afitauli. I lenei tulaga, o se siaki pepelo, talu ai o auaunaga e matua faigofie lava, ma i lalo o se ituaiga malosi majeure o le a sili atu ona latou le maua atoatoa nai lo le tumau i se vaega o galuega. Ae i faiga moni, Actuator e mafai ona fesoasoani e suʻesuʻe se faʻafitauli aʻo leʻi amata ona taia e tagata faʻaoga. Mo se faʻataʻitaʻiga, afai e tulaʻi mai faʻafitauli i le avanoa i le database, o le a mafai ona matou tali atu i lenei mea e ala i le taofi o le faʻaogaina o talosaga ma se faʻalavelave gau o le tautua.

Auaunaga pito i tua

O le au'aunaga pito i tua o le a na'o le faitau ma toe fa'afo'i le numera o talosaga talia.

Pule code:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Su'ega Pule:

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

Auaunaga faitotoa

O le faitotoa o le a tuʻuina atu le talosaga i le auʻaunaga pito i tua, faʻaopoopo i ai faʻamatalaga nei:

  • faitotoa id. E manaʻomia ina ia mafai ona iloa le tasi faʻataʻitaʻiga o le faitotoa mai le isi e ala i le tali a le server
  • O se "mea lilo" patino o le a faia le matafaioi o se upu faʻamaonia taua tele (numera autu mo faʻamatalaga o se kuki taua)

Fa'atonuga ile application.properties:

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

Fetuuna'i mo feso'ota'iga ma le pito i tua:

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

Pule:

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

Fa'alauiloa:

Sei o tatou fa'alauiloa le pito i tua:

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

Tatou amata le faitotoa:

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

Matou siaki:

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

O loʻo galue mea uma. O le a maitauina e le tagata faitau faʻalogo e leai se mea e taofia ai i tatou mai le faʻaogaina saʻo o le pito i tua, le pasia o le faitotoa (http://localhost:8081/requests). Ina ia faʻaleleia lenei mea, e tatau ona tuʻufaʻatasia le 'auʻaunaga i le tasi fesoʻotaʻiga, ma naʻo le faitotoa e tatau ona "tutu i fafo" i fafo.
E le gata i lea, o auaunaga uma e lua e tutusa le faila faila, faʻatupu filo, ma i se tasi taimi e mafai ona amata faʻalavelave le tasi i le isi. E manaia le tu'u'ese'ese o a tatou 'au'aunaga laiti. E mafai ona ausia lenei mea e ala i le tufatufaina atu o talosaga i masini eseese (tele tupe, faigata), faʻaaogaina masini faʻapitoa (punaoa-malosi, amataga umi) poʻo le faʻaogaina o containerization. E pei ona faʻamoemoeina, matou te filifilia le filifiliga lona tolu ma Docker e avea o se meafaigaluega mo containerization.

Docker

I se faapuupuuga, e faia e Docker ni atigipusa tuufua, tasi i le talosaga. Mo le faʻaaogaina o Docker, e tatau ona e tusia se Dockerfile - faʻatonuga mo le fausiaina ma le faʻaogaina o le talosaga. Le isi, e mafai ona e fausia le ata, faʻapipiʻi i le resitala ata (No. Dockerhub) ma faʻapipiʻi lau microservice i soʻo se siosiomaga faʻapipiʻiina i le tasi poloaiga.

faila faila

O se tasi o uiga sili ona taua o se ata o lona telē. O se ata fa'akomepiuta o le a vave ona la'u maia mai se fale teu oloa, fa'aitiitia avanoa, ma o le a vave ona amata lau tautua. Soʻo se ata e fausia i luga o le faʻavae o se ata faʻavae, ma e fautuaina e filifili le filifiliga sili ona itiiti. O se filifiliga lelei o le Alpine, o se faʻasalalauga Linux atoatoa ma se laʻititi o afifi.

Muamua, sei o tatou taumafai e tusi se Dockerfile "ulu-ulu" (O le a ou fai atu i le taimi lava lena o se auala leaga lenei, aua le faia):

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

O iinei o loʻo matou faʻaogaina ai se ata faʻavae Alpine ma le JDK ua uma ona faʻapipiʻiina e fausia ai la matou poloketi. I le faʻaaogaina o le faʻatonuga ADD, matou te faʻaopoopoina le src directory o loʻo i ai nei i le ata, faʻailoga o loʻo galue (WORKDIR) ma amata le fausiaina. O le EXPOSE 8080 poloaiga o loʻo faʻaalia ai le faʻailoga o le talosaga i totonu o le koneteina o le a faʻaogaina lona port 8080 (o le a le mafai ai ona maua le talosaga mai fafo, ae o le a faʻatagaina le talosaga e maua, mo se faʻataʻitaʻiga, mai se isi koneteina i luga ole fesoʻotaʻiga docker tutusa. ).

Ina ia faʻapipiʻi auʻaunaga i ata, e tatau ona e faʻatautaia poloaiga mai le aʻa o galuega taʻitasi:

docker image build . -t msvc-backend:1.0.0

O se taunuuga, matou te maua se ata o le 456 MB i le tele (lea na ave ai le ata JDK 340 faavae MB). Ma o mea uma e ui lava i le mea moni o vasega i la tatou galuega faatino e mafai ona faitauina i le tamatamailima e tasi. Ina ia faʻaititia le tele o la matou ata:

  • Matou te faʻaaogaina le tele-step assembly. I le laasaga muamua matou te faʻapipiʻiina le poloketi, i le lona lua matou te faʻapipiʻi le JRE, ma i le laasaga lona tolu o le a matou kopiina uma nei mea i se ata fou Alpine mama. I le aofaʻi, o le ata mulimuli o le a aofia ai naʻo vaega manaʻomia.
  • Sei o tatou faʻaogaina le java modularization. Amata i le Java 9, e mafai ona e faʻaogaina le meafaigaluega jlink e fatu ai se JRE mai na o modules e te manaʻomia

Mo le fia iloa, o se tala lelei lenei e uiga i auala e faʻaititia ai le tele o ata https://habr.com/ru/company/ruvds/blog/485650/.

Fa'ailoga Fa'ai'u:

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

Na matou toe faia le ata, ma iu ai ina 6 taimi manifinifi, e tusa ma le 77 MB. E leai se leaga. A maeʻa, e mafai ona tuʻuina atu ata ua maeʻa i le resitala ata ina ia avanoa au ata mo le siiina mai le Initaneti.

Faʻatasi auaunaga i Docker

I le amataga, e tatau ona i ai a matou auaunaga i luga o le upega tafailagi tutusa. E tele ituaiga o fesoʻotaʻiga i Docker, ma matou te faʻaaogaina le mea sili ona taua - alalaupapa, lea e mafai ai ona e faʻaogaina pusa fesoʻotaʻiga i luga o le talimalo e tasi. Se'i o tatou faia se feso'ota'iga ma le fa'atonuga lea:

docker network create msvc-network

Le isi, se'i o tatou fa'alauiloa se koneteina pito i tua e ta'ua o le 'backend' ma le ata microservices-backend:1.0.0:

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

E taua le maitauina o le alalaupapa fesoʻotaʻiga e maua ai le suʻesuʻeina o auaunaga mai le pusa mo pusa io latou igoa. O lona uiga, o le a maua le auaunaga i tua i totonu o le Docker network i http://backend:8080.

Tatou amata le faitotoa:

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

I lenei poloaiga matou te faʻaalia o loʻo matou tuʻuina atu le taulaga 80 o le matou talimalo i le taulaga 8080 o le pusa. Matou te fa'aogaina filifiliga env e seti ai suiga o le si'osi'omaga o le a otometi lava ona faitau i le tautotogo ma fa'amalo ai meatotino mai le application.properties.

A uma ona fa'alauiloa, vala'au http://localhost/ ma ia mautinoa e lelei mea uma, e pei o le mataupu muamua.

iʻuga

O le mea na tupu, na matou faia ni microservices faigofie se lua, faʻapipiʻi i totonu o koneteina docker ma faʻalauiloa faʻatasi i luga o le masini lava e tasi. Ae ui i lea, o le faiga e maua ai, e iai ni faʻaletonu:

  • Le lelei fa'apalepale fa'aletonu - o mea uma e galue i luga o le tasi server mo matou
  • Le lelei le faʻaleleia - aʻo faʻatuputeleina le uta, e manaia le faʻapipiʻiina otometi faʻaopoopoga auaunaga faʻapitoa ma faapaleni le uta i le va o latou.
  • Faʻalavelave faʻalavelave - matou te manaʻomia le faʻaogaina o le itiiti ifo i le 3 poloaiga, faʻatasi ai ma ni faʻamaufaʻailoga (naʻo le 2 auaunaga)

Ina ia foia faʻafitauli o loʻo i luga, o loʻo i ai le tele o fofo e pei ole Docker Swarm, Nomad, Kubernetes poʻo OpenShift. Afai o le polokalama atoa o loʻo tusia i Java, e mafai ona e vaʻai i le Spring Cloud (tala lelei).

В isi vaega O le a ou taʻu atu ia te oe le auala na ou setiina ai Kubernetes ma faʻapipiʻi le poloketi ile Google Kubernetes Engine.

puna: www.habr.com

Faaopoopo i ai se faamatalaga