برنامه نویسی

ساده شده: بوت بهار با داکر (قسمت 3)

ما زاویه “چندین سرویس خدمات” از بوت و داکر بهار را در مقاله قسمت 2 این سری پوشش دادیم.

در این مقاله 3 ، ما خواهیم دید که چگونه می توان وابستگی ها را بین خدمات ، بهبودی از خرابی های شروع ، به دنبال یک دنباله راه اندازی از طریق Docker Compose در برنامه ای که دارای چندین سرویس است ، مدیریت کنیم. نمونه های بی شماری از چنین ترتیب وجود دارد:

  • MicroService که با یک پایگاه داده صحبت می کند (سرویس دیگری)
  • برنامه تک صفحه ای (SPA) که در پس زمینه با میکروسرویس صحبت می کند
  • اتصال خدمات لازم (به عنوان مثال ورود به سیستم توزیع شده)

پیش نیازها:

برای تجربه سفر همانطور که در مقاله بیان شده است ، توصیه می شود قبل از انجام مراحل فنی ، پیش نیازها را در محل خود قرار دهید.

  • خواندن: آگاهی اساسی در مورد کانتینر سازی و داکر
  • ابزار: دسک تاپ Docker نصب شده – حاوی چندین سرویس Docker است
  • ابزار: آشنایی با جاوا (ترجیحاً 8 به بعد) ، بوت بهار 3.4.x
  • ابزار: نصب شده JDK 17 & Maven (ابزار ساخت)
  • سخت افزار: توصیه می شود حداقل 08 گیگابایت رم داشته باشید (بیشتر از همه چیز)
  • خواندن: مقالات قسمت 1 و قسمت 2 را درک کرده است (اصول اولیه و آهنگسازی Docker)
  • کد: ما باید از برنامه بوت بهار “ارجاع” موجود در این تنظیمات repo و docker github استفاده شده در مقاله 1 و 2 استفاده کنیم

فهرست مطالب

متن:

ما یک میکروسرویس بوت بهار به نام 'ارجاع'. این سرویس به پایدار بودن و بازیابی اطلاعات ارجاع (هر شخص) در یک پایگاه داده پشتیبان کمک می کند-H2 (در حافظه) یا خارجی (PostgreSQL On Prem یا Container) و هر یک از این گزینه های ذخیره سازی 03 را می توان با انتخاب پروفایل فعال بهار فعال کرد یعنی محلی (H2) ، سحر کردن (postgresql on-prem) یا داک کردن (postgresql روی ظرف داکر). توجه داشته باشید که مشخصات پیش فرض بهار محلی است.

بیایید به عملیاتی که می توانیم با آن انجام دهیم نگاه کنیم درخواست ارجاع:

  • دریافت /مراجعه /وضعیت برای به دست آوردن وضعیت سرویس (جایگزین محرک است اما اکنون فعال نیست)
  • دریافت /مراجعه کنید برای بازیابی همه ارجاع
  • پست /مراجعه برای افزودن ارجاع [JSON request like { “givenName”: “Marty” }]

اهداف ما می خواهیم انجام دهیم:

  1. برنامه ارجاع را به Docker مستقر کنید (فکر کنید خدمت)
  2. چندین نمونه از API / سرویس را نگه دارید (فکر کنید ماکت)
  3. توزیع درخواست در نمونه های برنامه ارجاع (فکر کنید یک سرویس دیگر یعنی nginx)
  4. برنامه ارجاع برای اتصال با PostgreSQL در حال اجرا در کانتینر (فکر کنید سرویس دیگری یعنی postgresql)

هنگام استفاده از پروفایل بهار 'dockerize' ، اطلاعات اتصال به پایگاه داده و تنظیمات طرحواره ای هستند ارائه نشده است در خصوصیات کاربردی اما در خارج از آن در Docker Compose YML تعریف شده است (ما بعداً در مقاله به این موضوع لمس خواهیم کرد)


مراحل:

برای رسیدن به اهداف ، بیایید یک قدم را در یک زمان حرکت کنیم زیرا در اینجا کارهای زیادی وجود دارد.


