JavaRush /جاوا بلاگ /Random-UR /اسپرنگ بوٹ + فلائی وے - "A سے Z تک جاوا پروجیکٹ"

اسپرنگ بوٹ + فلائی وے - "A سے Z تک جاوا پروجیکٹ"

گروپ میں شائع ہوا۔
جاوا پروجیکٹ بنانے کے سلسلے میں ایک مضمون (دیگر مواد کے لنکس آخر میں ہیں)۔ اس کا مقصد کلیدی ٹیکنالوجیز کا تجزیہ کرنا ہے، نتیجہ ٹیلی گرام بوٹ لکھنا ہے۔ اس حصے میں، ہم اسپرنگ بوٹ اور فلائی وے شروع کرنے کی کوشش کرتے ہیں۔ نظریہ کی کم از کم مقدار، جیسا کہ آپ چاہیں))) ہم Flyway/Liquibase کے حتمی موازنہ کو غیر معینہ مدت کے لیے چھوڑ دیتے ہیں اور نقطہ پر پہنچ جاتے ہیں۔ اور اس کے باوجود یہ پہلے ہی گھسیٹ چکا ہے۔ Flyway کو دو بار بیان نہ کرنے کے لیے، میں نے اسے فوری طور پر اپنے مستقبل کے JRTB پروجیکٹ میں شامل کرنے کا فیصلہ کیا۔"Java-проект от А до Я": SpringBoot + Flyway - 1

ہمیں اس کے حصے کے طور پر کیا کرنے کی ضرورت ہے؟

  1. Maven پر مبنی اسپرنگ بوٹ ایپلیکیشن لانچ کریں۔
  2. وہاں فلائی وے شامل کریں: خوش قسمتی سے، وہ آسانی سے مربوط ہیں۔
  3. ان میزوں کے لیے ایک اسکیما شامل کریں جو ہمارے پاس مثال کے ڈیٹا بیس میں ہے۔
اس طرح ہم Flyway کے ساتھ کام کرنے کا طریقہ سیکھیں گے۔ کیوں ایک علیحدہ پراجیکٹ، اور فوری طور پر ہمارے JRTB میں نہیں؟ کیونکہ بعد میں، جو بھی یہ سمجھنا چاہتا ہے کہ یہ کیسے کرنا ہے اس کے پاس ایک پروجیکٹ ہوگا جس میں ایک مثال اور ایک مضمون ہوگا جو اس کے ساتھ کام کرنے کی وضاحت کرتا ہے۔ ٹھیک ہے، چلو!

فلائی وے کیا ہے؟

کسی چیز کو استعمال کرنے کے لیے، آپ کو پہلے یہ معلوم کرنا ہوگا کہ وہ کیا ہے اور کیوں۔ فلائی وے ایک ڈیٹا بیس ورژن کنٹرول ٹول ہے۔ الفاظ تو معروف ہیں، لیکن کسی نہ کسی طرح سمجھ میں اضافہ نہیں ہوا، ہے نا؟ آئیے اس مسئلے کو بیان کرنے کی کوشش کرتے ہیں جو فلائی وے حل کرتا ہے۔ ہم کہتے ہیں کہ ہمارے پاس ایک پروجیکٹ ہے۔ ہماری دنیا کی ہر چیز کی طرح، یہ کامل نہیں ہے، اس لیے منصوبہ بندی کرنا اور منصوبے کا حتمی ورژن تیار کرنا ممکن نہیں تھا۔ ہر بار کچھ بے حساب باریکیاں ظاہر ہوتی ہیں۔ پروجیکٹ اپنے کام میں ڈیٹا بیس کا استعمال کرتا ہے۔ بلاشبہ، اگر پروجیکٹ تبدیل ہوتا ہے، تو ڈیٹا بیس کا ڈھانچہ بھی بدل سکتا ہے۔ ہم کہتے ہیں کہ ہم اپنے پروجیکٹ میں سے کسی ایک کے لیے ایک نیا فیلڈ شامل کرتے ہیں۔ یہ کیسے کرنا ہے؟
  1. اس فیلڈ کو ہمارے ادارے میں شامل کریں، ہر چیز کو اپ ڈیٹ کریں تاکہ کاروباری منطق کام کرے۔
  2. ڈیٹا بیس کو اپ ڈیٹ کریں۔ واحد ممکنہ طریقہ اسے دستی طور پر کرنا ہے۔ ایسا کرنے کے لیے، آپ کو اندر جاکر ضروری ایس کیو ایل اسکرپٹ کو رجسٹر کرنے کی ضرورت ہے۔
