د مایکرو خدماتو ځای پرځای کولو څرنګوالی زده کړئ. برخه 1. د پسرلي بوټ او ډاکر

د مایکرو خدماتو ځای پرځای کولو څرنګوالی زده کړئ. برخه 1. د پسرلي بوټ او ډاکر

اې حبر

په دې مقاله کې، زه غواړم د مایکرو خدماتو تجربه کولو لپاره د زده کړې چاپیریال رامینځته کولو کې زما د تجربې په اړه وغږیږم. کله چې ما هره نوې وسیله زده کړه، ما تل غوښتل چې دا نه یوازې په محلي ماشین کې، بلکې په ډیرو واقعیتي شرایطو کې هم هڅه وکړم. له همدې امله ، ما پریکړه وکړه چې د مایکرو سرویس ساده غوښتنلیک رامینځته کړم ، کوم چې وروسته د هر ډول په زړه پورې ټیکنالوژیو سره "پوښل" کیدی شي. د پروژې اصلي اړتیا اصلي سیسټم ته د هغې اعظمي فعالیت نږدې والی دی.

په پیل کې ، ما د پروژې رامینځته کول په څو مرحلو کې مات کړل:

  1. دوه خدمتونه رامینځته کړئ - 'بینډینډ' (بیکینډ) او 'ګیټ وے' (ګیټ وے) ، دوی په ډاکر عکسونو کې بسته کړئ او یوځای کار کولو لپاره یې تنظیم کړئ

    کلیدي ټکي: جاوا 11، د پسرلي بوټ، ډاکر، د عکس اصلاح کول

  2. د ګوګل Kubernetes Engine کې د Kubernetes ترتیب او د سیسټم ځای پرځای کولو پراختیا

    کلیدي کلمې: Kubernetes، GKE، د سرچینو مدیریت، اتوماتیک، رازونه

  3. د ښه کلستر مدیریت لپاره د هیلم 3 سره د چارټ جوړول

    ټاګونه: هیلم 3, چارټ ځای په ځای کول

  4. کلستر ته د کوډ اتومات تحویل لپاره جینکنز او پایپ لاین تنظیم کول

    کلیدي کلمې: د جینکنز ترتیب، پلگ ان، جلا ترتیب ذخیره

زه پلان لرم چې هر ګام ته جلا مقاله وقف کړم.

د مقالو د دې لړۍ تمرکز دا نه دی چې څنګه مایکرو سرویسونه ولیکئ، مګر دا چې څنګه په یو سیسټم کې کار وکړي. که څه هم دا ټول شیان معمولا د پراختیا کونکي مسؤلیت څخه بهر دي، زه فکر کوم چې دا لاهم ګټور دی چې لږترلږه 20٪ سره وپیژني (کوم چې تاسو پوهیږئ، د پایلې 80٪ ورکړئ). ځینې ​​غیر مشروط مهم موضوعات لکه امنیت به له دې پروژې څخه پاتې شي، ځکه چې لیکوال د دې سیسټم په اړه لږ پوهیږي چې یوازې د شخصي استعمال لپاره رامینځته شوی. زه د هر ډول نظرونو او رغنده نیوکو هرکلی کوم.

د مایکرو خدماتو رامینځته کول

خدمتونه په جاوا 11 کې د پسرلي بوټ په کارولو سره لیکل شوي. Interservice متقابل عمل د REST په کارولو سره تنظیم شوی. په پروژه کې به لږترلږه ازموینې شاملې وي (نو چې وروسته په جینکنز کې د ازموینې لپاره یو څه شتون ولري). د خدماتو لپاره د سرچینې کوډ په GitHub کې شتون لري: شاته и دروازه.

د دې لپاره چې د هر یو خدماتو حالت وڅیړئ، د پسرلي فعالونکی د دوی انحصار ته اضافه شوی. دا به د / actuator/روغتیا پای ټکی رامینځته کړي او د 200 حالت بیرته راولي که چیرې خدمت د ترافیک منلو ته چمتو وي ، یا 504 که کومه ستونزه وي. په دې حالت کې، دا یو جعلي چک دی، ځکه چې خدمتونه خورا ساده دي، او د یو څه ځواک په صورت کې، دوی احتمال لري چې د جزوی عملیاتي پاتې کیدو په پرتله په بشپړه توګه شتون ونلري. مګر په ریښتیني سیسټمونو کې ، Actuator کولی شي د ستونزې تشخیص کې مرسته وکړي مخکې لدې چې کاروونکي د هغې په اړه مبارزه پیل کړي. د مثال په توګه، که چیرې ډیټابیس ته د لاسرسي ستونزې شتون ولري، موږ کولی شو په اتوماتيک ډول د مات شوي خدمت مثال سره د پروسس کولو غوښتنې بندولو سره ځواب ووایو.

شاته پای خدمت

د شالید خدمت به په ساده ډول د منل شوي غوښتنو شمیر حساب او بیرته راستانه کړي.

د کنټرول کوډ:

@RestController
public class RequestsCounterController {

    private final AtomicLong counter = new AtomicLong();

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

کنټرولر ازموینه:

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

د خدماتو دروازه

ګیټ وے به غوښتنه د بیک انډ خدمت ته واستوي ، دا د لاندې معلوماتو سره ضمیمه کوي:

  • د دروازې id. دا اړینه ده چې دا ممکنه وي چې د سرور ځواب لخوا د دروازې یوه بیلګه له بل څخه توپیر کړئ
  • ځینې ​​"پټ" چې د خورا مهم پاسورډ رول لوبوي (د مهم کوکي د کوډ کولو کیلي شمیره)

په application.properties کې ترتیب:

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

شاته اډاپټر:

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

کنټرولر:

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

پیل:

موږ پس منظر پیل کوو:

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

د دروازې پیل کول:

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

موږ ګورو:

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

هر څه کار کوي. یو پام لرونکی لوستونکی به یادونه وکړي چې هیڅ شی موږ د دروازې په تیریدو سره مستقیم بیک انډ ته د لاسرسي مخه نه نیسي (http://localhost:8081/requests). د دې د حل کولو لپاره، خدمتونه باید په یوه شبکه کې یوځای شي، او یوازې د دروازې دروازه باید بهر "پاتې" وي.
همچنان ، دواړه خدمات د فایل سیسټم شریکوي ، جریان تولیدوي او په یوه شیبه کې کولی شي د یو بل سره مداخله پیل کړي. دا به ښه وي چې زموږ کوچني خدمتونه جلا کړو. دا په مختلفو ماشینونو کې د غوښتنلیکونو ویشلو (ډیری پیسې، ستونزمن)، د مجازی ماشینونو په کارولو سره (د سرچینو ژور، اوږد پیل)، یا د کانټینر کولو په کارولو سره ترلاسه کیدی شي. لکه څنګه چې تمه کیده، موږ دریم انتخاب غوره کوو او ډاکر د کانټینر کولو لپاره د یوې وسیلې په توګه.

ډاکر

په لنډه توګه ، ډاکر جلا شوي کانټینرونه رامینځته کوي ، په هر غوښتنلیک کې یو. د ډاکر کارولو لپاره ، تاسو اړتیا لرئ د ډاکر فایل ولیکئ - د غوښتنلیک جوړولو او چلولو لپاره لارښوونې. بیا، تاسو کولی شئ عکس جوړ کړئ، دا د عکس راجستر ته اپلوډ کړئ (نمبر. ډاکر هب) او خپل مایکرو خدمت په هر ډول ډاکریز شوي چاپیریال کې په یوه کمانډ کې ځای په ځای کړئ.

ډکولر

د انځور یو له مهمو ځانګړتیاوو څخه د هغې اندازه ده. یو کمپیکٹ عکس به د ریموټ ذخیره څخه ګړندی ډاونلوډ کړي ، لږ ځای ونیسي ، او ستاسو خدمت به ګړندی پیل شي. هر عکس د بیس عکس پراساس جوړ شوی ، او دا سپارښتنه کیږي چې ترټولو لږترلږه انتخاب غوره کړئ. یو ښه اختیار الپین دی، د لږترلږه کڅوړو سره د لینکس بشپړ توزیع.

لومړی، راځئ هڅه وکړو چې یو ډاکر فایل "په تندی" ولیکئ (زه به سمدلاسه ووایم چې دا یوه بده لاره ده، دا مه کوئ):

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

دلته موږ د JDK سره د الپین اساس اساس عکس کاروو چې زموږ د پروژې جوړولو لپاره دمخه نصب شوی. د ADD کمانډ سره، موږ انځور ته اوسنی src ډایرکټر اضافه کوو، دا د کار په توګه نښه کړئ (WORKDIR) او جوړونه پیل کړئ. د EXPOSE 8080 کمانډ ډاکر ته سیګنال ورکوي چې په کانټینر کې غوښتنلیک به خپل پورټ 8080 وکاروي (دا به غوښتنلیک له بهر څخه د لاسرسي وړ نه کړي ، مګر غوښتنلیک ته به د لاسرسي اجازه ورکړي ، د مثال په توګه ، په ورته ډاکر شبکه کې د بل کانټینر څخه ).

په عکسونو کې د خدماتو بسته کولو لپاره ، تاسو اړتیا لرئ د هرې پروژې له ریښې څخه قوماندې پرمخ وړئ:

docker image build . -t msvc-backend:1.0.0

پایله د 456 MB عکس دی (چې د اساس JDK عکس 340 MB نیولی دی). او ټول د دې حقیقت سره سره چې زموږ په پروژه کې ټولګي د ګوتو په شمار کیدی شي. زموږ د عکس اندازه کمولو لپاره:

  • موږ د څو مرحلو مجلس کاروو. په لومړي ګام کې به موږ پروژه جوړه کړو، په دویمه مرحله کې به JRE نصب کړو، او په دریم ګام کې به دا ټول په نوي پاک الپین عکس کې کاپي کړو. په مجموع کې، یوازې اړین برخې به په وروستي عکس کې وي.
  • راځئ چې د جاوا ماډل کولو څخه کار واخلو. د جاوا 9 سره پیل کول، تاسو کولی شئ د jlink وسیله وکاروئ ترڅو یوازې د هغه ماډلونو څخه JRE جوړ کړئ چې تاسو ورته اړتیا لرئ

د پلټونکو لپاره، دلته د عکس کمولو طریقو په اړه ښه مقاله ده. https://habr.com/ru/company/ruvds/blog/485650/.

وروستی ډاکر فایل:

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

موږ عکس بیا جوړ کړو، او په پایله کې، دا خپل وزن 6 ځله له لاسه ورکړ، د 77 MB اندازه. بد نه دی. له هغې وروسته، چمتو شوي انځورونه د عکس راجستر ته اپلوډ کیدی شي ترڅو ستاسو انځورونه د انټرنیټ څخه د ډاونلوډ لپاره شتون ولري.

په ډاکر کې د ګډ چلولو خدمات

د پیل کولو لپاره، زموږ خدمتونه باید په ورته شبکه کې وي. په ډاکر کې د شبکې ډیری ډولونه شتون لري، او موږ د دوی ترټولو ابتدايي کاروو - پل، کوم چې تاسو ته اجازه درکوي د شبکې کانټینرونه په ورته کوربه کې پرمخ ځي. د لاندې کمانډ سره شبکه جوړه کړئ:

docker network create msvc-network

بیا، د بیکینډ کانټینر د مایکرو سرویس-بیکینډ: 1.0.0 عکس سره د بیکینډ په نوم پیل کړئ:

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

د یادولو وړ ده چې د پل شبکه د کانټینرونو لپاره د دوی په نومونو د بکس څخه بهر خدمت کشف چمتو کوي. دا دی، د بیک انډ خدمت به د ډاکر شبکې دننه شتون ولري http://backend:8080.

د دروازې پیل کول:

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

پدې کمانډ کې ، موږ په ګوته کوو چې موږ د خپل کوربه 80 بندر د کانټینر 8080 بندر ته لیږو. موږ د چاپیریال متغیرونو تنظیم کولو لپاره د env اختیارونه کاروو چې په اوتومات ډول به د پسرلي لخوا لوستل کیږي او د application.properties څخه ملکیتونه پورته کوي.

د پیل کولو وروسته، موږ غږ کوو http://localhost/ او ډاډ ترلاسه کړئ چې هرڅه کار کوي، لکه څنګه چې په تیر قضیه کې.

پایلې

د پایلې په توګه ، موږ دوه ساده مایکرو خدمات رامینځته کړل ، په ډاکر کانټینرونو کې یې بسته کړل او په ورته ماشین کې یې یوځای پیل کړل. په هرصورت، نتیجه اخیستونکي سیسټم یو شمیر زیانونه لري:

  • ضعیف خطا زغم - هرڅه زموږ لپاره په یو سرور کې کار کوي
  • ضعیف پیمانه - کله چې بار ډیر شي ، نو دا به ښه وي چې په اتوماتيک ډول د اضافي خدماتو مثالونه ځای په ځای کړئ او د دوی ترمینځ بار توازن کړئ
  • د لانچ پیچلتیا - موږ اړتیا لرو لږترلږه 3 کمانډونه دننه کړو ، او د ځینې پیرامیټونو سره (دا یوازې د 2 خدماتو لپاره دی)

د پورتنیو ستونزو د حل لپاره، یو شمیر حلونه شتون لري لکه ډاکر سوارم، کوماډ، کبرنیټس یا اوپن شفټ. که ټول سیسټم په جاوا کې لیکل شوی وي، تاسو کولی شئ د پسرلي کلاوډ ته وګورئ (ښه مقاله).

В بله برخه زه به د دې په اړه وغږیږم چې څنګه ما کبرنیټس تنظیم کړ او پروژه د ګوګل کوبرنیټس انجن ته ځای په ځای کړه.

سرچینه: www.habr.com

Add a comment