Ithute ho sebelisa li-microservices. Karolo ea 1. Spring Boot le Docker

Ithute ho sebelisa li-microservices. Karolo ea 1. Spring Boot le Docker

Hello Habr.

Sehloohong sena, ke batla ho bua ka boiphihlelo ba ka ba ho theha tikoloho ea ho ithuta bakeng sa ho etsa liteko ka li-microservices. Ha ke ithuta sesebelisoa se seng le se seng se secha, kamehla ke ne ke batla ho se leka eseng feela mochine oa sebaka seo, empa hape le ka maemo a sebele. Ka hona, ke ile ka etsa qeto ea ho theha sesebelisoa sa microservice se nolofalitsoeng, seo hamorao se ka "koaheloang" ka mefuta eohle ea theknoloji e thahasellisang. Ntho e ka sehloohong e hlokahalang bakeng sa morero ke sebaka sa eona se phahameng sa ts'ebetso se haufi le tsamaiso ea sebele.

Qalong, ke ile ka arola tlhahiso ea morero ka mehato e mengata:

  1. Theha lits'ebeletso tse peli - 'backend' (backend) le 'gateway' (gateway), li li kenye litšoantšong tsa docker 'me u li hlophise hore li sebetse hammoho.

    Mantsoe a bohlokoa: Java 11, Spring Boot, Docker, optimization ea litšoantšo

  2. Nts'etsopele ea tlhophiso ea Kubernetes le phepelo ea sistimi ho Google Kubernetes Engine

    Mantsoe a bohlokoa: Kubernetes, GKE, taolo ea lisebelisoa, autoscaling, liphiri

  3. Ho theha chate e nang le Helm 3 bakeng sa taolo e ntle ea sehlopha

    Mantsoe a bohlokoa: Helm 3, ho tsamaisoa ha chate

  4. Ho theha Jenkins le pipeline bakeng sa ho tsamaisa khoutu ka mokhoa o itekanetseng ho sehlopha

    Mantsoe a bohlokoa: Tlhophiso ea Jenkins, li-plugins, polokelo e arohaneng ea li-configs

Ke rera ho fana ka sengoloa se arohaneng mohatong ka mong.

Sepheo sa letoto lena la lihlooho ha se mokhoa oa ho ngola li-microservices, empa mokhoa oa ho li etsa hore li sebetse tsamaisong e le 'ngoe. Le hoja lintho tsena kaofela hangata li le ka ntle ho boikarabelo ba moqapi, ke nahana hore ho ntse ho le molemo ho tloaelana le tsona bonyane 20% (eo, kamoo u tsebang, e fanang ka 80% ea sephetho). Lihlooho tse ling tsa bohlokoa ntle le maemo, tse kang ts'ireletso, li tla siuoa mosebetsing ona, kaha mongoli ha a utloisise ho honyenyane ka tsamaiso ena e bōpiloe feela bakeng sa tšebeliso ea botho. Ke amohela maikutlo afe kapa afe le ho nyatsuoa ho hahang.

Ho theha microservices

Litšebeletso li ngotsoe ka Java 11 ho sebelisoa Spring Boot. Litšebelisano tsa litšebeletso li hlophisitsoe ho sebelisoa REST. Morero o tla kenyelletsa palo e fokolang ea liteko (e le hore hamorao ho be le ntho e lokelang ho hlahlojoa Jenkins). Khoutu ea mohloli oa lits'ebeletso e fumaneha ho GitHub: backend и Gateway.

E le ho khona ho lekola boemo ba e 'ngoe le e' ngoe ea lits'ebeletso, ho ekelitsoe Spring Actuator ho litšepiso tsa bona. E tla theha / actuator/health endpoint mme e khutlisetse boemo ba 200 haeba ts'ebeletso e se e loketse ho amohela sephethephethe, kapa 504 haeba ho na le bothata. Tabeng ena, sena ke cheke e iqapetsoeng, kaha litšebeletso li bonolo haholo, 'me haeba ho na le matla a mang a matla, ho ka etsahala hore li se ke tsa fumaneha ka ho feletseng ho feta hore li lule li sebetsa ka mokhoa o fokolang. Empa lits'ebetsong tsa 'nete, Actuator e ka thusa ho fumana bothata pele basebelisi ba qala ho loana ka eona. Ka mohlala, haeba ho na le mathata a ho fihlella polokelongtshedimosetso, re ka arabela sena ka bohona ka ho emisa dikopo tsa ho sebetsa ka tshebeletso e robehileng.