خدمات و وابستگی های بین المللی را درک کنید

ترافیک نمونه های برنامه “ارجاع” هر چند سرور وب NGINX (رویکرد مشابه به مقاله قسمت 2) هدایت می شود. نمونه های برنامه “ارجاع” باید با PostgreSQL در حال اجرا در یک ظرف دیگر ادغام شوند. بنابراین ، ما حداقل 03 موجودیت با وابستگی های بین آنها را مشاهده می کنیم:

  • چیز کوچک (بستگی به ارجاع دارد)
  • ارجاع (بستگی به postgresql دارد)
  • پس از (با طرح پایگاه داده لازم)

“کنترل کننده ارجاع” چه کاری انجام می دهد؟

بیایید به کد زیر نگاه کنیم:

package com.sb.mybatis.postgre.web;

import com.sb.mybatis.postgre.dto.ReferralDTO;
import com.sb.mybatis.postgre.service.ReferralService;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/referrals")
public class ReferralController {

    @Autowired
    private ReferralService referralService;

    @GetMapping("/status")
    public String getStatus() {
        log.info("ReferralController.getStatus() is invoked");
        return "Referral Service is Up";
    }

    @GetMapping
    public List getTransactions() throws Exception {
        log.info("ReferralController.getTransactions() is invoked");
        return referralService.findAllReferralRecords();
    }