دوسرا نکتہ بہت سے سوالات کو جنم دیتا ہے:
  1. لیکن اگر ہمارے پاس ایک سے زیادہ جگہیں ہیں جہاں ہم اپنا پروجیکٹ لگاتے ہیں، تو کیا ان میں سے ہر ایک میں ایسا کرنے کی ضرورت ہے؟
  2. اور اگر ہم واپس جانا چاہتے ہیں تو ہمیں کیسے معلوم ہوگا کہ ڈیٹا بیس کا ڈھانچہ اب کس حالت میں ہے؟
  3. ہم کیسے یقین کریں گے کہ ڈیٹا بیس کی تبدیلی کامیاب تھی؟
  4. مجھے پروجیکٹ میں ہونے والی تمام ڈیٹا بیس تبدیلیوں کو ٹریک کرنے کا موقع کیسے مل سکتا ہے؟
Если делать руками, то ответы будут не лучшие… Whatбы избежать всех этих трудностей, можно воспользоваться инструментом для миграции БД. Одним из таких и является Flyway. В чем заключается его работа? В рамках проекта мы храним отдельные sql файлы (так называемые миграции), которые хранят в себе все то, что мы делаем с БД за один раз. Все миграции идут строго в определенном порядке, что позволяет отследить изменения в структуре и данных БД (часто при помощи миграции добавляют тестовые данные в проект, чтобы при разворачивании его на Howой-то server он уже имел Howие-то значения, при помощи которых можно тестировать проект). После того, How пройдут тесты, при сборке проекта запускаются миграции. Они соединяются с базой данных и проводят миграции. Если миграции уже были проведены на этой базе данных, то flyway их просто пропустит (у него в БД в отдельной таблице хранятся данные о миграциях, об их состоянии, что помогает управлять ими), а если Howая-то миграция прошла неуспешно, то сборка проекта и его монтирование (деплой) на server остановятся. Я постарался описать How можно подробнее. Если все еще не до конца ясно — не беда: в практике придет и понимание.

Запускаем SpringBoot + Flyway

What такое Spring Boot

А что же такое запускаем?... Whatбы понять, что и зачем мы делаем, нужно определиться с тем, что такое SpringBoot. Вначале быстро поговорим (ну ооочень быстро) о Spring. На данный момент это де-факто промышленный стандарт в разработке serverных приложений на Java. Стандарт чего? Как вам так объяснить. Spring — это скелет applications, на который мы потом набрасываем “мясо” — нашу бизнес-логику. При помощи спринга (здесь и далее буду использовать эту кальку, чтобы не тратить время на переключение языка :D )) Спринг дает нам старт, с которого мы начинаем все делать. Он многоликий многомодульный:
  1. Хочешь работать с базой данных? Хочешь с реляционной? Хочешь с нереляционной? Вот, пожалуйста, у нас Spring Data.
  2. Хочешь работать с http requestами? Вот тебе, пожалуйста, Spring web (Spring MVC).
  3. Тебе нужен контейнер для всех an objectов в одном месте? Вот Spring Core.
  4. Нужно настроить безопасность на проекте, да так, чтобы были разные роли и субординация? Spring Security.
  5. Ты только подумал о том, что хорошо бы иметь такую штуку, так окажется, что у Спринга уже есть то, что тебе нужно, и оно быстро и легко интегрируется.
Поэтому можно сказать, что это не просто фреймворк (такая бооольшая библиотека), а уже целая экосистема, которая развивается бешеными темпами. Whatбы понять, что из себя представляет Spring Core, то есть база, к которой подключаются модули, советую посмотреть живое демо по созданию собственного фреймворка. Ведет его Евгений Борисов, очень крутой чувак в области Java и спринга. Проделайте все то, что он сделал, и работа спринга вам станет более понятной. SpringBoot, в свою очередь, — это вершина всего того, что у них есть. Магия чистой воды. Минимум настроек для того, чтобы сделать первый запуск applications. Разумеется, это не даст вам понимания, How им пользоваться и что нужно делать. Но перед тем, How бросаться в глубь разработки, нужно посмотреть на все с высоты птичьего полета.

Запускаем SpringBoot

Так How мы уже разбирались в том, что такое мавен, давайте создадим новый проект для наших нужд. Для этого просто нужно перейти на сайт, специально созданный для этого дела. Называется он Spring Initializr."Java-проект от А до Я": SpringBoot + Flyway - 2Здесь нужно заполнить и выбрать необходимое:
  1. Инструмент по сборке проекта — gradle or maven. Как видите, об Ant уже и не вспоминают. Это хорошая подсказка о том, Howим средствам сборки стоит уделить время.
  2. Язык, на котором можно писать — java, kotlin, groovy. Здесь все просто: все они JVM подобные и спокойно запускают Java code. К слову, стоит посмотреть и на Котлин. Груви уже откровенно стал неинтересным (было время, когда на груви переходor, но оно быстро прошло).
  3. Версию спринга… Здесь нужно понимать, что версии главной части спринга и его модулей согласованы.
  4. Данные о проекте. Я уже описывал эти вещи.
  5. Выбираем, в Howой архив будет собираться — Jar or War.
  6. Ну и версию джавы нашей любимой. А то в последнее время развелось этих версий… много) То ждали годами, а теперь по две в год.
В нашем случае будем публиковать этот проект в организации JavaRush Community, поэтому и данные о проекте будут соответствующие:
  1. Maven — не зря же мы говорor с вами об этом ранее.
  2. Java — наша родимая :D
  3. Версию возьмем 2.2.11. Почему не самую новую? Потому что чем новее, тем больше шансов, что там могут быть Howие-то косяки. Для нас не принципиально, Howая именно version, а более старая будет надежнее. Поэтому выбираем 2.2.11.
  4. Group: com.github.javarushcommunity
  5. Artifact: springboot-flyway-demo
  6. Name: SpringBoot + Flyway Demo
  7. Description: Project demonstrates integration between SpringBoot and Flyway. (Да, умение писать documentацию — это важная часть разработки:))
  8. Package name: com.github.javarushcommunity.springbootflywaydemo. Здесь за нас сразу же создадут базовый пакет с классом, который запустит наше приложение.
  9. Packaging: Jar
  10. Java: 8. Не будем идти впереди паровоза и возьмем старую добрую восьмерку. Почему не 11? А зачем? Для нашего примера не вижу смысла.
"Java-проект от А до Я": SpringBoot + Flyway - 3А теперь добавим модули. Нам нужно найти интеграцию с Flyway. Можно еще добавить что-то связанное с MySQL и Spring Data. Добавим еще ломбок (это очень нужная вещь, просто поверьте пока что :D)) Для этого дела нажимаем на ADD DEPENDENCIES… и выберем все, что нужно:"Java-проект от А до Я": SpringBoot + Flyway - 4Вот так добавим Flyway."Java-проект от А до Я": SpringBoot + Flyway - 5Ломбок… И так далее. В итоге получим:"Java-проект от А до Я": SpringBoot + Flyway - 6Хух… заполнor все)) Теперь жмем GENERATE… и все — архив со сгенерированным проектом готов :) Там еще есть такая крутая штука How SHARE…, которая дает вам ссылку на page, которую вы только что заполнor. То есть, вот та, которую я генерировал. И даже если у вас что-то пойдет не так, всегда можно будет проверить по ссылке. Далее нам нужно привязать созданный проект к гит репозиторию, поэтому клонируем созданный проект springboot-flyway-demo и качаем его через IDEA. Для этого, нужно открыть идею и выбрать File -> New -> Project from Existing Sources…:"Java-проект от А до Я": SpringBoot + Flyway - 7Теперь добавляем URL и нажимаем Clone. Следующим шагом нужно перенести внутренности сгенерированного проекта внутрь того, что мы клонировали. Запутал? Now покажу. Разархивировал и получил такой набор файлов:"Java-проект от А до Я": SpringBoot + Flyway - 8Вот их и нужно перенести в клонированный проект. Как и в прошлой статье, добавим pom.xml How мавен проект:"Java-проект от А до Я": SpringBoot + Flyway - 9Теперь нам интересно посмотреть на то, что нам сгенерировали. Если открыть все папки в src и далее, то будет видна обычная иерархия в мавен проектов, которую мы разбирали в предыдущей статье. Кто не читал — почитайте!"Java-проект от А до Я": SpringBoot + Flyway - 10Видно, что у нас есть Application класс, и при помощи него запустится наше SpringBoot приложение. Благодаря плагину в мавене для SpringBoot, у нас появился нужный нам таск для мавена, а именно — spring-boot:run. Где мы можем найти эту информацию? Справа, открыв плашку Maven и наш проект:"Java-проект от А до Я": SpringBoot + Flyway - 11Будет ошибка, и ее так мы не сможем прочесть, увидим что-то такое:"Java-проект от А до Я": SpringBoot + Flyway - 12Whatбы получить больше информации, для быстроты мы можем запустить main метод Application классе:"Java-проект от А до Я": SpringBoot + Flyway - 13И тогда уже увидим реальную причину:"Java-проект от А до Я": SpringBoot + Flyway - 14Здесь уже информации поболее и можно с ней что-то делать. What не так? У нас есть зависимости, связанные с БД, и поэтому нужно предоставить настройки для подключения к оной. Для этого дела гуглим, находим, что нужно добавить следующие конфигурации в application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/flyway_demo_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Запускаем еще раз main метод и получаем:"Java-проект от А до Я": SpringBoot + Flyway - 15Теперь нужно добавить хотя бы одну миграцию. Whatбы правильно составить миграцию, нужно взять следующий шаблон: V<VERSION>__<NAME>.sql Руководствуясь им, создадим файл миграции с именем V00001__Create_country_table.sql в соответствующей папке: /src/main/resources/db.migration/. В ней создадим таблицу country. Скрипт возьмем из второй статьи о БД."Java-проект от А до Я": SpringBoot + Flyway - 16Перед запуском зайдем и создадим БД для работы: flyway_demo_db. Сделаем это через MysqlWorkbench:"Java-проект от А до Я": SpringBoot + Flyway - 17Теперь-то можно запустить еще раз main метод:"Java-проект от А до Я": SpringBoot + Flyway - 18Все получилось, но так How у нас ничего еще нет в проекте, он закончил работу. Однако видно из логов (что такое логи — вот почитайте), что:
  1. Успешно подключorсь к БД.
  2. Прошла валидация миграции и с ней все ок.
  3. Flyway создал таблицу для управления миграциями.
  4. И то, что начала миграция 00001 — создание country прошла успешно.
