Te ako ki te tuku ratonga moroiti. Wāhanga 1. Spring Boot and Docker

Te ako ki te tuku ratonga moroiti. Wāhanga 1. Spring Boot and Docker

Kia ora, Habr.

I roto i tenei tuhinga, e hiahia ana ahau ki te korero mo taku wheako ki te hanga i tetahi taiao ako mo te whakamatautau me nga ratonga miihini. I te wa e ako ana ahau i nga taputapu hou katoa, i hiahia tonu ahau ki te whakamatau ehara i taku miihini anake, engari i roto i nga ahuatanga tino pono. Na reira, i whakatau ahau ki te hanga i tetahi tono microservice ngawari, ka taea te "whakairi" me nga momo hangarau whakamere. Ko te whakaritenga matua mo te kaupapa ko tona tino mahi tata ki te punaha tuturu.

I te timatanga, i wehewehea e ahau te hanganga o te kaupapa ki etahi waahanga:

  1. Waihangatia kia rua nga ratonga - 'backend' me te 'kuwaha', whakahiatohia ki nga whakaahua docker ka whirihora kia mahi tahi

    Kupumatua: Java 11, Spring Boot, Docker, arotautanga whakaahua

  2. Te whakawhanaketanga o te whirihoranga me te punaha tuku Kubernetes ki Google Kubernetes Engine

    Kupumatua: Kubernetes, GKE, whakahaere rauemi, whakaira-aunoa, mea ngaro

  3. Waihangatia he tūtohi mā te Helm 3 kia pai ake te whakahaere kāhui

    Kupumatua: Helm 3, whakatakotoranga tūtohi

  4. Te whakatu Jenkins me te pipeline ki te tuku aunoa i te waehere ki te tautau

    Kupumatua: Jenkins whirihoranga, monomai, motuhake whirihora putunga

Kei te whakamahere ahau ki te tuku i tetahi tuhinga motuhake mo ia taahiraa.

Ko te arotahi o tenei raupapa tuhinga ehara i te pehea te tuhi microservices, engari me pehea e mahi ai i roto i te punaha kotahi. Ahakoa ko enei mea katoa kei waho i te mana o te kaiwhakawhanake, ki taku whakaaro he pai tonu kia 20% te mohio ki a raatau (e mohiotia ana ko te 80% o te hua). Ko etahi kaupapa tino nui, penei i te haumarutanga, ka waiho ki waho o tenei kaupapa, na te mea he iti te mohio o te kaituhi mo tenei; kei te hangaia te punaha mo te whakamahi whaiaro. Ka mihi au ki nga whakaaro me nga whakaheinga whai hua.

Te hanga microservices

I tuhia nga ratonga ki Java 11 ma te whakamahi i te Spring Boot. Ka whakaritea te whakawhitiwhiti korero i waenga i nga ratonga ma te whakamahi i te REST. Kei roto i te kaupapa te iti rawa o nga whakamatautau (kia whai muri mai he mea hei whakamatautau i Jenkins). Kei te waatea te waehere puna mo nga ratonga i GitHub: tuara и Kuwaha.

Kia taea ai te tirotiro i te ahua o ia ratonga, i taapirihia he Spring Actuator ki o raatau whakawhirinakitanga. Ka hanga he pito mutunga / kaitahuri / hauora ka whakahoki mai i te mana o te 200 mena kua rite te ratonga ki te whakaae waka, 504 ranei mena he raru. I tenei keehi, he tirotiro tito noa tenei, na te mea he tino ngawari nga ratonga, a, i raro i te ahua o te kaha majeure ka kore rawa e waatea mai i te noho tonu i tetahi waahanga. Engari i roto i nga punaha tuuturu, ka taea e Actuator te awhina ki te tarai i tetahi raru i mua i te tiimata o nga kaiwhakamahi ki te patu. Hei tauira, ki te puta ake nga raru ki te uru ki te paataka raraunga, ka taea e matou te whakautu aunoa ki tenei ma te whakamutu i nga tono tukatuka me te waahi pakaru o te ratonga.

Ratonga tuara

Ko te ratonga tuara ka tatau noa me te whakahoki i te maha o nga tono kua whakaaetia.

Waehere Kaiwhakahaere:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Whakamātautau Kaiwhakahaere:

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

Ratonga tomokanga

Ka tukuna e te kuaha te tono ki te ratonga o muri, me te taapiri i nga korero e whai ake nei:

  • id kuaha. E hiahiatia ana kia taea te wehe i tetahi tauira o te kuaha mai i tetahi atu ma te whakautu a te tūmau
  • He "huna" ka whai waahi ki tetahi kupuhipa tino nui (tau matua mo te whakamunatanga o tetahi pihikete nui)

Whirihoranga i roto i te application.properties:

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

Whāurutau mo te whakawhitiwhiti korero me te tuara:

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

Kaiwhakahaere:

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

Whakarewa:

Kia whakarewahia te pito o muri:

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

Me timata te kuwaha:

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

Ka tirohia e matou:

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

Kei te mahi nga mea katoa. Ka kite te kaipanui whakarongo karekau he mea e arai i a maatau ki te uru tika atu ki te pito o muri, ma te whakawhiti i te kuaha (http://localhost:8081/requests). Hei whakatika i tenei, me whakakotahi nga ratonga ki te whatunga kotahi, a ko te kuaha anake me "piri" ki waho.
Ano hoki, he rite tonu te punaha konae nga ratonga e rua, ka whakaputa i nga miro, katahi ka timata ki te pokanoa tetahi ki tetahi. He pai ki te wehe i a maatau ratonga miihini. Ka taea tenei ma te tohatoha i nga tono puta noa i nga miihini rereke (he nui te moni, he uaua), ma te whakamahi i nga miihini mariko (he rauemi-kaha, he tiimata roa) me te whakamahi i nga ipu. Ka rite ki te tumanako, ka whiriwhiria e matou te waahanga tuatoru me te Docker hei taputapu mo te hanga ipu.

Docker

Hei poto, ka hangaia e Docker nga ipu motuhake, kotahi mo ia tono. Hei whakamahi i a Docker, me tuhi koe i tetahi Dockerfile - nga tohutohu mo te hanga me te whakahaere i te tono. I muri mai, ka taea e koe te hanga i te ahua, tuku atu ki te rehita whakaahua (No. TaungiaHub) me te tuku i to microservice i roto i tetahi taiao dockerized i roto i te whakahau kotahi.

Dockerfile

Ko tetahi o nga ahuatanga tino nui o te ahua ko tona rahi. Ka tere ake te tango pikitia mai i te putunga mamao, ka iti ake te mokowā, ka tere ake te tiimata o to ratonga. Ko tetahi ahua ka hangaia i runga i te ahua o te ahua taketake, a ka tūtohu kia whiriwhiria te waahanga tino iti. Ko te whiringa pai ko Alpine, he tohatoha Linux katoa me te iti o nga kohinga.

Tuatahi, me ngana ki te tuhi i tetahi Dockerfile "head-on" (Ka kii tonu ahau he kino tenei, kaua e mahi):

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

I konei kei te whakamahi matou i te ahua turanga o Alpine me te JDK kua whakauruhia hei hanga i to maatau kaupapa. Ma te whakamahi i te whakahau ADD, ka taapirihia e matou te raarangi src o naianei ki te ahua, tohua kia mahi (WORKDIR) ka tiimata te hanga. Ko nga tohu whakahau a EXPOSE 8080 ki te kaipakihi ka whakamahia e te tono kei roto i te ipu tana tauranga 8080 (e kore tenei e whakaahei te tono mai i waho, engari ka taea te tono kia uru atu, hei tauira, mai i tetahi atu ipu kei runga i te whatunga docker kotahi. ).

Hei whakaemi i nga ratonga ki nga whakaahua, me whakahaere e koe nga whakahau mai i te putake o ia kaupapa:

docker image build . -t msvc-backend:1.0.0

Ko te mutunga, ka whiwhi tatou i te ahua o te 456 MB te rahi (i tangohia e te turanga JDK 340 te ahua MB). A ko nga mea katoa ahakoa ko nga karaehe o ta maatau kaupapa ka taea te tatau ki tetahi maihao. Hei whakaiti i te rahi o to maatau whakaahua:

  • Ka whakamahia e matou te huihuinga maha-taahiraa. I te taahiraa tuatahi ka kohia e matou te kaupapa, i te tuarua ka whakauruhia e matou te JRE, a, i te tuatoru ka kapehia e matou enei katoa ki tetahi ahua hou o Alpine. I te katoa, ko te ahua whakamutunga ka mau nga waahanga e tika ana.
  • Me whakamahi java modularization. Ka timata ki te Java 9, ka taea e koe te whakamahi i te taputapu jlink hei hanga JRE mai i nga waahanga e hiahia ana koe

Mo te hunga mohio, he tuhinga pai tenei mo nga huarahi ki te whakaiti i te rahi o nga whakaahua https://habr.com/ru/company/ruvds/blog/485650/.

Kōnae Docker Whakamutunga:

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

I hanga ano e matou te ahua, a ka 6 nga wa te angiangi ake, ko te 77 MB. Ehara i te kino. Muri iho, ka taea nga whakaahua kua oti te tuku ki te rehita whakaahua kia waatea ai o whakaahua mo te tango mai i te Ipurangi.

Te whakahaere tahi i nga ratonga i Docker

Hei timata, me noho tonu a maatau ratonga ki te whatunga kotahi. He maha nga momo whatunga kei Docker, a ka whakamahia e matou te mea tuatahi - piriti, ka taea e koe te whakauru i nga ipu whatunga e rere ana i runga i te ope kotahi. Me hanga he whatunga me te whakahau e whai ake nei:

docker network create msvc-network

Muri iho, me whakarewa he ipu whakamuri ko 'backend' me te ahua microservices-backend:1.0.0:

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

Me mahara ko te whatunga piriti e whakarato ana i nga ratonga rapu mai i te pouaka mo nga ipu ma o raatau ingoa. Arā, ka waatea te ratonga tuara i roto i te whatunga Docker i http://backend:8080.

Me timata te kuwaha:

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 roto i tenei whakahau e tohu ana kei te tuku whakamua matou i te tauranga 80 o to matou kaihautu ki te tauranga 8080 o te ipu. Ka whakamahia e matou nga whiringa env ki te tautuhi i nga taurangi taiao ka panui aunoatia i te puna me te whakakore i nga taonga mai i te application.properties.

I muri i te whakarewatanga, waea atu http://localhost/ me te whakarite kia pai nga mea katoa, pera i te keehi o mua.

mutunga

Ko te mutunga mai, i hanga e matou etahi ratonga moroiti ngawari e rua, i whakakoohia ki roto i nga ipu docker ka whakarewahia ki runga i te miihini kotahi. Ko te punaha hua, he maha nga ngoikoretanga:

  • He kino te manawanui - ka mahi nga mea katoa i runga i te tūmau kotahi mo matou
  • He kino te tauine - ka piki ake te uta, he pai ki te tuku aunoa i etahi atu waahanga ratonga me te whakataurite i te kawenga i waenga i a raatau.
  • Te uaua o te whakarewatanga - me whakauru e matou kia 3 nga whakahau, me etahi tawhā (e rua noa nga ratonga)

Hei whakaoti rapanga i runga ake nei, he maha nga otinga penei i te Docker Swarm, Nomad, Kubernetes, OpenShift ranei. Mena kua tuhia te punaha katoa ki Java, ka taea e koe te titiro ki te Puna Kapua (tuhinga pai).

В wahanga o muri Ka korero atu ahau ki a koe me pehea taku whakatu i nga Kubernetes me te tuku i te kaupapa ki a Google Kubernetes Engine.

Source: will.com

Tāpiri i te kōrero