Tšebeletso ea morao-rao

Ts'ebeletso ea morao-rao e tla bala le ho khutlisa palo ea likopo tse amoheloang.

Molaoli khoutu:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

Teko ea balaoli:

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

Tšebeletso ea heke

Heke e tla fetisetsa kopo ho ts'ebeletso ea backend, e e tlatselle ka lintlha tse latelang:

  • gateway id. Hoa hlokahala e le hore ho ka khoneha ho khetholla mohlala o le mong oa heke ho tloha ho o mong ka karabo ea seva
  • "Lekunutu" le leng le tla bapala karolo ea senotlolo sa bohlokoa haholo (nomoro ea senotlolo sa cookie ea bohlokoa)

Tlhophiso ho tshebediso.mesebetsi:

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

Adapter e ka morao:

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

Molaoli:

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

Qala:

A re ke re qala ka "backend":

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

Ho qala heke:

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

Re hlahloba:

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

Tsohle di a sebetsa. 'Mali ea hlokolosi o tla hlokomela hore ha ho letho le re thibelang ho fihlella backend ka kotloloho, ho feta heke (http://localhost:8081/requests). Ho lokisa sena, lits'ebeletso li tlameha ho kopanngoa ho marang-rang a le mong, 'me feela heke e lokela ho "khomarela" ka ntle.
Hape, litšebeletso ka bobeli li arolelana tsamaiso e le 'ngoe ea faele, li hlahisa melapo' me ka nako e le 'ngoe li ka qala ho kena-kenana. Ho ka ba monate ho arola li-microservices tsa rona. Sena se ka finyelloa ka ho tsamaisa lits'ebetso mochining o fapaneng (chelete e ngata, e thata), ho sebelisa mechini e fumanehang (e matla haholo, ho qala nako e telele), kapa ho sebelisa lisebelisoa. Joalokaha ho lebeletsoe, re khetha khetho ea boraro le Docker joalo ka sesebelisoa sa ho kenya setshelo.

Docker

Ka bokhutšoanyane, docker e theha lijana tse arohaneng, e le 'ngoe ka kopo. Ho sebelisa docker, o hloka ho ngola Dockerfile - litaelo tsa ho aha le ho tsamaisa ts'ebeliso. E latelang, o ka haha ​​​​setšoantšo, oa se kenya ho ngoliso ea litšoantšo (No. Dockerhub) 'me u tsamaise microservice ea hau sebakeng sefe kapa sefe sa dockerized ka taelo e le' ngoe.

dockerfile

E 'ngoe ea litšobotsi tsa bohlokoa ka ho fetisisa tsa setšoantšo ke boholo ba sona. Setšoantšo se kopaneng se tla khoasolla kapele ho tsoa polokelong e hole, se nke sebaka se senyenyane, 'me tšebeletso ea hau e tla qala kapele. Setšoantšo leha e le sefe se hahiloe motheong oa setšoantšo sa motheo, 'me ho kgothaletswa ho khetha khetho e fokolang ka ho fetisisa. Khetho e ntle ke Alpine, kabo e felletseng ea Linux e nang le liphutheloana tse nyane.

Taba ea pele, a re lekeng ho ngola Dockerfile "phatleng" (ke tla re hang-hang hore ena ke tsela e mpe, u se ke ua e etsa):

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

Mona re sebelisa setšoantšo sa motheo sa Alpine se nang le JDK e seng e kentsoe ho aha morero oa rona. Ka taelo ea ADD, re eketsa lenane la hona joale la src setšoantšong, re tšoaee hore le sebetsa (WORKDIR) 'me u qale ho haha. Taelo ea EXPOSE 8080 e fana ka matšoao ho docker hore kopo e ka setshelo e tla sebelisa boema-kepe ba eona ba 8080 (sena se ke ke sa etsa hore sesebelisoa se fumanehe ho tsoa kantle, empa se tla lumella kopo hore e fihleloe, ka mohlala, ho tsoa sets'oants'ong se seng ho marang-rang a tšoanang a docker. ).

Ho kenya lits'ebeletso ho litšoantšo, o hloka ho tsamaisa litaelo ho tsoa motsong oa projeke ka 'ngoe:

docker image build . -t msvc-backend:1.0.0

Sephetho ke setšoantšo sa 456 MB (seo setšoantšo sa JDK sa motheo se neng se le 340 MB). 'Me bohle ho sa tsotellehe taba ea hore lihlopha tsa morero oa rona li ka baloa ka monoana. Ho fokotsa boholo ba setšoantšo sa rona:

  • Re sebelisa kopano ea mehato e mengata. Mohato oa pele re tla haha ​​​​morero, mohato oa bobeli re tla kenya JRE, 'me mohato oa boraro re tla e kopitsa kaofela ho setšoantšo se secha se hloekileng sa Alpine. Ka kakaretso, likarolo tse hlokahalang feela li tla ba setšoantšong sa ho qetela.
  • Ha re sebeliseng modularization ea java. Ho qala ka Java 9, o ka sebelisa sesebelisoa sa jlink ho theha JRE ho tsoa ho li-module tseo u li hlokang

Bakeng sa ba batlang ho tseba, mona ke sengoloa se setle mabapi le mekhoa ea ho fokotsa litšoantšo. https://habr.com/ru/company/ruvds/blog/485650/.

Dockerfile ea ho qetela:

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

Re tsosolosa setšoantšo, 'me ka lebaka leo, se ile sa lahleheloa ke boima ba 6 ka makhetlo a 77 MB. Ha e mpe. Ka mor'a moo, litšoantšo tse lokiselitsoeng li ka kenngoa ho registry ea litšoantšo e le hore litšoantšo tsa hau li fumanehe bakeng sa ho khoasolla Inthaneteng.

Litšebeletso tse kopanetsoeng ho Docker

Ho qala, litšebeletso tsa rona li tlameha ho ba marang-rang a tšoanang. Ho na le mefuta e 'maloa ea marang-rang ho docker,' me re sebelisa ea khale ka ho fetisisa - borokho, e leng se u lumellang hore u sebelise lisebelisoa tsa marang-rang tse sebetsang ho moeti a le mong. Theha marang-rang ka taelo e latelang:

docker network create msvc-network

E latelang, qala setshelo sa backend se bitsoang 'backend' ka microservices-backend:1.0.0 setšoantšo:

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

Ke habohlokoa ho hlokomela hore marang-rang a borokho a fana ka ntle ho lebokose la ho sibolla litšebeletso bakeng sa lijana ka mabitso a tsona. Ke hore, tšebeletso ea backend e tla fumaneha ka har'a marang-rang a docker ho http://backend:8080.

Ho qala heke:

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

Taelong ena, re bonts'a hore re romella port 80 ea moamoheli oa rona ho port 8080 ea setshelo. Re sebelisa likhetho tsa env ho seta mefuta-futa ea tikoloho e tla baloa ka bo eona ke nako ea selemo le ho hlakola thepa ho tsoa ho kopo.properties.

Kamora ho qala, rea letsa http://localhost/ 'me u etse bonnete ba hore ntho e' ngoe le e 'ngoe e sebetsa, joalo ka tabeng e fetileng.

fihlela qeto e

Ka lebaka leo, re thehile li-microservices tse peli tse bonolo, ra li kenya ka har'a lijana tsa docker ebe ra li qala hammoho ka mochini o le mong. Leha ho le joalo, sistimi e hlahisoang e na le mefokolo e mengata:

  • Mamello e fosahetseng ea liphoso - ntho e 'ngoe le e' ngoe e sebetsa bakeng sa rona ho seva se le seng
  • Scalability e fokolang - ha mojaro o ntse o eketseha, ho ka ba monate ho sebelisa litšebeletso tse eketsehileng le ho leka-lekanya mojaro pakeng tsa bona.
  • Ho rarahana ha qalo - re ne re hloka ho kenya bonyane litaelo tse 3, le ka mekhahlelo e itseng (sena ke sa litšebeletso tse 2 feela)

Ho lokisa mathata a ka holimo, ho na le litharollo tse ngata tse kang Docker Swarm, Nomad, Kubernetes kapa OpenShift. Haeba sistimi eohle e ngotsoe ka Java, u ka sheba ho Leru la Spring (taba e ntle).

В karolo e latelang Ke tla bua ka mokhoa oa ho theha Kubernetes le ho tsamaisa morero ho Google Kubernetes Engine.

Source: www.habr.com

Eketsa ka tlhaloso