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:
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
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)
$ 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
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.
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.