JavaRush /Java блогу /Random-KY /Биз маалымат базасына тиешелүү нерселердин баарын кошобуз...
Roman Beekeeper
Деңгээл

Биз маалымат базасына тиешелүү нерселердин баарын кошобуз. (1-бөлүк) - "Java долбоору Адан Яга чейин"

Группада жарыяланган
Биз кадам сайын максатыбызга карай бара жатабыз. "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-1-бөлүкБүгүн биз көптөгөн милдеттерди чечишибиз керек:
  1. Flyway кошуу. Бул жерде биз долбоор үчүн маалымат базасын жайгаштырууну конфигурациялайбыз.
  2. Берorштер базасынын схемасын кошуу.
  3. Репозиторий катмарын кошуңуз.
  4. Бот статистикасы үчүн буйрук кошуу.
  5. Кантсе да тесттерди жаз.
Ошентип отур, артка отур, көп окуу болот. Биз докер жана докер-композит аркылуу тиркемени кантип жайгаштырууну үйрөндүк . Бул оңой болгон жок, ага жетишкендерди куттуктайм. Эгер сизде ишке ашыруу боюнча суроолоруңуз болсо, бул тартуу сурамындагы codeду карасаңыз болот .

Flyway кошуу

Flyway'ди кошуу үчүн сизде маалымат базасы болушу керек, аны биз docker-compose кызматына башка кызмат катары кошобуз. Акыркы жолу мен docker-compose кызматтарынын бөлүмү бар экенин айттым, ал белгилүү бир инфраструктураны кошууга жана башкарууга так жооп берет - башкача айтканда, тиркемелер/берorштер базалары/мессенджерлер ж.б.
Мен Flyway деген эмне экенин жана аны SpringBoot тиркемесине кантип кошуу керектиги жөнүндө айтып бердим . Бул макаланы окуудан мурун эс тутумуңузду жаңыртып алууну кеңеш кылам. Сиз ошондой эле Flyway + SpringBoot жөнүндө макаланы көрсөтүү менен долбоордун README.md файлын окуй аласыз .
Биз кылган биринчи нерсе - долбоордогу негизги бутагыбызды жаңыртуу (git pull) жана биздин тапшырманын аталышы менен жаңысын түзүү - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Эске сала кетейин: долбоордогу тапшырмалардын ырааттуулугун аты боюнча гана иреттөө мүмкүн болушу үчүн, биз фorалдардын атын өзгөрттүк. Бул бир кадамдан экинчи кадамга тез өтүүгө мүмкүндүк берет. Эми тынчтыкта ​​иштей аласыз. Биз үч көз карандылыкты кошуу керек:
<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 стартери, ал жазында маалымат базасын колдонуунун бардык сыйкырын ишке киргизет. Жана ошондой эле ломбокту кошолу, алуучу жана сетерлерди жазбаш үчүн:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Азыр бизге өнүктүрүү үчүн маалымат базасы керек. Биз аны азырынча ( мен жакшыраак идеяны ойлоп тапканга чейин ) өзүнчө докер түзүүчү файл жана application.properties үчүн өзүнчө файл катары түзөбүз . Профильдер сыяктуу өнүгүүдө (айрыкча жазгы экосистемада) бир нерсе бар. Профильге жараша иштөө үчүн ар кандай орнотуулар ишке киргизилет. Менимче, келечекте биз docker-compose бир файлга бириктиребиз жана бизге керектүү орнотууларды иштеп чыгуу үчүн бир гана маалымат базасы ишке киргизorшине ынанабыз. Азырынча биз муну жасайбыз:
  1. Келгиле, docker-compose-test.yml долбоорунун тамырында файл түзөлү, анда өзүнүн жөндөөлөрү бар маалымат базасы гана ишке киргизилет.
  2. Келгиле, docker-compose-test.yml файлындагы орнотууларга дал келген орнотуулары менен application-test.properties файлын түзөлү.
MySQL менен иштөө үчүн мен расмий сүрөттү DockerHub'дан алдым : Тез "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  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ти ачыңыз ( бул жерде биз ал жөнүндө сүйлөштүк ) жана жаңы байланыш түзүңүз: "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-3-бөлүкБиз төмөнкү талааларды толтурушубуз керек:
  • Туташуу аты - байланыш аты - каалоосу боюнча, DEV_JRTB_DB;
  • Хост аты - бул жерде маалымат базасы жайгаштырылган дарек. Биздин учурда, баары мурункудай бойдон калат: 127.0.0.1 , же localhost;
  • колдонуучунун аты - бул жерде биз docker-compose жазгандай, root болот;
  • сырсөз - ошондой эле тамыр.
Андан кийин, байланыш иштейби же жокпу, текшерүү керек. Бул үчүн, чыкылдатыңыз Test Connection : "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-4-бөлүкНатыйжада, биз: MySQLге туташа албай койдук... Эмне үчүн? Биз терминалга барып, докер контейнерине эмне болгонун көрөбүз. Терминалга жазалы: "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  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 журналдары
Кел карайбыз:

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.

Эми каталар жоктой сезилет, андыктан кирүү мүмкүнчүлүгүн көрө аласыз. Бирок, тилекке каршы, кайра кирүү мүмкүнчүлүгү жок... Эч нерсе: биз аны мындан ары карайбыз! "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-6-бөлүкDocker-compose ишин токтотуу жана бардык контейнерлерди жок кылуу үчүн, төмөнкүнү жазышыңыз керек: docker-compose -f docker-compose-test.yml down Бул жерде биз жок кыла турган файлды көрсөттүк. Эмне кылуу керек? Келгиле, аны гуглга карап көрөлү: балким, кимдир бирөө муну жакшыраак кылгандыр. Эң жөнөкөй суроо: "docker-composeдеги MySQL мисалы" бизге орто ресурска шилтемени табууга жардам берет. Алар мындай мисал келтиришет:
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 аркылуу маалымат базасына кирүүгө дагы бир жолу аракет кылабыз: "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  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 Биз базага жумушчу стол аркылуу кирүүгө аракет кылабыз: баары жакшы . Андан кийин жалгыз вариант - маалымат базасынын versionсы. Анда 5.7 так жазылган, башкача айтканда, эгер сиз аны эң акыркысына алмаштырсаңыз, иштебеши керек. Мен аны кайра баштадым - жана ал чындап иштебей жатат... "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-8-бөлүкКыязы, аларда акыркы versionда докер сүрөтү менен бир аз көйгөйлөр бар. Макул, көйгөй жок. Бул көп учурда бекер программалык камсыздоо менен болот. Биз 5.7 versionсын колдонобуз. Келгиле, бизге керектүү маалымат базасы бар-жогун карап көрөлү - dev_jrtb_db. Бул үчүн, MySQL Workbench программасында Query буйругун"Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-9-бөлүк иштетиңиз . Жакшы, биз уланта алабыз. Андан кийин, биринчи миграциябызды кошолу. "Долбоорду пландаштыруу: эки жолу өлчөп, бир жолу кес" макаласындагы тапшырмалардын негизинде биз биринчи tableбызды түзөбүз tg_user. Бардык миграциялар projectDir/src/main/resources/db/migration папкасында жайгашып , аты: V00001__add_tg_user_table.sql болот . Эмне үчүн ал папкада мындай аталыш бар - мен аны Жаз + 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
);
Башкача айтканда, бул жерде биз жөн гана чат идентификаторуна (tableда ID катары иштөө үчүн колдонула турган уникалдуу элемент) жана анын абалы - активдүү же активдүү эмес колдонуучунун tableсын түзөбүз. Демек, бот токтоп калса, жазылуу маалыматы кала берет жана алар ботту кайра колдонгусу келсе колдонсо болот. Азырынча колдонуучу тууралуу башка маалымат керек эмес. Эми негизги суроо: муну кантип текшерүү керек? Биз колдонмобузду ишке киргизишибиз керек. Азырынча, негизги docker-compose.yml файлынын маалымат базасы менен эч кандай байланышы жок жана биз ошондой эле маалымат базасы менен бирге тиркемени оңдоону үйрөнүшүбүз керек. Ошондуктан, келгиле, Intellij IDEA менен тиркемени ишке киргизели. Муну сынап көрүү үчүн биз JavarushTelegramBotApplication ичиндеги негизги ыкмабызды иштетишибиз керек. Жайгаштыруу жана тестирлөө ишин бөлүү үчүн биз касиеттери бар дагы бир файлды колдонобуз - application-test.properties . Бул шаблон менен биз Жазга бул файл сыноо профor үчүн колдонулаарын билдиребиз . Биз профилди көрсөтпөгөндө, демейки профиль колдонулат (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 талаасында: сыноо профorнде бизде localhost боюнча URL бар . Башкача айтканда, тиркеме Dockerден тышкары иштеши күтүлөт, бул чындык, анткени мүчүлүштүктөрдү оңдоодо биз долбоорубузду Intellij IDEAда иштетебиз жана жергorктүү машинадан маалымат базасына кире алабыз деп күтөбүз. Бирок application.properties URL мурунтан эле башканы камтыйт - jrtb-db . Бул биздин docker-composeдеги маалымат базабыздын аталышы болот жана ушундай жол менен биздин докер тиркемебиз маалымат базасына жете алат. Неге? Ошондуктан, алар бир эле докер-композит ичинде ишке киришет жана ушундай жол менен бири-бири жөнүндө бorшет. Бул бизде долбоор үчүн жабык инфраструктура болушу үчүн зарыл. Бирок стартапта профилди кантип ишке киргизүү керек? Бул үчүн, сиз Intellij IDEAдагы негизги ыкманы ишке киргизүүнү конфигурациялай аласыз. Бул үчүн, Конфигурацияларды түзөтүү бар : JavarushTelegramBotApplication негизги классына өтүңүз, негизги методдун декларациясынын жанындагы жашыл жебени чыкылдатыңыз жана Run конфигурациясын өзгөртүүнү тандаңыз : "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-10-бөлүкКеректүү өзгөрмөлөрдү киргизиңиз жана профилди конфигурациялаңыз. Intellij IDEAда бул конфигурация терезесинин интерфейси бир аз өзгөрдү, ошондуктан мен баарына IDEAны эң акыркы versionга жаңыртууну сунуштайм, ошондо биз ошол эле сүрөттү көрөбүз: Айлана-чөйрөнүн өзгөрмөлөрү"Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-11-бөлүк талаасында биз боттун атын жана белги өзгөрмөлөрүн кошуубуз керек. төмөнкү шаблон: өзгөрмө_аты1=маани1;өзгөрмө_аты2=маани2 . Башкача айтканда, ачкыч=маани чекиттүү үтүр менен бөлүнөт. Биздин учурда ал мындай болот: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (сизде бот үчүн башка ат жана белги болот) Андан кийин, VM параметрлерин кошуу баскычын тандаңыз : W Modify параметрлеринен : -Dspring.profiles.active =test - бул SpringBoot'ка сыноо профorн колдонууну айтат, башкача айтканда касиеттер application-test.properties сайтынан алынат. Натыйжада, ал төмөнкүдөй болот: Эми биз тесттик базабызды ишке киргизебиз: docker-compose -f docker-compose-test.yml up Жана так ушундай жол менен, -d префикси жок, журналдар дароо көрүнүп турат. зарыл болсо, терминал. Ал эми акыркы кадам жөн гана негизги ыкмасын иштетүү болуп саналат. Эгерде сиз бардыгын мен сүрөттөгөндөй кылып жасасаңыз, анда сиз төмөнкүдөй жыйынтыкка ээ болосуз: Журналдардын экинчи сабында тест профor эмне тапканынын сүрөттөлүшү болот. Биз MySQLWorkbench аркылуу өтүп, миграциянын ишке ашканын жана бардыгы иштеп жатканын текшерүү үчүн эки буйрукту аткарабыз (бул тиркемени ишке киргизүү журналдарынан көрүнүп турса да, сөзсүз түрдө текшерүү керек):"Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-12-бөлүк"Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-13-бөлүк"Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-14-бөлүк
  1. dev_jrtb_db колдонуу;
  2. tableларды көрсөтүү;
Натыйжа: "Java долбоору Адан Яга": Маалыматтар базасына тиешелүү нерселердин бардыгын кошуу.  1-15-бөлүкБиз күткөндөй, эки үстөл алдык. Биринчиси миграцияны эсепке алуу боюнча техникалык, экинчиси Telegram колдонуучулары үчүн биздин table. Бардыгы: маалымат базасы менен бирге Flyway кошулду. Эми жаңы миграция сааттын механизминдей жүрөт. Эң кыйын нерсе - процессти биринчи орнотуу жана ишке киргизүү. Улантууда , биз бул глобалдык тапшырма боюнча ишти бүтүрүп жатабыз: docker-compose.yml сайтына маалымат базаларын кошуу, Репозиторий катмарын кошуу, боттун статистикасы, тесттерди жана documentтерди жазуу жана жаңыртуу.

Сериядагы бардык материалдардын тизмеси ушул макаланын башында.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION