Phunzirani momwe mungagwiritsire ntchito ma microservices. Gawo 1. Boot ya Spring ndi Docker

Phunzirani momwe mungagwiritsire ntchito ma microservices. Gawo 1. Boot ya Spring ndi Docker

Pa Habr.

M'nkhaniyi, ndikufuna kunena za zomwe ndakumana nazo popanga malo ophunzirira kuyesa ma microservices. Nditaphunzira chida chatsopano chilichonse, nthawi zonse ndimafuna kuyesa osati pamakina am'deralo, komanso muzochitika zenizeni. Chifukwa chake, ndidaganiza zopanga pulogalamu yosavuta ya microservice, yomwe imatha "kuphimbidwa" ndi mitundu yonse yaukadaulo wosangalatsa. Chofunikira chachikulu pa ntchitoyi ndi kuyandikira kwake kogwira ntchito ku dongosolo lenileni.

Poyamba, ndinaphwanya kupanga polojekitiyi m'njira zingapo:

  1. Pangani mautumiki awiri - 'backend' (backend) ndi 'gateway' (chipata), itengeni muzithunzi za docker ndikuzikhazikitsa kuti zizigwira ntchito limodzi.

    Mawu osakira: Java 11, Spring Boot, Docker, kukhathamiritsa kwazithunzi

  2. Kupititsa patsogolo kasinthidwe ka Kubernetes ndikuyika makina mu Google Kubernetes Engine

    Mawu osakira: Kubernetes, GKE, kasamalidwe kazinthu, autoscaling, zinsinsi

  3. Kupanga tchati ndi Helm 3 kuti muzitha kuyendetsa bwino magulu

    Tags: Helm 3, kuyika ma chart

  4. Kukhazikitsa Jenkins ndi mapaipi kuti apereke ma code okha ku gulu

    Keywords: Jenkins kasinthidwe, mapulagini, osiyana configs repository

Ndikukonzekera kupereka nkhani yosiyana pa sitepe iliyonse.

Cholinga cha nkhanizi si momwe mungalembere ma microservices, koma momwe mungawapangire kuti azigwira ntchito mu dongosolo limodzi. Ngakhale kuti zinthu zonsezi nthawi zambiri zimakhala kunja kwa udindo wa wopanga mapulogalamuwo, ndikuganiza kuti ndizothandizabe kuzidziwa bwino 20% (zomwe, monga mukudziwa, zimapatsa 80% zotsatira). Mitu ina yofunika mopanda malire, monga chitetezo, idzasiyidwa mu polojekitiyi, popeza wolembayo amamvetsa pang'ono za dongosololi lapangidwa kuti ligwiritse ntchito payekha. Ndimalandira malingaliro aliwonse ndi kutsutsa kolimbikitsa.

Kupanga ma microservices

Ntchitozi zidalembedwa mu Java 11 pogwiritsa ntchito Spring Boot. Kulumikizana kwa Interservice kumakonzedwa pogwiritsa ntchito REST. Pulojekitiyi idzaphatikizapo chiwerengero chochepa cha mayesero (kotero kuti pambuyo pake pali chinachake choyesa ku Jenkins). Khodi yoyambira ntchitoyo ikupezeka pa GitHub: kumbuyo ΠΈ Chipata.

Kuti muwone momwe ntchito iliyonse ilili, Spring Actuator yawonjezedwa ku zomwe amadalira. Idzapanga / actuator/health endpoint ndipo idzabweretsanso 200 ngati ntchitoyo ili yokonzeka kuvomereza magalimoto, kapena 504 ngati pali vuto. Pachifukwa ichi, ichi ndi cheke chabodza, chifukwa mautumikiwa ndi osavuta, ndipo ngati atakhala ndi mphamvu yayikulu, amatha kukhala osapezeka konse kuposa kukhalabe akugwira ntchito pang'ono. Koma pamakina enieni, Actuator imatha kuthandizira kuzindikira vuto ogwiritsa ntchito asanayambe kulimbana nalo. Mwachitsanzo, ngati pali zovuta zofikira ku database, titha kuyankha izi poyimitsa zopempha ndi ntchito yosweka.

Utumiki wakumbuyo

Utumiki wakumbuyo umangowerengera ndikubwezera kuchuluka kwa zopempha zovomerezeka.

Controller kodi:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Mayeso owongolera:

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

Service Gateway

Chipatacho chidzatumiza pempho ku utumiki wakumbuyo, ndikuwonjezera ndi izi:

  • gateway id. Zimafunika kuti zitheke kusiyanitsa chitsanzo chimodzi cha chipata kuchokera ku china ndi yankho la seva
  • "Zinsinsi" zina zomwe zimagwira ntchito ngati mawu achinsinsi ofunika kwambiri (nambala yachinsinsi cha cookie yofunika)

Kukonzekera mu application.properties:

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

Adapter yakumbuyo:

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

Wowongolera:

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

Kukhazikitsa:

Timayambira kumbuyo:

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

Kuyambira pa gateway:

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

Kufufuza:

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

Zonse zikuyenda. Wowerenga mwachidwi adzawona kuti palibe chomwe chingatilepheretse kulowa kumbuyo mwachindunji, kudutsa pachipata (http://localhost:8081/requests). Kuti izi zitheke, mautumikiwa ayenera kuphatikizidwa mu netiweki imodzi, ndipo chipata chokhacho chiyenera "kutuluka" kunja.
Komanso, mautumiki onsewa amagawana fayilo imodzi, amapanga mitsinje ndipo panthawi imodzi akhoza kuyamba kusokonezana. Zingakhale zabwino kudzipatula ma microservices athu. Izi zitha kutheka pogawa mapulogalamu pamakina osiyanasiyana (ndalama zambiri, zovuta), kugwiritsa ntchito makina enieni (ozama kwambiri, oyambira nthawi yayitali), kapena kugwiritsa ntchito zotengera. Monga kuyembekezera, timasankha njira yachitatu ndi Docker ngati chida chosungira.

Docker

Mwachidule, docker imapanga zotengera zakutali, chimodzi pakugwiritsa ntchito. Kuti mugwiritse ntchito docker, muyenera kulemba Dockerfile - malangizo omanga ndikugwiritsa ntchito pulogalamuyi. Kenako, mutha kupanga chithunzicho, ndikuchiyika ku registry yazithunzi (No. Zowonjezera) ndikuyika microservice yanu m'malo aliwonse okhala ndi lamulo limodzi.

Dockerfile

Chimodzi mwa zinthu zofunika kwambiri za fano ndi kukula kwake. Chithunzi chophatikizika chidzatsitsidwa mwachangu kuchokera kunkhokwe yakutali, kutenga malo ochepa, ndipo ntchito yanu iyamba mwachangu. Chithunzi chilichonse chimamangidwa pamaziko a chithunzi choyambira, ndipo tikulimbikitsidwa kusankha njira yochepetsetsa kwambiri. Njira yabwino ndi Alpine, kugawa kwathunthu kwa Linux ndi mapaketi ochepa.

Poyamba, tiyeni tiyese kulemba Dockerfile "pamphumi" (Ine ndinena nthawi yomweyo kuti iyi ndi njira zoipa, musachite izo):

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

Apa tikugwiritsa ntchito chithunzi chochokera ku Alpine chokhala ndi JDK yokhazikitsidwa kale kuti timange pulojekiti yathu. Ndi lamulo la ADD, timawonjezera chikwatu cha src pa chithunzicho, chisonyezeni kuti chikugwira ntchito (WORKDIR) ndikuyamba kumanga. Lamulo la EXPOSE 8080 limasainira docker kuti ntchito yomwe ili mumtsukoyo idzagwiritsa ntchito doko 8080 (izi sizipangitsa kuti pulogalamuyo ipezeke kunja, koma ilola kuti pulogalamuyo ipezeke, mwachitsanzo, kuchokera ku chidebe china pa netiweki yomweyi. ).

Kuyika mautumiki muzithunzi, muyenera kuyendetsa malamulo kuchokera muzu wa polojekiti iliyonse:

docker image build . -t msvc-backend:1.0.0

Zotsatira zake ndi chithunzi cha 456 MB (chomwe chithunzi choyambira cha JDK chidatenga 340 MB). Ndipo zonse ngakhale kuti makalasi mu polojekiti yathu akhoza kuwerengedwa pa chala. Kuchepetsa kukula kwa chithunzi chathu:

  • Timagwiritsa ntchito masitepe ambiri. Mu sitepe yoyamba tidzamanga polojekitiyi, mu sitepe yachiwiri tidzakhazikitsa JRE, ndipo mu sitepe yachitatu tidzayikopera zonse mu chithunzi chatsopano cha Alpine choyera. Pazonse, zigawo zofunikira zokha zidzakhala mu chithunzi chomaliza.
  • Tiyeni tigwiritse ntchito modularization ya java. Kuyambira ndi Java 9, mutha kugwiritsa ntchito chida cha jlink kupanga JRE kuchokera pama module omwe mukufuna

Kwa ofunsa, nayi nkhani yabwino yokhudza njira zochepetsera zithunzi. https://habr.com/ru/company/ruvds/blog/485650/.

Final Dockerfile:

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

Timakonzanso chithunzicho, ndipo chifukwa chake, chinataya kulemera kwake ka 6, kufika 77 MB. Osayipa kwenikweni. Pambuyo pake, zithunzi zokonzedwa kale zitha kukwezedwa ku registry yazithunzi kuti zithunzi zanu zizipezeka pa intaneti.

Ntchito zogwirira ntchito ku Docker

Poyamba, ntchito zathu ziyenera kukhala pamanetiweki omwewo. Pali mitundu ingapo yama netiweki mu docker, ndipo timagwiritsa ntchito akale kwambiri - mlatho, womwe umakupatsani mwayi wolumikizira zida zomwe zikuyenda pagulu lomwelo. Pangani netiweki ndi lamulo ili:

docker network create msvc-network

Kenako, yambani chidebe chakumbuyo chotchedwa 'backend' ndi microservices-backend:1.0.0 chithunzi:

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

Ndizofunikira kudziwa kuti maukonde a mlatho amapereka kuchokera m'bokosi kupezeka kwa zotengera ndi mayina awo. Ndiye kuti, ntchito yakumbuyo ipezeka mkati mwa netiweki ya docker pa http://backend:8080.

Kuyambira pa gateway:

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

Mu lamulo ili, tikuwonetsa kuti tikutumiza doko 80 la omwe atilandira ku doko 8080 la chidebecho. Timagwiritsa ntchito zosankha za env kuti tikhazikitse zosintha zachilengedwe zomwe zidzawerengedwa zokha ndi masika ndikuchotsa katundu kuchokera ku application.properties.

Pambuyo poyambira, timayimba http://localhost/ ndipo onetsetsani kuti zonse zikuyenda, monga momwe zidalili kale.

Pomaliza

Zotsatira zake, tidapanga ma microservices awiri osavuta, tidawayika m'matumba a docker ndikuyambitsa limodzi pamakina omwewo. Dongosolo lotsatira, komabe, lili ndi zovuta zingapo:

  • Kusalekerera zolakwika - chilichonse chimatigwirira ntchito pa seva imodzi
  • Kusayenda bwino - katunduyo akachuluka, zingakhale bwino kuti mungodzipangira nthawi zina zowonjezera ndikuwongolera katundu pakati pawo.
  • Kuvuta kwa kukhazikitsa - tinkafunika kuyika malamulo osachepera atatu, komanso ndi magawo ena (izi ndi za mautumiki awiri okha)

Kuti mukonze mavuto omwe ali pamwambawa, pali mayankho angapo monga Docker Swarm, Nomad, Kubernetes kapena OpenShift. Ngati dongosolo lonse lalembedwa ku Java, mutha kuyang'ana chaku Spring Cloud (nkhani yabwino).

Π’ gawo lotsatira Ndilankhula za momwe ndinakhazikitsira Kubernetes ndikuyika pulojekitiyi ku Google Kubernetes Engine.

Source: www.habr.com

Kuwonjezera ndemanga