JavaRush /בלוג Java /Random-HE /אנחנו מוסיפים כל מה שקשור למסד הנתונים. (חלק 1) - "פרויקט...
Roman Beekeeper
רָמָה

אנחנו מוסיפים כל מה שקשור למסד הנתונים. (חלק 1) - "פרויקט ג'אווה מא' עד ת'"

פורסם בקבוצה
צעד אחר צעד אנחנו מתקדמים לעבר המטרה שלנו. "פרויקט ג'אווה מא' עד ת'": הוספת כל מה שקשור למסד הנתונים.  חלק 1 - 1היום אנחנו צריכים לפתור משימות רבות:
  1. הוסף מסלול טיסות. כאן נגדיר את הפריסה של מסד הנתונים עבור הפרויקט.
  2. הוסף סכימת מסד נתונים.
  3. הוסף שכבת מאגר.
  4. הוסף פקודה לסטטיסטיקה של בוטים.
  5. תכתוב מבחנים, אחרי הכל.
אז שבי, שבי, תהיה קריאה ארוכה. כבר למדנו כיצד לפרוס את האפליקציה שלנו באמצעות docker ו-docer-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. ובואו נוסיף גם לומבוק כדי לא לכתוב גטרים וסטרים:
<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 : "פרויקט ג'אווה מא' עד ת'": הוספת כל מה שקשור למסד הנתונים.  חלק 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 Workbench המוכר ( כאן דיברנו על זה ) וצרו חיבור חדש: "פרויקט ג'אווה מא' עד ת'": הוספת כל מה שקשור למסד הנתונים.  חלק 1 - 3עלינו למלא את השדות הבאים:
  • שם חיבור - שם חיבור - אופציונלי, DEV_JRTB_DB;
  • שם מארח - הנה הכתובת שבה נפרס מסד הנתונים. במקרה שלנו, הכל יישאר כשהיה: 127.0.0.1 , או localhost;
  • שם משתמש - כאן יהיה root, כפי שכתבנו ב-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ככל הנראה, יש להם כמה בעיות עם תמונת docker בגרסה האחרונה. אוקיי אין בעיה. זה קורה לעתים קרובות עם תוכנה חופשית. נשתמש בגרסה 5.7. בוא נראה אם ​​יש מסד נתונים שאנחנו צריכים - dev_jrtb_db. לשם כך, הפעל את פקודת ה-Query ב-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
וה- 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 ונצפה שתהיה לנו גישה למסד הנתונים מהמחשב המקומי. אבל כתובת האתר application.properties כבר מכילה כתובת אחרת - jrtb-db . זה יהיה השם של מסד הנתונים שלנו ב-docker-compose, וכך אפליקציית הדוקר שלנו תוכל להגיע למסד הנתונים. למה? לכן, הם ישיקו בתוך אותו docker-compose וידעו זה על זה בדרך זו. זה הכרחי כדי שתהיה לנו תשתית אחת סגורה לפרויקט. אבל איך להשיק את הפרופיל בהפעלה? לשם כך, תוכל להגדיר את ההשקה של השיטה הראשית ב- Intellij IDEA. לשם כך, יש Edit Configurations : עבור למחלקה הראשית של JavarushTelegramBotApplication, לחץ על החץ הירוק ליד ההצהרה של השיטה הראשית ובחר Modify Run Configuration : "פרויקט ג'אווה מא' עד ת'": הוספת כל מה שקשור למסד הנתונים.  חלק 1 - 10הזן את המשתנים הדרושים והגדר את הפרופיל. ב-Intellij IDEA, הממשק של חלון התצורה הזה השתנה מעט, אז אני ממליץ לכולם לעדכן את IDEA לגרסה העדכנית ביותר כדי שנראה את אותה תמונה: "פרויקט ג'אווה מא' עד ת'": הוספת כל מה שקשור למסד הנתונים.  חלק 1 - 11בשדה משתני הסביבה , עלינו להוסיף את שם הבוט ומשתני האסימון באמצעות התבנית הבאה: variabel_name1=value1; variable_name2=value2 . כלומר, מפתח=ערך מופרדים באמצעות נקודה-פסיק. במקרה שלנו זה יהיה כך: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (יהיו לך שם ואסימון שונים עבור הבוט) לאחר מכן, בחר בשדה הוסף אפשרויות 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כפי שציפינו, קיבלנו שני שולחנות. הראשון הוא טכני לחשבונאות עבור העברות, השני הוא הטבלה שלנו עבור משתמשי טלגרם. הכל: נתיב תעופה יחד עם מסד הנתונים נוספו. כעת הגירות חדשות ילכו כמו שעון. הדבר הקשה ביותר הוא ההגדרה וההשקה הראשונה של התהליך. בהמשך , אנו משלימים את העבודה על המשימה הגלובלית הזו: הוספת מסדי נתונים ל-docker-compose.yml, הוספת שכבת Repository, סטטיסטיקות עבור הבוט, כתיבה ועדכון של בדיקות ותיעוד.

רשימה של כל החומרים בסדרה נמצאת בתחילת מאמר זה.

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION