ساده شده: بوت بهار با داکر (قسمت 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” }]
اهداف ما می خواهیم انجام دهیم:
- برنامه ارجاع را به Docker مستقر کنید (فکر کنید خدمت)
- چندین نمونه از API / سرویس را نگه دارید (فکر کنید ماکت)
- توزیع درخواست در نمونه های برنامه ارجاع (فکر کنید یک سرویس دیگر یعنی nginx)
- برنامه ارجاع برای اتصال با 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 نیز در همان پوشه وجود دارند) و ما باید پیامی مانند زیر را ببینیم:
پس از شروع خدمات با موفقیت ، ما باید بتوانیم آنها را در دسک تاپ داکر مانند زیر مشاهده کنیم:
قبل از مصرف خدمات قبل از بررسی
در صورتی که خدمات پایین دست (در این حالت ، DB) هنوز در حالی که بالادست در تلاش است تا به پایین دست متصل شود ، می توان در سرویس های بالادست (در این حالت ، خدمات مرجع SB) را مشاهده کرد. بنابراین ، به جای عجله برای مصرف برنامه ارجاع پس از دیدن 05 ظروف قابل مشاهده در داشبورد دسک تاپ Docker ، می توانیم برخی از بررسی ها را نیز انجام دهیم.
بنابراین ، قبل از تلاش برای شروع استفاده از نقاط API/انتهای برنامه ارجاع در آدرس url http: // localhost: 8000/مراجعه (توجه داشته باشید که پورت 8000 از nginx است) ، ما می توانیم علاوه بر این پیام های زیر را از دستور سریع تأیید کنیم/ پیام های ورود به سیستم توسط دستور 'Docker Compose Up' نمایش داده می شود:
تنظیم موفقیت آمیز PostgreSQL:
تنظیم موفقیت آمیز برنامه ارجاع:
از آنجا که “بستگی به” (در Docker آهنگسازی YML) فقط منتظر است تا ظرف دیگر به پایان برسد (و نه برای اجرای کامل برنامه موجود در آن) ، توصیه می شود قبل از مصرف آنها علاوه بر این برنامه ها/خدمات را تأیید کنید.
مصرف برنامه “ارجاع”
اکنون که این سرویس ها در Docker کار می کنند ، بیایید آنها را مصرف کنیم ، این بار از پستچی.
هنگامی که ما http: // localhost: 8000/ارجاع/وضعیت را اجرا می کنیم ، باید یک پیام موفق در مورد وضعیت خدمات ، مانند زیر دریافت کنیم.
هنگامی که ما http: // localhost: 8000/ارجاع را اجرا می کنیم ، باید سوابق ارجاع صفر دریافت کنیم ، زیرا هیچ یک مانند زیر وجود ندارد.
هنگامی که ما پست http: // localhost: 8000/ارجاع را اجرا می کنیم ، باید یک پیام موفقیت را با اطلاعات ارجاع مانند زیر مشاهده کنیم.
اکنون ، دوباره هنگامی که ما http: // localhost: 8000/ارجاع را اجرا می کنیم تا ببینیم که آیا مراجعه به تازه ایجاد شده در عملیات Fetch را مشاهده می کنیم ، مانند زیر پرونده (های) ارجاع را دریافت می کنیم.
علاوه بر موارد فوق ، بیایید گزارش های برنامه ارجاع را نیز تأیید کنیم. برای همین ، ما می توانیم به موارد/ظروف خدمات مرجع SB-Refral مراجعه کنیم و به گزینه Logs برویم ، باید در زیر مشاهده کنیم (بر اساس موفقیت فوق).
توجه داشته باشید که طبق دو پرونده فوق ، نمونه خدمات ارجاع درخواست های مختلفی (از پستچی) دریافت کرده است ، که همچنین ثابت می کند که Nginx در حال چرخش درخواست های بین موارد با موفقیت است
ظروف / خدمات را نابود کنید
با پایان کار ما ، می توانیم ظروف را با استفاده از دستور به پایان برسانیم docker compose down
و ما باید یک تأیید را مانند زیر مشاهده کنیم.
خلاصه
در این مقاله ، ما دیدیم که چگونه Docker (و Docker آهنگسازی) به ما اجازه می داد تا یک ارکستراسیون خدماتی را که به طور معمول فقط در یک محیط آزمایش ممکن است – در دستگاه توسعه ما و چگونگی استفاده از آن – پوشش چندین سرویس (از جمله بانک اطلاعاتی) ایجاد کنیم. خدمات به ارتباطات خدمات ، توالی و بازیابی خدمات راه اندازی خدمات.
از هرگونه بازخورد برای بهبود رویکرد و محتوا قدردانی می کند.
منابع:
https://stackoverflow.com/questions/52699899/depends-doesnt-wait-for-another-service-in-docker-compose-1-22-0