JavaRush /وبلاگ جاوا /Random-FA /ما همه چیز مربوط به پایگاه داده را اضافه می کنیم. (قسمت 1...
Roman Beekeeper
مرحله

ما همه چیز مربوط به پایگاه داده را اضافه می کنیم. (قسمت 1) - "پروژه جاوا از A تا Z"

در گروه منتشر شد
قدم به قدم به سمت هدف خود پیش می رویم. "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 1امروز ما نیاز به حل بسیاری از وظایف داریم:
  1. Flyway را اضافه کنید. در اینجا ما استقرار پایگاه داده برای پروژه را پیکربندی می کنیم.
  2. یک طرح پایگاه داده اضافه کنید.
  3. یک لایه مخزن اضافه کنید.
  4. یک دستور برای آمار ربات اضافه کنید.
  5. بالاخره تست بنویس
پس بنشینید، عقب بنشینید، طولانی مدت وجود خواهد داشت. ما قبلاً یاد گرفته‌ایم که چگونه برنامه خود را با استفاده از docker و docker-compose اجرا کنیم. این آسان نبود و به کسانی که موفق به انجام آن شدند تبریک می گویم. اگر در مورد پیاده سازی سوالی دارید، می توانید به کد موجود در این درخواست کشش نگاه کنید .

اضافه کردن Flyway

برای اضافه کردن Flyway، باید یک پایگاه داده داشته باشید که ما آن را به عنوان سرویس دیگری در docker-compose اضافه می کنیم. آخرین بار گفتم که docker-compose یک بخش خدمات دارد که دقیقاً مسئول اضافه کردن و مدیریت یک زیرساخت خاص است - یعنی مجموعه ای از برنامه ها / پایگاه های داده / پیام رسان ها و غیره.
من قبلاً در مورد چیستی Flyway و نحوه اضافه کردن آن به یک برنامه SpringBoot صحبت کرده ام . به شما توصیه می کنم قبل از خواندن این مقاله حافظه خود را تازه کنید. همچنین می توانید فایل README.md پروژه را با نمایش مقاله Flyway + SpringBoot مطالعه کنید.
اولین کاری که انجام می دهیم این است که شاخه اصلی خود را در پروژه به روز می کنیم (git pull) و یک شاخه جدید با نام وظیفه خود ایجاد می کنیم - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). یادآوری می کنم: ما شاخه ها را تغییر نام دادیم تا بتوان توالی کارها را در پروژه فقط بر اساس نام مرتب کرد. این به شما امکان می دهد تا به سرعت از یک مرحله به مرحله دیگر بروید. اکنون می توانید در آرامش کار کنید. باید سه وابستگی اضافه کنیم:
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
وابستگی اول مسئول اضافه کردن FlyWay به پروژه است، دومی قابلیت اتصال به پایگاه داده MySQL را اضافه می کند. سومین راه‌انداز SpringBoot است که تمام جادوی استفاده از پایگاه داده را در Spring راه‌اندازی می‌کند. و همچنین یک لومبوک اضافه می کنیم تا گیرنده و ستتر ننویسیم:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
اکنون برای توسعه به یک پایگاه داده نیاز داریم. ما آن را در حال حاضر ( تا زمانی که ایده بهتری پیدا کنم ) به عنوان یک فایل docker-compose جداگانه و یک فایل جداگانه برای application.properties ایجاد خواهیم کرد. چنین چیزی در توسعه (و به طور خاص در اکوسیستم بهار) به عنوان پروفایل وجود دارد. بسته به مشخصات، تنظیمات مختلفی برای عملیات راه اندازی می شود. من فکر می کنم در آینده ما docker-compose را در یک فایل ترکیب می کنیم و مطمئن می شویم که تنها یک پایگاه داده برای توسعه در تنظیمات مورد نیاز ما راه اندازی شده است. در حال حاضر این کار را انجام خواهیم داد:
  1. بیایید یک فایل در ریشه پروژه docker-compose-test.yml ایجاد کنیم که در آن فقط پایگاه داده با تنظیمات خاص خود راه اندازی شود.
  2. بیایید یک فایل application-test.properties با تنظیماتی که با تنظیمات فایل docker-compose-test.yml مطابقت دارد ایجاد کنیم.
برای کار با MySQL، تصویر رسمی را از DockerHub گرفتم : "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 2پس از پیمایش سریع، متغیرهای لازم را پیدا کردم: MYSQL_DATABASE - نام پایگاه داده MYSQL_USER - نام کاربری پایگاه داده MYSQL_PASSWORD - رمز عبور کاربر پایگاه داده و نحوه صحیح نوشتن آنها:
jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
پس از آن، من docker-compose-test.yml را در ریشه پروژه ایجاد می کنم:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
برای اجرای این فایل خاص برای کار با docker-compose، باید از پرچم -f در درخواست استفاده کنید . به این معنی است که نام فایلی که راه اندازی می شود ارائه می شود، نه اینکه استاندارد docker-compose.yml گرفته شود. بنابراین، درخواست به این شکل خواهد بود: docker-compose -f docker-compose-test.yml up -d معلوم می شود که ابتدا می گوییم کدام فایل را بگیریم ( -f docker-compose-test.yml ) و سپس ما می گوییم که باید سرویس ها را بالا ببریم و این کار را در حالت daemon ( up -d ) انجام دهیم - به این معنی که فرآیند خارج از جلسه ترمینال که این دستور در آن راه اندازی شده است اجرا شود. ما راه اندازی می کنیم و سعی می کنیم به پایگاه داده متصل شویم تا مطمئن شویم که آن بالا است و قابل استفاده است. برای انجام این کار، میز کار آشنا MySQL را باز کنید ( در اینجا در مورد آن صحبت کردیم ) و یک اتصال جدید ایجاد کنید: "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 3باید فیلدهای زیر را پر کنیم:
  • نام اتصال - نام اتصال - به صورت اختیاری، DEV_JRTB_DB.
  • نام میزبان - در اینجا آدرسی است که پایگاه داده در آن مستقر شده است. در مورد ما، همه چیز همانطور که بود باقی می ماند: 127.0.0.1 یا localhost;
  • نام کاربری - همانطور که در docker-compose نوشته ایم، در اینجا root خواهد بود.
  • رمز عبور - همچنین روت.
پس از این، باید بررسی کنید که آیا اتصال کار می کند یا خیر. برای انجام این کار، روی Test Connection کلیک کنید : "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 4در نتیجه، دریافت می کنیم: Failed to Connect to MySQL... چرا؟ به ترمینال می رویم و می بینیم که چه اتفاقی برای کانتینر داکر افتاده است. بیایید در ترمینال بنویسیم: "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 5می بینیم که ترمینال 59 دقیقه پیش ایجاد شد و راه اندازی مجدد 55 ثانیه بود ... چرا؟ مشخص نیست، باید به گزارش ها نگاه کنید. به ریشه پروژه در ترمینال بروید و دستور زیر را اجرا کنید: docker-compose -f docker-compose-test.yml logs
ما گرفتیم:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

اکنون مشخص است که پایگاه داده هرگز با تنظیمات ما شروع نشده است. خطا یکسان است، بنابراین بیایید آن را از صفحه جدا کنیم:
2021-02-28 11:03:37+00:00 [خطا] [Entrypoint]: پایگاه داده بدون مقدار اولیه است و گزینه رمز عبور مشخص نشده است dev-jrtb-db | باید یکی از MYSQL_ROOT_PASSWORD، MYSQL_ALLOW_EMPTY_PASSWORD و MYSQL_RANDOM_ROOT_PASSWORD را مشخص کنید
یعنی او باید رمز عبور کاربر اصلی - کاربر اصلی را تعیین کند. خوب، اکنون ما فایل خود را به روز می کنیم:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
ما آن متغیرها را برای کاربر و رمز عبور حذف کردیم و فقط رمز عبور کاربر اصلی را اضافه کردیم. این بدان معناست که کاربر root اکنون یک رمز عبور root خواهد داشت. حداقل این چیزی است که ما فرض می کنیم. حالا بیایید آن را اجرا کنیم و ببینیم چه اتفاقی می‌افتد: docker-compose -f docker-compose-test.yml up -d و بلافاصله ببینیم گزارش‌ها به ما چه می‌گویند: docker-compose -f docker-compose-test.yml logs
بیایید نگاه بیندازیم:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

به نظر می رسد دیگر هیچ خطایی وجود ندارد، بنابراین می توانید ببینید که آیا دسترسی وجود دارد یا خیر. اما، متأسفانه، دوباره دسترسی وجود ندارد ... هیچ چیز: ما آن را بیشتر کشف خواهیم کرد! "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 6برای خاتمه دادن به docker-compose و حذف همه کانتینرها، باید بنویسید: docker-compose -f docker-compose-test.yml down در اینجا فایلی را برای حذف مشخص کردیم. چه باید کرد؟ بیایید آن را در گوگل جستجو کنیم: شاید کسی آن را بهتر انجام داده باشد. ساده ترین پرس و جو: "نمونه ای از mysql در docker-compose" به ما کمک می کند پیوندی به یک منبع متوسط ​​پیدا کنیم. آنها این مثال را می زنند:
version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
ما آن را با نیازهای خود تطبیق می دهیم و دریافت می کنیم:
version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
ما این گزینه را با دستوری که قبلاً برای ما شناخته شده است راه اندازی می کنیم: docker-compose -f docker-compose-test.yml up -d دوباره سعی می کنیم از طریق MySQLWorkBench به پایگاه داده دسترسی پیدا کنیم: "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 7بالاخره دسترسی ظاهر شد. اما اکنون تعجب می کنم که چه چیزی این را تحت تأثیر قرار داده است. من در این قسمت گناه می کنم:
expose:
   # Opens port 3306 on the container
   - '3306'
بررسی آن آسان است: بدون این، هیچ چیز نباید کار کند :D. بیایید بررسی کنیم: حذف این قسمت، راه اندازی مجدد docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up سعی می کنیم از طریق Workbench وارد پایگاه داده شویم: همه چیز خوب است . سپس تنها گزینه نسخه پایگاه داده است. 5.7 رو به وضوح میگه یعنی اگه به ​​اخرین تغییر بدی نباید کار کنه. من آن را مجدداً راه اندازی کردم - و واقعاً کار نمی کند ... "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 8ظاهراً آنها با تصویر داکر در آخرین نسخه مشکل دارند. خیلی خب مشکلی نیست. این اغلب با نرم افزار رایگان اتفاق می افتد. ما از نسخه 5.7 استفاده خواهیم کرد. بیایید ببینیم آیا پایگاه داده ای وجود دارد که به آن نیاز داریم - dev_jrtb_db. برای انجام این کار، دستور Query را در MySQL Workbench SHOW DATABESES اجرا کنید : "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 9بله، در خروجی وجود دارد. عالیه ما میتونیم ادامه بدیم در مرحله بعد، اجازه دهید اولین مهاجرت خود را اضافه کنیم. بر اساس وظایف مقاله "برنامه ریزی پروژه: دو بار اندازه گیری کنید، یک بار برش دهید"، اولین جدول tg_user خود را ایجاد خواهیم کرد. همه مهاجرت‌ها در پوشه projectDir/src/main/resources/db/migration قرار می‌گیرند و نام آن این خواهد بود: V00001__add_tg_user_table.sql . چرا چنین نامی در آن پوشه وجود دارد - من آن را در مقاله در مورد Spring + flyway توضیح دادم. اولین مهاجرت ما به این صورت خواهد بود: V00001__add_tg_user_table.sql:
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
یعنی در اینجا ما به سادگی جدولی از کاربری ایجاد می کنیم که فقط شناسه چت (یک عنصر منحصر به فرد است که می تواند به عنوان شناسه در جدول کار کند) و وضعیت آن - فعال یا غیرفعال است. بنابراین، اگر ربات متوقف شود، اطلاعات اشتراک باقی می‌ماند و اگر بخواهند دوباره از ربات استفاده کنند، می‌توان از آن استفاده کرد. در حال حاضر اطلاعات دیگری در مورد کاربر مورد نیاز نیست. حالا سوال اصلی: چگونه این را بررسی کنیم؟ ما باید اپلیکیشن خود را راه اندازی کنیم. تا اینجا فایل اصلی docker-compose.yml هیچ ارتباطی با دیتابیس ندارد و همچنین باید نحوه اشکال زدایی اپلیکیشن را همراه با دیتابیس یاد بگیریم. بنابراین، اجازه دهید برنامه را با Intellij IDEA راه اندازی کنیم. برای آزمایش این باید روش اصلی خود را در JavarushTelegramBotApplication اجرا کنیم. برای جداسازی کار استقرار و تست، از فایل دیگری با ویژگی ها استفاده می کنیم - application-test.properties . با این الگو به Spring اطلاع می دهیم که این فایل برای نمایه آزمایشی استفاده خواهد شد . وقتی نمایه ای را مشخص نمی کنیم، از نمایه پیش فرض استفاده می شود (هنگام اجرای SpringBoot این را در گزارش های خود بررسی کنید: در اولین سطرها در این مورد نوشته خواهد شد). این چیزی است که به نظر خواهد رسید:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
و application.properties اصلی کمی متفاوت به نظر می رسد:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
تفاوت قابل توجه در قسمت spring.datasource.url است: در نمایه آزمایشی ما یک URL در localhost داریم . یعنی انتظار می رود برنامه خارج از Docker اجرا شود، که درست است، زیرا هنگام اشکال زدایی، پروژه خود را در Intellij IDEA اجرا می کنیم و انتظار داریم که از ماشین محلی به پایگاه داده دسترسی داشته باشیم. اما URL application.properties قبلاً حاوی یک آدرس متفاوت است - jrtb-db . این نام پایگاه داده ما در docker-compose خواهد بود و به این ترتیب برنامه docker ما قادر به دسترسی به پایگاه داده خواهد بود. چرا؟ بنابراین، آنها در یک docker-compose راه اندازی می شوند و از این طریق در مورد یکدیگر می دانند. این امر ضروری است تا یک زیرساخت بسته برای پروژه داشته باشیم. اما چگونه می توان نمایه را در هنگام راه اندازی راه اندازی کرد؟ برای انجام این کار، می توانید راه اندازی متد اصلی را در Intellij IDEA پیکربندی کنید. برای این کار Edit Configurations وجود دارد : به کلاس اصلی JavarushTelegramBotApplication بروید، بر روی فلش سبز رنگ کنار اعلان متد اصلی کلیک کنید و گزینه Modify Run Configuration را انتخاب کنید : "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 10متغیرهای لازم را وارد کرده و پروفایل را پیکربندی کنید. در Intellij IDEA، رابط این پنجره پیکربندی کمی تغییر کرده است، بنابراین به همه توصیه می کنم IDEA را به آخرین نسخه به روز کنند تا تصویر مشابهی را ببینیم: "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 11در قسمت متغیرهای محیط ، باید نام ربات و متغیرهای رمز را با استفاده از آن اضافه کنیم. الگوی زیر: variable_name1=value1؛ variable_name2=value2 . یعنی کلید=مقدار با نقطه ویرگول از هم جدا می شوند. در مورد ما به این صورت خواهد بود: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (شما نام و نشانه دیگری برای ربات خواهید داشت) سپس، دکمه Add VM options را در قسمت Mod انتخاب کنید : : -Dspring.profiles.active =test - این به SpringBoot می گوید که از نمایه آزمایشی استفاده کند، به این معنی که ویژگی ها از application-test.properties گرفته می شوند. در نتیجه، به این شکل خواهد بود: اکنون پایگاه داده آزمایشی خود را راه اندازی می کنیم: docker-compose -f docker-compose-test.yml up و دقیقاً به این ترتیب، بدون پیشوند -d، به طوری که لاگ ها می توانند بلافاصله در آن مشاهده شوند. ترمینال، در صورت نیاز و آخرین مرحله این است که به سادگی روش اصلی را اجرا کنید. اگر همه کارها را به همان روشی که توضیح دادم انجام دهید، به این نتیجه می‌رسید: خط دوم گزارش‌ها شرحی است از آنچه که نمایه آزمایشی به دست آورده است. ما از MySQLWorkbench عبور می‌کنیم و دو دستور را اجرا می‌کنیم تا بررسی کنیم که انتقال انجام شده و همه چیز کار می‌کند (اگرچه این از گزارش‌های راه‌اندازی برنامه قابل مشاهده است، مطمئناً ارزش بررسی را دارد):"پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 12"پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 13"پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 14
  1. از dev_jrtb_db استفاده کنید.
  2. نمایش جداول؛
نتیجه: "پروژه جاوا از A تا Z": افزودن همه چیز مربوط به پایگاه داده.  قسمت 1 - 15همانطور که انتظار داشتیم، دو جدول گرفتیم. اولی فنی برای حسابداری مهاجرت است، دوم جدول ما برای کاربران تلگرام. همه: Flyway به همراه پایگاه داده اضافه شده است. اکنون مهاجرت های جدید مانند ساعت پیش خواهند رفت. سخت ترین چیز اولین راه اندازی و راه اندازی فرآیند است. در ادامه ، ما در حال تکمیل کار روی این وظیفه جهانی هستیم: افزودن پایگاه داده به docker-compose.yml، افزودن یک لایه مخزن، آمار برای ربات، نوشتن و به روز رسانی تست ها و مستندات.

فهرستی از تمام مواد این مجموعه در ابتدای این مقاله است.

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION