Mụta ka esi ebuga microservices. Part 1. Mmiri Boot na Docker

Mụta ka esi ebuga microservices. Part 1. Mmiri Boot na Docker

Hey Habr.

N'isiokwu a, achọrọ m ikwu maka ahụmịhe m na ịmepụta ebe mmụta maka ịnwale microservices. Mgbe m mụtara ngwá ọrụ ọhụrụ ọ bụla, achọrọ m ịnwale ya ọ bụghị naanị na igwe mpaghara, kamakwa n'ọnọdụ ndị ọzọ dị adị. Ya mere, ekpebiri m ịmepụta ngwa ngwa microservice dị mfe, nke nwere ike "kpuchie" na ụdị teknụzụ niile na-adọrọ mmasị. Isi ihe achọrọ maka oru ngo a bụ oke ọrụ ya dị nso na ezigbo usoro.

Na mbụ, m mebiri mmepụta nke ọrụ ahụ n'ime ọtụtụ usoro:

  1. Mepụta ọrụ abụọ - 'backend' (azụ azụ) na 'ọnụ ụzọ ámá' (ọnụ ụzọ ámá), tinye ha n'ime onyonyo docker wee hazie ha ka ha rụọ ọrụ ọnụ.

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

  2. Mmepe nke nhazi Kubernetes na ntinye usoro na Google Kubernetes Engine

    Keywords: Kubernetes, GKE, njikwa akụ, autoscaling, nzuzo

  3. Ịmepụta eserese na Helm 3 maka njikwa ụyọkọ ka mma

    Tags: Helm 3, eserese ngosi

  4. Ịtọlite ​​Jenkins na pipeline maka ịnyefe koodu akpaka na ụyọkọ ahụ

    Keywords: Jenkins nhazi, plugins, iche iche configs repository

M na-eme atụmatụ itinye otu isiokwu dị iche na nzọụkwụ ọ bụla.

Ihe a na-elekwasị anya n'usoro isiokwu a abụghị ka esi ede microservices, kama otu esi eme ka ha rụọ ọrụ n'otu usoro. Ọ bụ ezie na ihe ndị a niile na-abụkarị n'èzí ọrụ nke onye mmepụta, echere m na ọ ka bara uru ịmara ha ma ọ dịkarịa ala 20% (nke, dịka ị maara, nye 80% nke nsonaazụ). Ụfọdụ isiokwu ndị dị mkpa na-enweghị atụ, dị ka nchekwa, ga-ahapụ na ọrụ a, ebe ọ bụ na onye edemede ahụ aghọtachaghị banyere usoro a ka e kere naanị maka ojiji nkeonwe. Ana m anabata echiche ọ bụla na nkatọ bara uru.

Ịmepụta microservices

Edere ọrụ ndị a na Java 11 site na iji Spring Boot. A na-ahazi mmekọrịta interservice site na iji REST. Ihe oru ngo a ga-agụnye opekempe ule (nke mere na emesia enwere ihe a ga-anwale na Jenkins). Koodu isi mmalite maka ọrụ ndị a dị na GitHub: azụ azụ и Ọnụ ụzọ ámá.

Iji nwee ike ịlele ọkwa nke ọrụ ọ bụla, agbakwunyere Spring Actuator na ndabere ha. Ọ ga-emepụta njedebe / actuator / ahụike ma weghachi ọnọdụ 200 ma ọ bụrụ na ọrụ ahụ dị njikere ịnakwere okporo ụzọ, ma ọ bụ 504 ma ọ bụrụ na enwere nsogbu. N'okwu a, nke a bụ nlele akụkọ ifo, ebe ọ bụ na ọrụ ndị ahụ dị nnọọ mfe, na n'ọnọdụ ụfọdụ ike majeure, ọ ga-abụ na ha agaghị adị kpamkpam karịa ka ha na-arụ ọrụ. Mana n'ime ezigbo sistemụ, Actuator nwere ike inye aka chọpụta nsogbu tupu ndị ọrụ amalite ịlụ ọgụ maka ya. Dịka ọmụmaatụ, ọ bụrụ na enwere nsogbu ịnweta nchekwa data, anyị nwere ike ịzaghachi nke a ozugbo site na ịkwụsị nhazi arịrịọ site na iji ihe atụ ọrụ agbajiri.

Ọrụ ngwụcha azụ

Ọrụ azụ azụ ga-agụ naanị wee weghachi ọnụọgụ arịrịọ anabatara.

Koodu njikwa:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Nnwale njikwa:

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

Ọnụ ụzọ ọrụ

Ọnụ ụzọ ámá ahụ ga-ebuga arịrịọ ahụ na ọrụ backend, na-agbakwunye ya na ozi ndị a:

  • ọnụ ụzọ id. Ọ dị mkpa ka o wee nwee ike ịmata ọdịiche nke otu ihe atụ nke ọnụ ụzọ ámá site na nke ọzọ site na nzaghachi nkesa
  • Ụfọdụ "nzuzo" nke ga-arụ ọrụ nke paswọọdụ dị oke mkpa (ọnụọgụ igodo nzuzo nke kuki dị mkpa)

Nhazi na ngwa.properties:

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

Ihe nkwụnye azụ:

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

Onye njikwa:

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

Mmalite:

Anyị na-amalite azụ azụ:

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

Malite ọnụ ụzọ ámá:

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

Anyị na-elele:

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

Ihe niile na-arụ ọrụ. Onye na-agụ nke ọma ga-achọpụta na ọ nweghị ihe na-egbochi anyị ịbanye na azụ azụ ozugbo, na-agafe ọnụ ụzọ ámá (http://localhost:8081/requests). Iji dozie nke a, a ga-ejikọta ọrụ ndị ahụ n'ime otu netwọk, na naanị ọnụ ụzọ ámá kwesịrị "ịpụ" n'èzí.
Ọzọkwa, ọrụ abụọ ahụ na-ekerịta otu usoro faịlụ, na-emepụta iyi na n'otu oge nwere ike ịmalite igbochi ibe ha. Ọ ga-adị mma ikewapụ obere ọrụ anyị. Enwere ike nweta nke a site na ikesa ngwa na igwe dị iche iche (ọtụtụ ego, siri ike), na-eji igwe mebere (ike akụrụngwa, mmalite ogologo oge), ma ọ bụ iji arịa. Dị ka a tụrụ anya, anyị na-ahọrọ nhọrọ nke atọ na Docker dị ka ngwá ọrụ maka containerization.

Docker

Na nkenke, docker na-emepụta akpa dịpụrụ adịpụ, otu ngwa. Iji jiri docker, ịkwesịrị ide Dockerfile - ntuziaka maka iwulite na ịme ngwa ahụ. Na-esote, ị nwere ike wuo onyonyo a, bulite ya na ndekọ ihe onyonyo (Mba. Dockerhub) ma tinye microservice gị n'ebe ọ bụla dockerized n'otu iwu.

dockerfile

Otu n'ime njirimara kachasị mkpa nke ihe oyiyi bụ nha ya. Onyonyo kọmpat ga-ebudata ngwa ngwa site na ebe nchekwa dịpụrụ adịpụ, were obere ohere, ọrụ gị ga-amalite ngwa ngwa. A na-ewu ihe oyiyi ọ bụla na ndabere nke ihe oyiyi isi, a na-atụ aro ka ịhọrọ nhọrọ kacha nta. Nhọrọ dị mma bụ Alpine, nkesa Linux zuru oke yana obere ngwugwu.

Iji malite, ka anyị gbalịa dee Dockerfile "n'egedege ihu" (M ga-ekwu ozugbo na nke a bụ ụzọ ọjọọ, emela ya):

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

N'ebe a, anyị na-eji ihe oyiyi ntọala Alpine nwere JDK arụnyerelarị iji wuo ọrụ anyị. Site na iwu ADD, anyị na-agbakwunye ndekọ src dị ugbu a na onyonyo a, kaa ya akara ka ọ na-arụ ọrụ (WORKDIR) wee malite wuo ya. Iwu EXPOSE 8080 na-egosi docker na ngwa n'ime akpa ahụ ga-eji ọdụ ụgbọ mmiri 8080 ya (nke a agaghị eme ka ngwa ahụ si n'èzí nweta ya, mana ọ ga-ekwe ka ịnweta ngwa ahụ, dịka ọmụmaatụ, site na akpa ọzọ n'otu netwọọdụ docker). ).

Iji tinye ọrụ n'ime onyonyo, ịkwesịrị ịme iwu site na mgbọrọgwụ nke ọrụ ọ bụla:

docker image build . -t msvc-backend:1.0.0

Ihe si na ya pụta bụ onyonyo 456 MB (nke ihe onyonyo JDK dị na ya nwere 340 MB). Na ihe niile n'agbanyeghị eziokwu na klaasị na ọrụ anyị nwere ike ịgụ na mkpịsị aka. Iji wedata nha onyonyo anyị:

  • Anyị na-eji mgbakọ ọtụtụ nzọụkwụ. Na nzọụkwụ mbụ anyị ga-ewu ọrụ ahụ, na nke abụọ nzọụkwụ anyị ga-etinye JRE, na na nke atọ nzọụkwụ anyị ga-eṅomi ya niile n'ime ọhụrụ dị ọcha Alpine oyiyi. Na mkpokọta, naanị ihe ndị dị mkpa ga-adị na foto ikpeazụ.
  • Ka anyị jiri modularization nke java. Malite na Java 9, ị nwere ike iji jlink ngwá ọrụ ịmepụta JRE site na naanị modul ị chọrọ

Maka ndị na-ajụ ajụjụ, ebe a bụ akụkọ dị mma na ụzọ mbelata ihe oyiyi. https://habr.com/ru/company/ruvds/blog/485650/.

Mpempe akwụkwọ ikpeazụ:

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

Anyị na-emeghachi ihe oyiyi ahụ, n'ihi ya, ọ tụfuru 6 ugboro ibu ya, nke ruru 77 MB. Ọ dịghị njọ. Mgbe nke ahụ gasịrị, enwere ike ibugo onyonyo emebere na ndekọ onyonyo ka onyonyo gị wee dị maka nbudata na ịntanetị.

Ọrụ na-arụkọ ọrụ na Docker

Iji malite, ọrụ anyị ga-adịrịrị n'otu netwọkụ ahụ. Enwere ụdị netwọkụ dị iche iche na docker, anyị na-eji nke kachasị ochie n'ime ha - akwa mmiri, nke na-enye gị ohere ịnweta netwọọdụ netwọkụ na-agba ọsọ n'otu onye ọbịa. Mepụta netwọkụ nwere iwu a:

docker network create msvc-network

Na-esote, malite akpa azụ azụ nke aha ya bụ 'backend' jiri microservices-backend:1.0.0 oyiyi:

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

Ọ dị mma ịmara na netwọk mmiri na-enye site na nchọpụta ọrụ igbe maka igbe site na aha ha. Ya bụ, ọrụ azụ azụ ga-adị n'ime netwọk docker na http://backend:8080.

Malite ọnụ ụzọ ámá:

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

N'ime iwu a, anyị na-egosi na anyị na-ebugharị ọdụ ụgbọ mmiri 80 nke ndị ọbịa anyị na ọdụ ụgbọ mmiri 8080 nke akpa ahụ. Anyị na-eji nhọrọ env tọọ mgbanwe gburugburu ebe obibi nke mmiri ga-agụ na-akpaghị aka wee wepụ akụrụngwa sitere na ngwa.properties.

Mgbe ịmalite, anyị na-akpọ http://localhost/ ma jide n'aka na ihe niile na-arụ ọrụ, dịka ọ dị na mbụ.

nkwubi

N'ihi ya, anyị mepụtara microservices abụọ dị mfe, kpokọta ha na arịa docker wee malite ha ọnụ n'otu igwe. Otú ọ dị, usoro a na-esi na ya pụta nwere ọtụtụ ọghọm:

  • Nkwekọrịta mmejọ na-adịghị mma - ihe niile na-arụ ọrụ maka anyị n'otu sava
  • Ọdịmma scalability na-adịghị mma - mgbe ibu ahụ na-abawanye, ọ ga-adị mma ibuga oge ọrụ ndị ọzọ na-akpaghị aka ma dozie ibu dị n'etiti ha.
  • Ihe mgbagwoju anya nke mmalite - anyị kwesịrị ịbanye ma ọ dịkarịa ala 3 iwu, yana ụfọdụ paramita (nke a bụ naanị maka ọrụ 2)

Iji dozie nsogbu ndị a dị n'elu, enwere ọtụtụ ngwọta dị ka Docker Swarm, Nomad, Kubernetes ma ọ bụ OpenShift. Ọ bụrụ na edere usoro niile na Java, ị nwere ike ile anya n'akụkụ mmiri Cloud (ezi isiokwu).

В akụkụ ọzọ M ga-ekwu maka otu m si edozi Kubernetes ma tinye ọrụ ahụ na Google Kubernetes Engine.

isi: www.habr.com

Tinye a comment