    @PostMapping
    public ReferralDTO createTransaction(@Valid @RequestBody ReferralDTO referralDTO) throws Exception {
        log.info("ReferralController.createTransactions() is invoked");
        if(referralService.insertReferral(referralDTO) == 1) {
            //Success
            return referralDTO;
        }
        else throw new Exception("Error in creating new Referral record");
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در ارجاع دهنده به ما اجازه می دهد تا سوابق ارجاع را ایجاد یا بازیابی کنیم ، وضعیت خدمات را ارائه دهیم و در عین حال یک پیام ساده را در سیاهههای مربوط به برنامه اضافه کنیم که قابل تأیید باشد (بعداً در مقاله ذکر می شود).


ایجاد شیشه اجرایی ارجاع

اول و مهمتر از همه ، لطفاً کلون را کلون کنید ارجاع برنامه بوت بهار به صورت محلی و فرمان را اجرا کنید mvn clean install برای آماده سازی پرونده JAR اجرایی (نام مانند ارجاع -0.0.1-snapshot.jar).


dockerfile ایجاد کنید

برای ایجاد یک تصویر Docker برای برنامه ارجاع ، ابتدا باید یک Dockerfile ایجاد کنیم.

FROM openjdk:17
EXPOSE 8081
ARG JAR_FILE=Referral-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} Referral-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Dspring.profiles.active=dockerize","-jar","/Referral-0.0.1-SNAPSHOT.jar"]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ارائه پروفایل بهار 'dockerize' در ورودی تضمین می کند که این نمایه در ایجاد تصویر نهایی انتخاب شده است


تصویر docker “ارجاع” ایجاد کنید

با استفاده از تصویر Docker ، بیایید دستور را اجرا کنیم docker build -t sb-referral-service:V1 . برای ایجاد تصویر Docker برای برنامه ارجاع.

یک اجرای موفق باید در زیر به نظر برسد ، نشان می دهد که تصویر Docker 'SB-Refral-Service: V1' ساخته شده است.

ایجاد تصویر موفق


ایجاد nginx.conf (پیکربندی سرور وب)

مشابه مقاله قسمت 2 ، بیایید یک فایل پیکربندی Nginx ایجاد کنیم که باید نشان دهد که همه درخواست ها به آن خدمات مرجع SB-Refral باید از طریق سرویس Nginx هدایت شود.

user  nginx;

events {
    worker_connections   10;
}
http {
        server {
              listen 8000;
              location / {
                proxy_pass http://sb-referral-service:8081;
              }
        }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


ایجاد اسکریپت ایجاد طرحواره PostgreSQL DB

همانطور که قبلاً در مرحله “درک خدمات و وابستگی های بین” ذکر شد ، ما می خواهیم اطمینان حاصل کنیم که PostgreSQL DB در Docker باید از طرح پایگاه داده لازم برخوردار باشد. اگر اینگونه نباشد ، برنامه ارجاع کار نخواهد کرد زیرا به Boot Spring دستور داده نمی شود که ایجاد طرح را در حالت/پروفایل “dockerize” آغاز کند.

بیایید یک اسکریپت SQL را با نام “Create-DB.SQL” با محتوای زیر ایجاد کنیم:

create table if not exists T_REFERRAL
(
    id varchar(255) primary key,
    name varchar(255) NOT NULL
);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

“ایجاد-db.sql” باید بخشی از پیکربندی postgresql در پرونده yml docker باشد


ارکستراسیون سرویس را از طریق آهنگسازی Docker تعریف کنید

هنگامی که ما تصویر ارجاع ، اسکریپت SQL SCREATION SCREATION SCLEA DATABASE و فایلهای پیکربندی Nginx را در محل خود داریم ، مرحله بعدی تعریف نحوه ارتباط خدمات مختلف ، توالی (در راه اندازی) و بازیابی (در صورت عدم موفقیت خدمات وابسته است. ). بیایید نگاهی به آهنگسازی Docker YML در زیر داشته باشیم:

services:
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - sb-referral-service
    ports:
      - '8000:8000'

  sb-referral-service:
    image: 'sb-referral-service:V1'
    restart: on-failure
    expose:
      - '8081'
    build:
      context: .
    deploy:
      replicas : 2
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/test
      - SPRING_DATASOURCE_USERNAME=test
      - SPRING_DATASOURCE_PASSWORD=test
      - SPRING_JPA_HIBERNATE_DDL_AUTO=none

  db:
    image: 'postgres:13.1-alpine'
    container_name: db
    environment:
      - POSTGRES_USER=test
      - POSTGRES_PASSWORD=test
    volumes:
      - ./db:/var/lib/postgresql/data
      - ./create-db.sql:/docker-entrypoint-initdb.d/create_database.sql
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

با نگاهی به پرونده YML از نزدیک ، خدمات 03 را پیدا می کنیم:

  • چیز کوچک: سرور وب ، که با استفاده از پرونده nginx.conf توسط Docker تنظیم می شود و به “خدمات-مرجع SB” وابسته است
  • خدمات مرجع SB-Refral: برنامه ارجاع ، که 02 نمونه خواهد داشت (ماکت) اگر تلاش قبلی ناموفق بود ، توسط Docker مجدداً راه اندازی می شود (راه اندازی مجدد: در هنگام شکست) و به “db” وابسته است
  • DB: سرور PostgreSQL ، که از اسکریپت Create-DB.SQL استفاده می کند و از اعتبارنامه ارائه شده برای پایگاه داده “تست” استفاده می کند

توجه کنید به تهیه چکمه بهار به اطلاعات اتصال به پایگاه داده در بخش “محیط” تحت “SB-Refral-Service” و URL URL Amypical DataSource به عنوان jdbc:postgresql://db:5432/test – به این دلیل است که پایگاه داده در یک ظرف در حال اجرا است


شروع خدمات در Docker

برای شروع ایجاد خدمات در Docker ، ما باید دستور را اجرا کنیم docker compose up (لطفاً اطمینان حاصل کنید که پرونده های ایجاد db.sql و nginx.conf نیز در همان پوشه وجود دارند) و ما باید پیامی مانند زیر را ببینیم:

Docker آهنگسازی می کند

پس از شروع خدمات با موفقیت ، ما باید بتوانیم آنها را در دسک تاپ داکر مانند زیر مشاهده کنیم:

نمای کانتینر


قبل از مصرف خدمات قبل از بررسی

در صورتی که خدمات پایین دست (در این حالت ، DB) هنوز در حالی که بالادست در تلاش است تا به پایین دست متصل شود ، می توان در سرویس های بالادست (در این حالت ، خدمات مرجع SB) را مشاهده کرد. بنابراین ، به جای عجله برای مصرف برنامه ارجاع پس از دیدن 05 ظروف قابل مشاهده در داشبورد دسک تاپ Docker ، می توانیم برخی از بررسی ها را نیز انجام دهیم.

بنابراین ، قبل از تلاش برای شروع استفاده از نقاط API/انتهای برنامه ارجاع در آدرس url http: // localhost: 8000/مراجعه (توجه داشته باشید که پورت 8000 از nginx است) ، ما می توانیم علاوه بر این پیام های زیر را از دستور سریع تأیید کنیم/ پیام های ورود به سیستم توسط دستور 'Docker Compose Up' نمایش داده می شود:

تنظیم موفقیت آمیز PostgreSQL:

DB آماده است

تنظیم موفقیت آمیز برنامه ارجاع:

برنامه آماده

از آنجا که “بستگی به” (در Docker آهنگسازی YML) فقط منتظر است تا ظرف دیگر به پایان برسد (و نه برای اجرای کامل برنامه موجود در آن) ، توصیه می شود قبل از مصرف آنها علاوه بر این برنامه ها/خدمات را تأیید کنید.


مصرف برنامه “ارجاع”

اکنون که این سرویس ها در Docker کار می کنند ، بیایید آنها را مصرف کنیم ، این بار از پستچی.

هنگامی که ما http: // localhost: 8000/ارجاع/وضعیت را اجرا می کنیم ، باید یک پیام موفق در مورد وضعیت خدمات ، مانند زیر دریافت کنیم.

وضعیت خدمات برنامه

هنگامی که ما http: // localhost: 8000/ارجاع را اجرا می کنیم ، باید سوابق ارجاع صفر دریافت کنیم ، زیرا هیچ یک مانند زیر وجود ندارد.

ارجاع های خالی

هنگامی که ما پست http: // localhost: 8000/ارجاع را اجرا می کنیم ، باید یک پیام موفقیت را با اطلاعات ارجاع مانند زیر مشاهده کنیم.

موفقیت ارجاع ایجاد کنید

اکنون ، دوباره هنگامی که ما http: // localhost: 8000/ارجاع را اجرا می کنیم تا ببینیم که آیا مراجعه به تازه ایجاد شده در عملیات Fetch را مشاهده می کنیم ، مانند زیر پرونده (های) ارجاع را دریافت می کنیم.

مراجعه به لیست

علاوه بر موارد فوق ، بیایید گزارش های برنامه ارجاع را نیز تأیید کنیم. برای همین ، ما می توانیم به موارد/ظروف خدمات مرجع SB-Refral مراجعه کنیم و به گزینه Logs برویم ، باید در زیر مشاهده کنیم (بر اساس موفقیت فوق).

ورود به سیستم خدمات 1

ورود به سیستم خدمات 2

توجه داشته باشید که طبق دو پرونده فوق ، نمونه خدمات ارجاع درخواست های مختلفی (از پستچی) دریافت کرده است ، که همچنین ثابت می کند که Nginx در حال چرخش درخواست های بین موارد با موفقیت است


ظروف / خدمات را نابود کنید

با پایان کار ما ، می توانیم ظروف را با استفاده از دستور به پایان برسانیم docker compose down و ما باید یک تأیید را مانند زیر مشاهده کنیم.

Docker Down Down


خلاصه

در این مقاله ، ما دیدیم که چگونه Docker (و Docker آهنگسازی) به ما اجازه می داد تا یک ارکستراسیون خدماتی را که به طور معمول فقط در یک محیط آزمایش ممکن است – در دستگاه توسعه ما و چگونگی استفاده از آن – پوشش چندین سرویس (از جمله بانک اطلاعاتی) ایجاد کنیم. خدمات به ارتباطات خدمات ، توالی و بازیابی خدمات راه اندازی خدمات.

از هرگونه بازخورد برای بهبود رویکرد و محتوا قدردانی می کند.

منابع:

https://stackoverflow.com/questions/52699899/depends-doesnt-wait-for-another-service-in-docker-compose-1-22-0

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا