JavaRush /مدونة جافا /Random-AR /نضيف كل ما يتعلق بقاعدة البيانات. (الجزء الأول) - "مشروع ...
Roman Beekeeper
مستوى

نضيف كل ما يتعلق بقاعدة البيانات. (الجزء الأول) - "مشروع جافا من الألف إلى الياء"

نشرت في المجموعة
خطوة بخطوة نتحرك نحو هدفنا. "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 1اليوم نحن بحاجة إلى حل العديد من المهام:
  1. أضف مسار الطيران. سنقوم هنا بتكوين نشر قاعدة البيانات للمشروع.
  2. إضافة مخطط قاعدة البيانات.
  3. أضف طبقة المستودع.
  4. إضافة أمر لإحصائيات الروبوت.
  5. اكتب الاختبارات، بعد كل شيء.
لذا اجلس، اجلس، ستكون هناك قراءة طويلة. لقد تعلمنا بالفعل كيفية نشر تطبيقنا باستخدام docker وdocker-compose. لم يكن الأمر سهلاً، وتهانينا لأولئك الذين تمكنوا من القيام بذلك. إذا كانت لديك أي أسئلة حول التنفيذ، فيمكنك إلقاء نظرة على الكود الموجود في طلب السحب هذا .

إضافة مسار الطيران

لإضافة 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 starter، الذي يطلق كل سحر استخدام قاعدة البيانات في Spring. ودعنا نضيف أيضًا lombok حتى لا نكتب حروفًا ومحددات:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
الآن نحن بحاجة إلى قاعدة بيانات للتنمية. سنقوم بإنشائه في الوقت الحالي ( حتى أتوصل إلى فكرة أفضل ) كملف إنشاء عامل إرساء منفصل وملف منفصل لـ application.properties. يوجد شيء من هذا القبيل في التطوير (وفي نظام Spring البيئي على وجه الخصوص) كملفات تعريف. اعتمادًا على ملف التعريف، يتم تشغيل إعدادات مختلفة للتشغيل. أعتقد أننا سنقوم في المستقبل بدمج docker-compose في ملف واحد والتأكد من تشغيل قاعدة بيانات واحدة فقط للتطوير على الإعدادات التي نحتاجها. في الوقت الحالي سنفعل هذا:
  1. لنقم بإنشاء ملف في جذر المشروع docker-compose-test.yml، حيث سيتم تشغيل قاعدة البيانات ذات الإعدادات الخاصة فقط.
  2. لنقم بإنشاء ملف application-test.properties بإعدادات تطابق الإعدادات الموجودة في ملف docker-compose-test.yml.
للعمل مع MySQL، أخذت الصورة الرسمية من DockerHub : "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 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 )، ثم نقوم بذلك لنفترض أننا بحاجة إلى رفع الخدمات والقيام بذلك في الوضع الخفي ( up -d ) - أي بحيث يتم تشغيل العملية خارج الجلسة الطرفية التي تم إطلاق هذا الأمر فيها. نطلق قاعدة البيانات ونحاول الاتصال بها للتأكد من أنها جاهزة للاستخدام. للقيام بذلك، افتح MySQL Workbench المألوف ( تحدثنا عنه هنا ) وقم بإنشاء اتصال جديد: "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 3نحتاج إلى ملء الحقول التالية:
  • اسم الاتصال - اسم الاتصال - اختياريًا، DEV_JRTB_DB؛
  • اسم المضيف - هنا هو العنوان الذي تم نشر قاعدة البيانات فيه. في حالتنا، سيبقى كل شيء كما كان: 127.0.0.1 أو المضيف المحلي؛
  • اسم المستخدم - هنا سيكون الجذر، كما كتبنا في docker-compose؛
  • كلمة المرور - الجذر أيضًا.
بعد ذلك، تحتاج إلى التحقق مما إذا كان الاتصال سيعمل. للقيام بذلك، انقر فوق اختبار الاتصال : "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 4ونتيجة لذلك، حصلنا على: فشل الاتصال بـ MySQL... لماذا؟ نذهب إلى المحطة ونرى ما حدث لحاوية الإرساء. لنكتب في المحطة: "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 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 [خطأ] [نقطة الإدخال]: قاعدة البيانات غير مهيأة ولم يتم تحديد خيار كلمة المرور 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
لقد قمنا بإزالة هذه المتغيرات للمستخدم وكلمة المرور وأضفنا كلمة المرور للمستخدم الجذر فقط. وهذا يعني أن المستخدم الجذر سيكون لديه الآن كلمة مرور الجذر. على الأقل هذا ما نفترضه. لنقم الآن بتشغيله ونرى ما سيحدث: 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.

يبدو أنه لم تعد هناك أخطاء، لذا يمكنك معرفة ما إذا كان سيكون هناك إمكانية الوصول. ولكن، لسوء الحظ، لا يمكن الوصول مرة أخرى... لا شيء: سنكتشف الأمر أكثر! "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 6لإنهاء docker-compose وحذف جميع الحاويات، تحتاج إلى كتابة: docker-compose -f docker-compose-test.yml لأسفل هنا حددنا الملف المراد حذفه. ما يجب القيام به؟ دعنا نبحث عنها في جوجل: ربما قام شخص ما بذلك بشكل أفضل. أبسط استعلام: "مثال على 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: "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 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 نحاول الدخول إلى قاعدة البيانات من خلال طاولة العمل: كل شيء على ما يرام . ثم الخيار الوحيد هو إصدار قاعدة البيانات. ينص بوضوح على 5.7، أي إذا قمت بتغييره إلى الأحدث، فلا ينبغي أن يعمل. لقد قمت بإعادة تشغيله - وهو لا يعمل حقًا... "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 8على ما يبدو، لديهم بعض المشاكل مع صورة عامل الإرساء في الإصدار الأحدث. حسنا لا مشكلة. يحدث هذا غالبًا مع البرامج المجانية. سوف نستخدم الإصدار 5.7. دعونا نرى ما إذا كانت هناك قاعدة بيانات نحتاجها - dev_jrtb_db. للقيام بذلك، قم بتشغيل أمر الاستعلام في MySQL Workbench SHOW DATABASES : "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 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
وسوف تبدو خصائص التطبيق الرئيسية مختلفة قليلاً:
# 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 على المضيف المحلي . أي أنه من المتوقع أن يعمل التطبيق خارج Docker، وهذا صحيح، لأنه عند تصحيح الأخطاء، سنقوم بتشغيل مشروعنا في Intellij IDEA ونتوقع أنه سيكون لدينا إمكانية الوصول إلى قاعدة البيانات من الجهاز المحلي. لكن عنوان URL الخاص بالتطبيق application.properties يحتوي بالفعل على عنوان URL مختلف - jrtb-db . سيكون هذا هو اسم قاعدة البيانات الخاصة بنا في docker-compose، وبهذه الطريقة سيتمكن تطبيق الإرساء الخاص بنا من الوصول إلى قاعدة البيانات. لماذا؟ لذلك، سيتم إطلاقهما داخل نفس عامل الإرساء وسيتعرفان على بعضهما البعض بهذه الطريقة. يعد ذلك ضروريًا حتى يكون لدينا بنية تحتية واحدة مغلقة للمشروع. ولكن كيف يتم تشغيل الملف الشخصي عند بدء التشغيل؟ للقيام بذلك، يمكنك تكوين إطلاق الطريقة الرئيسية في Intellij IDEA. لهذا، هناك تحرير التكوينات : انتقل إلى الفئة الرئيسية لـ JavarushTelegramBotApplication، وانقر على السهم الأخضر بجوار إعلان الطريقة الرئيسية وحدد تعديل تشغيل التكوين : "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 10أدخل المتغيرات الضرورية وقم بتكوين ملف التعريف. في Intellij IDEA، تغيرت واجهة نافذة التكوين هذه قليلاً، لذا أنصح الجميع بتحديث IDEA إلى الإصدار الأحدث حتى نرى نفس الصورة: "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 11في حقل متغيرات البيئة ، نحتاج إلى إضافة اسم الروبوت ومتغيرات الرمز المميز باستخدام القالب التالي: variable_name1=value1;variable_name2=value2 . أي أنه يتم فصل قيمة المفتاح = القيمة بفواصل منقوطة. في حالتنا سيكون الأمر على النحو التالي: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (سيكون لديك اسمًا ورمزًا مميزًا مختلفًا للروبوت) بعد ذلك، حدد حقل خيارات Add VM في زر تعديل الخيارات : كتابة : -Dspring.profiles.active =test - هذا سيخبر SpringBoot باستخدام ملف تعريف الاختبار، مما يعني أنه سيتم أخذ الخصائص من application-test.properties. ونتيجة لذلك، سيبدو كما يلي: الآن نطلق قاعدة بيانات الاختبار الخاصة بنا: docker-compose -f docker-compose-test.yml up وبهذه الطريقة بالضبط، بدون البادئة -d، بحيث يمكن رؤية السجلات على الفور المحطة، إذا كانت هناك حاجة إليها. والخطوة الأخيرة هي ببساطة تشغيل الطريقة الرئيسية. إذا فعلت كل شيء بنفس الطريقة التي وصفتها، فسوف ينتهي بك الأمر إلى ما يلي: سيكون السطر الثاني من السجلات عبارة عن وصف لما حصل عليه ملف تعريف الاختبار. نمر عبر MySQLWorkbench ونقوم بتشغيل أمرين للتأكد من أن الترحيل قد بدأ وأن كل شيء يعمل (على الرغم من أن هذا مرئي من سجلات تشغيل التطبيق، إلا أنه بالتأكيد يستحق التحقق):"مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 12"مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 13"مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 14
  1. استخدم dev_jrtb_db؛
  2. عرض الجداول؛
النتيجة: "مشروع جافا من الألف إلى الياء": إضافة كل ما يتعلق بقاعدة البيانات.  الجزء 1 - 15كما توقعنا، حصلنا على جدولين. الأول تقني لحساب عمليات الترحيل، والثاني هو جدولنا لمستخدمي Telegram. الكل: تمت إضافة مسار الطيران مع قاعدة البيانات. الآن سوف تسير الهجرات الجديدة كالساعة. أصعب شيء هو الإعداد الأول للعملية وإطلاقها. استمرارًا ، نحن نكمل العمل على هذه المهمة العالمية: إضافة قواعد البيانات إلى docker-compose.yml، وإضافة طبقة المستودع، وإحصائيات الروبوت، وكتابة وتحديث الاختبارات والوثائق.

توجد قائمة بجميع المواد الموجودة في السلسلة في بداية هذه المقالة.

تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION