JavaRush /Java блогы /Random-KK /Біз дерекқорға қатысты барлық нәрсені қосамыз. (1-бөлім) ...
Roman Beekeeper
Деңгей

Біз дерекқорға қатысты барлық нәрсені қосамыз. (1-бөлім) - «Java жобасы А-дан Я-ға дейін»

Топта жарияланған
Біз мақсатымызға қарай қадам басып келе жатырмыз. «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1 - 1 бөлімБүгін бізге көптеген міндеттерді шешу қажет:
  1. Flyway қосыңыз. Мұнда біз жоба үшін дерекқорды орналастыруды конфигурациялаймыз.
  2. Дерекқор схемасын қосыңыз.
  3. Репозиторий қабатын қосыңыз.
  4. Бот статистикасы үшін пәрменді қосыңыз.
  5. Ақыр соңында, тесттер жазыңыз.
Сондықтан отырыңыз, отырыңыз, ұзақ оқу болады. Біз docker және docker-compose арқылы қолданбамызды қалай орналастыру керектігін үйрендік . Бұл оңай болған жоқ, қолынан келгендерді құттықтаймын. Егер сізде іске асыру туралы сұрақтарыңыз болса, осы тарту сұрауындағы codeты қарауға болады .

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). Еске сала кетейін: жобадағы тапсырмалар тізбегін тек аты бойынша ғана сұрыптауға болатындай етіп ф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 бір файлға біріктіреміз және бізге қажет параметрлерді әзірлеу үшін тек бір дерекқор іске қосылғанына көз жеткіземіз деп ойлаймын. Әзірге біз мұны істейміз:
  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-composa жазғандай root болады;
  • құпия сөз - сонымен қатар root.
Осыдан кейін қосылым бар-жоғын тексеру керек. Ол үшін «Қосылымды тексеру» түймесін басыңыз : «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-4 бөлімНәтижесінде біз мынаны аламыз: MySQL-ке қосылу сәтсіз аяқталды... Неліктен? Біз терминалға барамыз және докер контейнеріне не болғанын көреміз. Терминалға жазайық: «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1 - 5 бөлімТерминал 59 minutes бұрын жасалғанын көреміз, ал қайта іске қосу 55 секунд болды... неге? Бұл түсініксіз, журналдарды қарау керек. Терминалдағы жоба түбіріне өтіп, келесі пәрменді іске қосыңыз: docker-compose -f docker-compose-test.yml журналдары
Біз алып жатырмыз:

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 төмен Мұнда біз жойылатын файлды көрсеттік. Не істеу? Google оны іздеп көрейік: мүмкін біреу мұны жақсырақ жасады. Ең қарапайым сұрау: «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 төмен docker-compose -f docker-compose-test.yml up Біз жұмыс үстелі арқылы дерекқорды енгізуге тырысамыз: бәрі жақсы . Содан кейін жалғыз нұсқа - дерекқор нұсқасы. Онда 5.7 анық жазылған, яғни оны соңғысына ауыстырсаңыз, ол жұмыс істемеуі керек. Мен оны қайта іске қостым - және ол шынымен де жұмыс істемейді ... «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-8 бөлімШамасы, оларда соңғы нұсқадағы докер кескінімен кейбір проблемалар бар. Жарайды, проблема жоқ. Бұл көбінесе тегін бағдарламалық жасақтамада болады. Біз 5.7 нұсқасын қолданамыз. Бізге қажет дерекқор бар-жоғын көрейік - dev_jrtb_db. Ол үшін MySQL Workbench жүйесінде Сұраныс пәрменін іске қосыңыз ДЕРЕКТЕР ҚОРЛАРЫН КӨРСЕТУ : «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1 - 9 бөлімИә, ол шығыста бар. Тамаша, біз жалғастыра аламыз. Әрі қарай, бірінші көшіруді қосамыз. «Жобаны жоспарлау: екі рет өлше, бір рет кес» мақаласының тапсырмаларына сүйене отырып, біз 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
);
Яғни, мұнда біз жай ғана сөйлесу идентификаторы (кестеде идентификатор ретінде жұмыс істеуге болатын бірегей элемент) және оның күйі - белсенді немесе белсенді емес пайдаланушының кестесін жасаймыз. Осылайша, егер бот тоқтатылса, жазылым туралы ақпарат қалады және олар ботты қайта пайдаланғысы келсе, оны пайдалануға болады. Әзірге пайдаланушы туралы басқа ақпарат қажет емес. Енді басты сұрақ: мұны қалай тексеруге болады? Біз қолданбамызды іске қосуымыз керек. Әзірге негізгі 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 өрісінде: сынақ профилінде бізде localhost URL мекенжайы бар . Яғни, қолданба Docker-тен тыс жұмыс істейді деп күтілуде, бұл дұрыс, өйткені жөндеу кезінде біз жобамызды Intellij IDEA жүйесінде іске қосамыз және жергілікті машинадан дерекқорға қол жеткізе аламыз деп күтеміз. Бірақ application.properties URL мекенжайында басқа біреу бар - jrtb-db . Бұл docker-compose жүйесіндегі дерекқорымыздың атауы болады және осылайша біздің докер қолданбасы дерекқорға қол жеткізе алады. Неліктен? Сондықтан олар бір докер-композит ішінде іске қосылады және осылайша бір-бірін біледі. Бұл жоба үшін бір жабық инфрақұрылым болуы үшін қажет. Бірақ іске қосу кезінде профильді қалай іске қосуға болады? Ол үшін Intellij IDEA жүйесінде негізгі әдісті іске қосуды конфигурациялауға болады. Ол үшін конфигурацияларды өңдеу бар : JavarushTelegramBotApplication негізгі класына өтіңіз, негізгі әдіс декларациясының жанындағы жасыл көрсеткіні нұқыңыз және Іске қосу конфигурациясын өзгерту таңдаңыз : «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-10 бөлімҚажетті айнымалы мәндерді енгізіңіз және профильді конфигурациялаңыз. Intellij IDEA-да осы конфигурация терезесінің интерфейсі аздап өзгерді, сондықтан мен барлығына IDEA-ны соңғы нұсқаға жаңартуға кеңес беремін, осылайша біз бірдей суретті көреміз: Қоршаған ортаның айнымалылары«А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-11 бөлім өрісінде біз бот атауын және таңбалауыш айнымалы мәндерін қосуымыз керек. келесі үлгі: айнымалы_атауы1=мән1;айнымалы_атауы2=мән2 . Яғни, кілт=мән нүктелі үтірмен бөлінеді. Біздің жағдайда ол келесідей болады: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (сізде бот үшін басқа атау мен таңбалауыш болады) Одан кейін VM опцияларын қосу өрісін таңдаңыз : W Modrite опцияларында : -Dspring.profiles.active =test - бұл SpringBoot-қа сынақ профилін пайдалануды айтады, яғни сипаттар application-test.properties ішінен алынады. Нәтижесінде ол келесідей болады: Енді біз сынақ дерекқорымызды іске қосамыз: docker-compose -f docker-compose-test.yml up Дәл осылай, -d префиксінсіз, журналдарды бірден көруге болады. қажет болса, терминал. Ал соңғы қадам - ​​жай ғана негізгі әдісті іске қосу. Егер сіз бәрін мен сипаттағандай орындасаңыз, сіз мынаны аласыз: Журналдардың екінші жолында сынақ профилі не тапқанының сипаттамасы болады. Біз MySQLWorkbench арқылы өтіп, тасымалдаудың орындалғанын және барлығы жұмыс істеп тұрғанын тексеру үшін екі пәрменді орындаймыз (бұл қолданбаны іске қосу журналдарынан көрінсе де, міндетті түрде тексерген жөн):«А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-12 бөлім«А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-13 бөлім«А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1-14 бөлім
  1. dev_jrtb_db пайдаланыңыз;
  2. кестелерді көрсету;
Нәтиже: «А-дан Я-ға Java жобасы»: Дерекқорға қатысты барлық нәрсені қосу.  1 - 15 бөлімБіз күткендей екі үстел алдық. Біріншісі - көші-қонды есепке алу үшін техникалық, екіншісі - Telegram қолданушыларына арналған кестеміз. Барлығы: Дерекқормен бірге Flyway қосылды. Енді жаңа көші-қон сағат механизмі сияқты жүреді. Ең қиын нәрсе - процесті бірінші орнату және іске қосу. Жалғастыруда біз осы жаһандық тапсырма бойынша жұмысты аяқтап жатырмыз: docker-compose.yml-ге дерекқорларды қосу, Репозиторий қабатын қосу, бот статистикасы, сынақтар мен құжаттамаларды жазу және жаңарту.

Сериядағы барлық материалдардың тізімі осы мақаланың басында.

Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION