E aʻo pehea e kau ai i nā microservice. Mahele 1. Spring Boot a me Docker

E aʻo pehea e kau ai i nā microservice. Mahele 1. Spring Boot a me Docker

Aloha Habr.

Ma kēia ʻatikala, makemake wau e kamaʻilio e pili ana i kaʻu ʻike i ka hoʻokumu ʻana i kahi ʻano aʻo no ka hoʻokolohua me nā microservices. Ke aʻo nei au i kēlā me kēia mea hana hou, makemake mau wau e hoʻāʻo ʻaʻole wale ma kaʻu mīkini kūloko, akā i nā kūlana ʻoi aku ka ʻoiaʻiʻo. No laila, ua hoʻoholo wau e hana i kahi noi microservice maʻalahi, hiki ke "kau" ma hope me nā ʻano ʻenehana hoihoi. ʻO ke koi nui no ka papahana, ʻo ia ka pili kokoke loa i ka ʻōnaehana maoli.

I ka hoʻomaka ʻana, ua hoʻokaʻawale au i ka hana ʻana o ka papahana i kekahi mau ʻanuʻu:

  1. E hana i ʻelua mau lawelawe - 'backend' a me 'gateway', e hoʻopili iā lākou i nā kiʻi docker a hoʻonohonoho iā lākou e hana pū.

    Hua'ōlelo: Java 11, Spring Boot, Docker, hoʻonui kiʻi

  2. Hoʻomohala ʻana i ka hoʻonohonoho hoʻonohonoho a me ka ʻōnaehana hoʻonohonoho Kubernetes ma Google Kubernetes Engine

    Hua'ōlelo: Kubernetes, GKE, hoʻokele waiwai, autoscaling, mea huna

  3. E hana i kahi pakuhi me ka Helm 3 no ka hoʻokele hui ʻoi aku ka maikaʻi

    Hua'ōlelo: Helm 3, hoʻolālā pakuhi

  4. Hoʻonohonoho ʻo Jenkins a me ka pipeline e hāʻawi i nā code i ka hui

    Hua'ōlelo: Jenkins configuration, plugins, kaawale configs waihona

Hoʻolālā wau e hāʻawi i kahi ʻatikala kaʻawale i kēlā me kēia pae.

ʻO ka manaʻo nui o kēia pūʻulu ʻatikala ʻaʻole pehea e kākau ai i nā microservices, akā pehea e hana ai iā lākou i loko o kahi ʻōnaehana hoʻokahi. ʻOiai ʻo kēia mau mea āpau ma waho o ke kuleana o ka mea hoʻomohala, manaʻo wau he mea pono ke ʻike ma kahi o 20% ma lalo o lākou (kahi i ʻike ʻia he 80% o ka hopena). E haʻalele ʻia kekahi mau kumuhana koʻikoʻi, e like me ka palekana, no ka mea ʻaʻole maopopo ka mea kākau e pili ana i kēia; ke hana ʻia nei ka ʻōnaehana no ka hoʻohana pilikino. Aloha au i nā manaʻo a me nā ʻōlelo hoʻohewa.

Ke hana ʻana i nā Microservice

Ua kākau ʻia nā lawelawe ma Java 11 me ka hoʻohana ʻana i ka Spring Boot. Hoʻonohonoho ʻia ke kamaʻilio ma waena o ka lawelawe me REST. E komo ka papahana i ka helu liʻiliʻi o nā hoʻāʻo (no laila e loaʻa kahi mea e hoʻāʻo ai ma Jenkins). Loaʻa ka code kumu no nā lawelawe ma GitHub: hope hope и ʻīpuka.

No ka hiki ke nānā i ke kūlana o kēlā me kēia lawelawe, ua hoʻohui ʻia kahi Spring Actuator i ko lākou hilinaʻi. E hoʻokumu ia i kahi hopena / actuator / olakino a e hoʻihoʻi i ke kūlana o 200 inā mākaukau ka lawelawe e ʻae i ke kaʻa, a i ʻole 504 inā pilikia. I kēia hihia, he hōʻoia noʻonoʻo kēia, no ka mea, maʻalahi loa nā lawelawe, a ma lalo o kekahi ʻano force majeure ʻoi aku ka nui o ka loaʻa ʻole ʻana ma mua o ka hoʻomau ʻana i ka hana. Akā i nā ʻōnaehana maoli, hiki i ka Actuator ke kōkua i ka ʻike ʻana i kahi pilikia ma mua o ka hoʻomaka ʻana o nā mea hoʻohana e paʻi iā ia. No ka laʻana, inā e kū mai nā pilikia me ka loaʻa ʻana o ka waihona, hiki iā mākou ke pane ʻokoʻa i kēia ma ka hoʻōki ʻana i nā noi noi me kahi hiʻohiʻona haʻihaʻi o ka lawelawe.

lawelawe hope

E helu wale ka lawelawe hope a hoʻihoʻi i ka helu o nā noi i ʻae ʻia.

Palapala hoʻomalu:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Hoʻāʻo hoʻoponopono:

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

lawelawe puka puka

Na ka ʻīpuka e hoʻouna i ke noi i ka lawelawe hope, me ka hoʻohui ʻana me kēia ʻike:

  • puka id. Pono ia i hiki ke hoʻokaʻawale ʻia kekahi laʻana o ka ʻīpuka mai kekahi e ka pane kikowaena
  • ʻO kekahi "mea huna" e hoʻokani i kahi ʻōlelo huna koʻikoʻi (helu kī no ka hoʻopili ʻana i kahi kuki koʻikoʻi)

Ka hoʻonohonoho ʻana ma application.properties:

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

Mea hoʻopili no ke kamaʻilio ʻana me ka hope hope:

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

Mea hooponopono:

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

Hoʻomaka:

E hoʻomaka kākou i ka hope:

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

E hoʻomaka kākou i ka ʻīpuka:

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

E nānā mākou:

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

Ke hana nei nā mea a pau. E hoʻomaopopo ka mea heluhelu hoʻolohe ʻaʻohe mea e pale iā mākou mai ke komo pololei ʻana i ke kua hope, ke kaʻe ʻana i ka ʻīpuka (http://localhost:8081/requests). No ka hoʻoponopono ʻana i kēia, pono e hoʻohui ʻia nā lawelawe i hoʻokahi pūnaewele, a ʻo ka ʻīpuka wale nō e "kū i waho" ma waho.
Eia kekahi, kaʻana like nā lawelawe ʻelua i ka ʻōnaehana faila, hana i nā kaula, a i kahi manawa hiki ke hoʻomaka e hoʻopilikia kekahi i kekahi. He mea maikaʻi e hoʻokaʻawale i kā mākou microservice. Hiki ke hoʻokō ʻia kēia ma ka hāʻawi ʻana i nā noi ma nā mīkini like ʻole (nui ke kālā, paʻakikī), me ka hoʻohana ʻana i nā mīkini virtual (ke kumu waiwai, hoʻomaka lōʻihi) a i ʻole ka hoʻohana ʻana i ka containerization. E like me ka mea i manaʻo ʻia, koho mākou i ke koho ʻekolu a Docker ma ke ʻano he mea hana no ka containerization.

Docker

I ka pōkole, hana ʻo Docker i nā ipu kaʻawale, hoʻokahi no ka noi. No ka hoʻohana ʻana iā Docker, pono ʻoe e kākau i kahi Dockerfile - nā ʻōlelo aʻoaʻo no ke kūkulu ʻana a me ka holo ʻana i ka noi. A laila, hiki iā ʻoe ke kūkulu i ke kiʻi, e hoʻouka iā ia i ka papa inoa kiʻi (No. Dockerhub) a kau i kāu microservice ma kekahi wahi dockerized i hoʻokahi kauoha.

dockerfile

ʻO kekahi o nā hiʻohiʻona nui o ke kiʻi ʻo kona nui. E hoʻoiho wikiwiki ʻia kahi kiʻi paʻa mai kahi waihona mamao, e liʻiliʻi ka lumi, a e hoʻomaka wikiwiki kāu lawelawe. Kūkulu ʻia kēlā me kēia kiʻi ma ke kumu o kahi kiʻi kumu, a ua ʻōlelo ʻia e koho i ka koho minimalistic loa. ʻO kahi koho maikaʻi ʻo Alpine, kahi hoʻolaha Linux piha me ka liʻiliʻi o nā pūʻolo.

ʻO ka mea mua, e hoʻāʻo mākou e kākau i kahi Dockerfile "head-on" (E ʻōlelo koke wau he ala ʻino kēia, mai hana ʻoe):

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

Eia mākou ke hoʻohana nei i kahi kiʻi kumu Alpine me ka JDK i hoʻokomo mua ʻia e kūkulu i kā mākou papahana. Ke hoʻohana nei i ke kauoha ADD, hoʻohui mākou i ka papa kuhikuhi src o kēia manawa i ke kiʻi, e kaha iā ia e hana ana (WORKDIR) a hoʻomaka i ke kūkulu. Nā hōʻailona kauoha EXPOSE 8080 i docker e hoʻohana ka noi i loko o ka pahu i kāna awa 8080 (ʻaʻole e hiki ke kiʻi i ka noi mai waho, akā e ʻae i ka noi e komo, no ka laʻana, mai kahi pahu ʻē aʻe ma ka pūnaewele docker like. ).

No ka hoʻopili ʻana i nā lawelawe i nā kiʻi, pono ʻoe e holo i nā kauoha mai ke kumu o kēlā me kēia papahana:

docker image build . -t msvc-backend:1.0.0

ʻO ka hopena, loaʻa iā mākou kahi kiʻi o 456 MB i ka nui (kahi i lawe ʻia e ke kumu JDK 340 kiʻi MB). A ʻo nā mea āpau me ka ʻoiaʻiʻo e hiki ke helu ʻia nā papa o kā mākou papahana ma ka manamana lima. No ka ho'ēmi i ka nui o kā mākou kiʻi:

  • Hoʻohana mākou i ka hui multi-step. Ma ka hana mua e hōʻuluʻulu mākou i ka papahana, ma ka lua e hoʻokomo mākou i ka JRE, a ma ke kolu o ka hana e kope mākou i kēia mau mea a pau i kahi kiʻi Alpine maʻemaʻe hou. ʻO ka huina, e loaʻa i ke kiʻi hope nā mea pono wale nō.
  • E hoʻohana kākou i ka modularization java. E hoʻomaka me Java 9, hiki iā ʻoe ke hoʻohana i ka mea hana jlink e hana i kahi JRE mai nā modules āu e pono ai

No ka poʻe hoihoi, eia kahi ʻatikala maikaʻi e pili ana i nā ala e hōʻemi ai i ka nui o nā kiʻi https://habr.com/ru/company/ruvds/blog/485650/.

Kōnae Docker hope:

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

Hana hou mākou i ke kiʻi, a ua lilo ia i 6 manawa ʻoi aku ka lahilahi, ʻoi aku ka 77 MB. ʻaʻole maikaʻi ʻole. Ma hope, hiki ke hoʻouka ʻia nā kiʻi i hoʻopau ʻia i ka waihona kiʻi i hiki ke loaʻa kāu mau kiʻi no ka hoʻoiho ʻana mai ka Pūnaewele.

E holo pū ana i nā lawelawe ma Docker

I ka hoʻomaka ʻana, pono kā mākou lawelawe ma ka pūnaewele like. Nui nā ʻano pūnaewele ma Docker, a hoʻohana mākou i ka mea kahiko loa o lākou - alahaka, kahi e hiki ai iā ʻoe ke hoʻohana i nā ipu pūnaewele e holo ana ma ka host hoʻokahi. E hana kākou i kahi pūnaewele me kēia kauoha:

docker network create msvc-network

A laila, e hoʻolauna i kahi pahu hope i kapa ʻia ʻo 'backend' me ke kiʻi microservices-backend:1.0.0:

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

He mea pono e hoʻomaopopo i ka hāʻawi ʻana o ka ʻupena alahaka i ka ʻike lawelawe ma waho o ka pahu no nā ipu ma ko lākou mau inoa. ʻO ia, e loaʻa ka lawelawe backend i loko o ka pūnaewele Docker ma http://backend:8080.

E hoʻomaka kākou i ka ʻīpuka:

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

Ma kēia kauoha, hōʻike mākou e hoʻouna ana mākou i ke awa 80 o kā mākou mea hoʻokipa i ke awa 8080 o ka ipu. Hoʻohana mākou i nā koho env no ka hoʻonohonoho ʻana i nā ʻano hoʻololi kaiapuni e heluhelu ʻia e ka pūnāwai a kāpae i nā waiwai mai application.properties.

Ma hope o ka hoʻomaka ʻana, kelepona http://localhost/ a e hōʻoia i ka holo ʻana o nā mea a pau, e like me ka hihia ma mua.

hopena

ʻO ka hopena, ua hana mākou i ʻelua microservices maʻalahi, hoʻopili iā lākou i loko o nā pahu docker a hoʻokuʻu pū iā lākou ma ka mīkini hoʻokahi. ʻO ka ʻōnaehana hopena, akā naʻe, he nui nā hemahema:

  • Ka hoʻomanawanui hewa - hana nā mea a pau ma kahi kikowaena no mākou
  • Ka scalability maikaʻi ʻole - i ka piʻi ʻana o ka ukana, ʻoi aku ka maikaʻi o ke kau ʻana i nā manawa lawelawe hou aʻe a kaulike i ka ukana ma waena o lākou.
  • ʻO ka paʻakikī paʻakikī - pono mākou e hoʻokomo ma kahi o 3 mau kauoha, me kekahi mau ʻāpana (no nā lawelawe 2 wale nō kēia)

No ka hoʻoponopono ʻana i nā pilikia i luna, aia kekahi mau hoʻonā e like me Docker Swarm, Nomad, Kubernetes a i ʻole OpenShift. Inā kākau ʻia ka ʻōnaehana holoʻokoʻa ma Java, hiki iā ʻoe ke nānā iā Spring Cloud (hua maikaʻi).

В ʻāpana aʻe E haʻi aku wau iā ʻoe e pili ana i kaʻu hoʻonohonoho ʻana i nā Kubernetes a kau i ka papahana i Google Kubernetes Engine.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka