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:
-
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
-
Hua'ōlelo: Kubernetes, GKE, hoʻokele waiwai, autoscaling, mea huna
-
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
-
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:
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 (
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
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.
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
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
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
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 (
В
Source: www.habr.com