Whatбы это проверить, можно сходить и посмотреть, что делается в БД. Так что зайдем на наш MySQL server и посмотрим, что там с tableми в бд flyway_demo_db: $ USE flyway_demo_db; $ SHOW TABLES;"Java-проект от А до Я": SpringBoot + Flyway - 19Как я и ожидал, прошла миграция, в ходе которой создалась table country и появилась table flyway_schema_history, которая хранит информацию по миграциям. Пойдем дальше и посмотрим Howие там есть записи (и есть ли вообще они). $ SELECT * FROM flyway_schema_history;"Java-проект от А до Я": SpringBoot + Flyway - 20Вот и запись, одна-единственная. В ней — много интересных данных. Версия, описание миграции, Howой тип SQL (и, может быть, еще XML), Name самого скрипта, чексумма (это что-то типа hashcode, при помощи которого проверяется, изменилась or нет миграция. Делается это на случай, если мы провели миграцию в БД и потом ее поправor: делать этого нельзя, все правки вносятся только посредством новой миграции и чтобы этого не было, чек сумма следит за этим), Name sql юзера, дата обработки миграции, время на выполнение и результат (успешно or не успешно). Миграция, написанная один раз, не должна быть изменена будущем. Даже если в ней находится дефект. Все изменения проходят только посредством новой миграции. Это очень важно. Whatбы показать, что будет, давайте немного изменим наш скрипт и попробуем запустить его вновь. Добавим в нашу миграцию одну запись в таблицу country:"Java-проект от А до Я": SpringBoot + Flyway - 21и запустим main метод и вот что получим:"Java-проект от А до Я": SpringBoot + Flyway - 22Как я и ожидал, flyway распознал, что скрипт был изменен и не провел миграцию. В некоторых случаях действительно бывает необходимо запустить обновленную миграцию и чтобы flyway это пропустил, нужно удалить запись в таблице flyway_schema_history и уже после этого накатить обновленную миграцию. Это не нормальное поведение и так не должно быть, но знать о таком способе разрешения проблемы также нужно. Разобрались с первой миграцией. Теперь хотелось бы добавить еще одну миграцию, с данными о странах, How было в статье о БД: файл V00002__Add_test_data_to_country.sql"Java-проект от А до Я": SpringBoot + Flyway - 23И запустим опять main метод:"Java-проект от А до Я": SpringBoot + Flyway - 24Из логов видно, что перед началом запуска миграции БД была в версии 00001, поэтому запустятся все миграции после этой версии. Далее, запустилась version 00002 и прошла успешно. Проверим, or уже верите мне, что три записи в country будут уже находится в БД?)) Я бы проверил, поэтому пруф:"Java-проект от А до Я": SpringBoot + Flyway - 25Вот How-то так. Если запустить еще раз проект, то flyway просто пропустит накатывание миграций, так How база данных fully соответствует необходимой версии.

Вывод

В этот раз мы научorсь худо-бедно понимать и использовать инструмент для миграции БД в связке со SpringBoot. Эта информация необходима для понимания того, что такое инструмент контроля версий баз данных на примере Flyway. Друзья, исходники проекта, который я показал, опубликованы у нас в организации на гитхабе. Если вам нравится пример, ставьте ему звезду, и я буду понимать, что моя работа полезна и ее реально стоит продолжать. Традиционно предлагаю подписаться на мой гитхаб аккаунт. Через него я веду всю свою работу по open source и все те демо проекты, которые неизменно сопровождают мои статьи. Всем спасибо за прочтение. В следующий раз уже будем писать наше приложение. Будет еще в будущем необходимая теория по докеру, но мы ее густо разбавим практикой.

Полезные ссылки

Сегодня не так уж и много полезных ссылок. Обратите внимание на видео Евгения, оно действительно стоит того!
  1. Сайт для создания проектов на спринге
  2. Евгений Борисов — Spring-построитель
  3. Документация в спринге по Flyway

Список всех материалов серии в начале этой статьи.

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION