JavaRush /בלוג Java /Random-HE /SpringBoot + Flyway - "פרויקט ג'אווה מא' עד ת'"
Roman Beekeeper
רָמָה

SpringBoot + Flyway - "פרויקט ג'אווה מא' עד ת'"

פורסם בקבוצה
מאמר מסדרה על יצירת פרויקט ג'אווה (קישורים לחומרים אחרים נמצאים בסוף). המטרה שלו היא לנתח טכנולוגיות מפתח, התוצאה היא כתיבת בוט טלגרם. בחלק זה, אנו מנסים להשיק את SpringBoot ו-Flyway. הכמות המינימלית של תיאוריה, כרצונכם))) אנו משמיטים את ההשוואה הסופית של Flyway/Liquibase לתקופת זמן בלתי מוגבלת ומגיעים לנקודה. וגם ככה זה כבר נגרר. כדי לא לתאר את Flyway פעמיים, החלטתי להוסיף אותו מיד לפרויקט ה-JRTB העתידי שלנו."פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 1

מה אנחנו צריכים לעשות במסגרת זה?

  1. הפעל יישום SpringBoot המבוסס על Maven.
  2. הוסף שם את Flyway: למרבה המזל, הם משולבים בקלות.
  3. הוסף סכמה לטבלאות שיש לנו במסד הנתונים לדוגמה.
כך נלמד איך לעבוד עם Flyway. למה פרויקט נפרד, ולא מיד לתוך ה-JRTB שלנו? כי בהמשך, לכל מי שרוצה להבין איך עושים זאת, יהיה פרויקט עם דוגמה ומאמר שמתאר את העבודה איתו. ובכן, בוא נלך!

מה זה מסלול תעופה

כדי להשתמש במשהו, תחילה עליך להבין מהו ומדוע. Flyway הוא כלי בקרת גרסאות של מסד נתונים. המילים ידועות, אבל איכשהו ההבנה לא נוספה, נכון? בואו ננסה לתאר את הבעיה שמסלול הטיסה פותר. נניח שיש לנו פרויקט. כמו כל דבר בעולם שלנו, זה לא מושלם ולכן לא ניתן היה לתכנן ולעצב את הגרסה הסופית של הפרויקט. בכל פעם מופיעים ניואנסים מסויימים לא מובנים. הפרויקט משתמש במסד נתונים בעבודתו. כמובן שאם הפרויקט ישתנה, מבנה מסד הנתונים עשוי להשתנות גם הוא. נניח שאנו מוסיפים שדה חדש עבור אחד מהישויות בפרויקט שלנו. איך לעשות את זה?
  1. הוסף את השדה הזה לישות שלנו, עדכן הכל כך שהלוגיקה העסקית תעבוד.
  2. עדכן את מסד הנתונים. הדרך היחידה האפשרית היא לעשות זאת באופן ידני. כדי לעשות זאת, עליך להיכנס ולרשום את סקריפט ה-sql הדרוש.
הנקודה השנייה מעלה שאלות רבות:
  1. אבל אם יש לנו יותר ממקום אחד שבו אנו פורסים את הפרויקט שלנו, האם זה צריך להיעשות בכל אחד מהם?
  2. ואם אנחנו רוצים לחזור אחורה, איך נדע בדיוק באיזה מצב נמצא כעת מבנה מסד הנתונים?
  3. כיצד נוכל להיות בטוחים ששינוי מסד הנתונים הצליח?
  4. כיצד אוכל לקבל את ההזדמנות לעקוב אחר כל השינויים במסד הנתונים שהתרחשו בפרויקט?
אם תעשה זאת ידנית, התשובות לא יהיו הטובות ביותר... כדי להימנע מכל הקשיים הללו, אתה יכול להשתמש בכלי העברת מסד נתונים. אחד מהם הוא Flyway. מה העבודה שלו? כחלק מהפרויקט, אנו מאחסנים קבצי sql נפרדים (מה שנקרא מיגרציות), המאחסנים את כל מה שאנו עושים עם בסיס הנתונים בו-זמנית. כל ההגירות מתרחשות אך ורק לפי סדר מסוים, מה שמאפשר לך לעקוב אחר שינויים במבנה ובנתונים של מסד הנתונים (לעיתים קרובות, באמצעות העברה, נתוני בדיקה מתווספים לפרויקט כך שכאשר הם נפרסים לשרת כלשהו, ​​יש לו כבר כמה ערכים שאיתם אתה יכול לבדוק את הפרויקט). לאחר שהבדיקות עוברות, ההגירות מופעלות כאשר הפרויקט נבנה. הם מתחברים למסד הנתונים ומבצעים העברות. אם כבר בוצעו העברות על מסד הנתונים הזה, אז flyway פשוט ידלג עליהם (הוא מאחסן נתונים על ההגירות והסטטוס שלהם בטבלה נפרדת במסד הנתונים, שעוזרת לנהל אותם), ואם הגירה מסוימת לא הצליחה, אז הפרויקט build וההרכבה (הפריסה) שלו לשרת תיפסק. ניסיתי לתאר את זה בפירוט רב ככל האפשר. אם הכל עדיין לא לגמרי ברור, זה לא משנה: עם תרגול, ההבנה תגיע.

הפעל את SpringBoot + Flyway

מה זה Spring Boot

מה אנחנו משיקים?... כדי להבין מה ולמה אנחנו עושים, צריך להחליט מה זה SpringBoot. ראשית, בואו נדבר במהירות (טוב, מהר מאוד) על אביב . נכון לעכשיו, זהו תקן התעשייה דה פקטו בפיתוח יישומי שרת ב-Java. תקן של מה? איך אני יכול להסביר לך את זה? האביב הוא השלד של היישום, עליו אנו זורקים את ה"בשר" - ההיגיון העסקי שלנו. בעזרת אביב (להלן אשתמש בנייר המעקב הזה כדי לא לבזבז זמן במעבר שפה:D)) האביב נותן לנו התחלה שממנה אנחנו מתחילים לעשות הכל. הוא רב פנים, רב מודולרי:
  1. האם אתה רוצה לעבוד עם מסד נתונים? אתה רוצה יחסים? אתה רוצה לא רציונלי? הנה אנחנו עם Spring Data.
  2. האם אתה רוצה לעבוד עם בקשות http? הנה, רשת אביב (Spring MVC).
  3. האם אתה צריך מיכל לכל החפצים שלך במקום אחד? הנה Spring Core.
  4. האם צריך להגדיר אבטחה בפרויקט כך שיהיו תפקידים ושרשרת פיקוד שונים? אבטחת אביב.
  5. בדיוק כשחשבתם שיהיה נחמד שיהיה כזה דבר, מסתבר שבאביב כבר יש את מה שאתם צריכים, והוא משתלב במהירות ובקלות.
לכן, אפשר לומר שזו לא רק מסגרת (ספרייה ענקית כזו), אלא מערכת אקולוגית שלמה שמתפתחת בקצב מסחרר. כדי להבין מהי Spring Core, כלומר הבסיס שאליו מחוברים המודולים, אני ממליץ לך לצפות בהדגמה חיה על יצירת מסגרת משלך. מנחה אותו יבגני בוריסוב, בחור מאוד מגניב בתחום ג'אווה ואביב. עשה כל מה שהוא עשה, ועבודת האביב תתבהר לך יותר. SpringBoot, בתורו, הוא הפסגה של כל מה שיש להם. הקסם של מים טהורים. הגדרות מינימום לביצוע ההשקה הראשונה של האפליקציה. כמובן, זה לא ייתן לך הבנה כיצד להשתמש בו ומה לעשות. אבל לפני שאתה ממהר למעמקי הפיתוח, אתה צריך להסתכל על הכל ממעוף הציפור.

השקת SpringBoot

מכיוון שכבר הבנו מה זה Maven, בואו ניצור פרויקט חדש לצרכים שלנו. כדי לעשות זאת, אתה רק צריך ללכת לאתר שנוצר במיוחד לעניין זה. זה נקרא Spring Initializr . "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 2כאן אתה צריך למלא ולבחור את מה שאתה צריך:
  1. כלי בניית הפרויקט הוא מדורג או מיומן. כפי שאתה יכול לראות, נמלה אפילו לא מוזכרת. זהו רמז טוב לגבי אילו כלי בנייה שווים את הזמן שלך.
  2. השפה שאתה יכול לכתוב בה היא java, kotlin, groovy. הכל פשוט כאן: כולם דמויי JVM ומריצים בקלות קוד Java. אגב, שווה להסתכל על קוטלין. גרובי למען האמת הפך ללא מעניין (היתה תקופה שהם עברו לגרוב, אבל זה עבר מהר).
  3. גרסת אביב... כאן אתה צריך להבין שהגרסאות של החלק העיקרי של Spring והמודולים שלו עקביים.
  4. נתוני הפרויקט. כבר תיארתי את הדברים האלה.
  5. אנו בוחרים איזה ארכיון ייאסף - צנצנת או מלחמה.
  6. ובכן, גרסת ג'אווה של המועדפת שלנו. ולאחרונה היו הרבה מהגרסאות האלה... הם חיכו שנים, ועכשיו יש שתיים בשנה.
במקרה שלנו, נפרסם את הפרויקט הזה בארגון JavaRush Community , כך שהמידע על הפרויקט יהיה מתאים:
  1. מייבן - לא בכדי דיברנו איתך על זה קודם לכן.
  2. ג'אווה היא יקירתנו :D
  3. ניקח את גרסה 2.2.11. למה לא החדש ביותר? כי ככל שהוא חדש יותר, כך גדל הסיכוי שייתכן שיש שם כמה באגים. עבורנו, זה לא משנה איזו גרסה, אבל הישנה יותר תהיה אמינה יותר. לכן, אנו בוחרים ב-2.2.11.
  4. קבוצה: com.github.javarushcommunity
  5. חפץ: springboot-flyway-demo
  6. שם: SpringBoot + Flyway Demo
  7. תיאור: הפרויקט מדגים אינטגרציה בין SpringBoot ו-Flyway . (כן, היכולת לכתוב תיעוד היא חלק חשוב בפיתוח :))
  8. שם החבילה: com.github.javarushcommunity.springbootflywaydemo . כאן הם ייצרו לנו מיד חבילה בסיסית עם מחלקה שתפעיל את האפליקציה שלנו.
  9. אריזה: צנצנת
  10. ג'אווה: 8. בואו לא נקדים את הקטר וניקח את השמונה הישנה והטובה. למה לא 11? בשביל מה? לדוגמה שלנו, אני לא רואה את הנקודה.
"פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 3עכשיו בואו נוסיף את המודולים. אנחנו צריכים למצוא אינטגרציה עם Flyway. אתה יכול גם להוסיף משהו שקשור ל-MySQL ו-Spring Data. בואו נוסיף עוד לומבוק (זה דבר מאוד הכרחי, רק תאמינו לי לעת עתה :D)) כדי לעשות זאת, לחצו על ADD DEPENDENCIES ... ובחרו את כל מה שאתם צריכים: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 4כך מוסיפים את Flyway. "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 5לומבוק... וכן הלאה. כתוצאה מכך, אנחנו מקבלים: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 6הא... מילאנו הכל)) עכשיו לחצו על GENERATE... וזהו - הארכיון עם הפרוייקט שנוצר מוכן :) יש גם דבר כזה מגניב כמו SHARE... , מה שנותן לך קישור לדף שמילאת זה עתה. כלומר, הנה זה שיצרתי . וגם אם משהו משתבש, אתה תמיד יכול לבדוק באמצעות הקישור. לאחר מכן, עלינו לקשר את הפרויקט שנוצר למאגר Git, אז נשכפל את פרויקט springboot-flyway-demo שנוצר ונוריד אותו דרך IDEA. לשם כך, עליך לפתוח את הרעיון ולבחור בקובץ -> חדש -> פרויקט ממקורות קיימים... : "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 7כעת הוסף את כתובת האתר ולחץ על Clone . השלב הבא הוא להעביר את החלקים הפנימיים של הפרויקט שנוצר בתוך זה ששבטנו. מְבוּלבָּל? אני אראה לך עכשיו. פתחתי אותו וקיבלתי את קבוצת הקבצים הבאה: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 8יש להעביר אותם לפרויקט המשובט. כמו במאמר הקודם, בואו נוסיף את pom.xml כפרויקט maven: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 9עכשיו אנחנו מעוניינים להסתכל על מה שנוצר עבורנו. אם תפתח את כל התיקיות ב-src ובהמשך, תראה את ההיררכיה הרגילה בפרויקטים של Maven, עליה דנו במאמר הקודם . למי שלא קרא, קרא! "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 10ניתן לראות שיש לנו מחלקה של Application, ואפליקציית SpringBoot שלנו תושק באמצעותה. הודות לתוסף Maven עבור SpringBoot, יש לנו כעת את המשימה שאנו צריכים עבור Maven, כלומר spring-boot:run. היכן נוכל למצוא מידע זה? בצד ימין, פתיחת צלחת Maven והפרויקט שלנו: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 11תהיה שגיאה, ולא נוכל לקרוא אותה, נראה משהו כזה: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 12כדי לקבל מידע נוסף, עבור מהירות נוכל להפעיל את השיטה הראשית של כיתת Application: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 13ואז נראה את הסיבה האמיתית: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 14כאן כבר יש מידע נוסף ואתה יכול לעשות איתו משהו. מה לא בסדר? יש לנו תלות הקשורות למסד הנתונים, ולכן עלינו לספק הגדרות לחיבור אליו. לשם כך, אנו מחפשים בגוגל ומגלים שעלינו להוסיף את התצורות הבאות ל- 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
אנו מריצים שוב את השיטה הראשית ומקבלים: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 15כעת עלינו להוסיף העברה אחת לפחות. כדי ליצור הגירה נכונה, עליך לקחת את התבנית הבאה: V<VERSION>__<NAME>.sql באמצעות תבנית זו, ניצור קובץ העברה בשם V00001__Create_country_table.sql בתיקייה המתאימה: /src/main/resources/ db.migration/ . בואו ניצור בו טבלת מדינה. בואו ניקח את התסריט מהמאמר השני על מסד הנתונים . "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 16לפני שמתחילים, בואו ניכנס וניצור מסד נתונים לעבודה: flyway_demo_db. בוא נעשה זאת דרך MysqlWorkbench: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 17כעת נוכל להפעיל שוב את השיטה הראשית: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 18הכל הסתדר, אבל מכיוון שעדיין אין לנו שום דבר בפרויקט, הוא סיים לעבוד. עם זאת, ברור מהיומנים ( קרא מה הם יומנים ) ש:
  1. התחברות למסד הנתונים בהצלחה.
  2. ההגירה אומתה והכל בסדר.
  3. Flyway יצרה טבלה לניהול העברות.
  4. ומה שהתחילה הגירה 00001 - יצירת המדינה הצליחה.
כדי לבדוק זאת, תוכלו ללכת ולראות מה נעשה במסד הנתונים. אז בואו נלך לשרת MySQL שלנו ונראה מה קורה עם הטבלאות במסד הנתונים flyway_demo_db: $ USE flyway_demo_db; $SHOW TABLES; "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 19כפי שציפיתי, התרחשה העברה, במהלכה נוצרה טבלת הארץ והופיעה טבלת flyway_schema_history, המאחסנת מידע על העברות. נלך רחוק יותר ונראה אילו רשומות יש (ואם יש בכלל). $SELECT * FROM flyway_schema_history; "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 20הנה ההקלטה, היחידה. הוא מכיל הרבה נתונים מעניינים. גרסה, תיאור ההגירה, איזה סוג של SQL (ואולי גם XML), שם הסקריפט עצמו, checksum ( זה משהו כמו hashcode, שמשמש כדי לבדוק אם ההגירה השתנתה או לא. זה נעשה במקרה שביצענו מיגרציה במסד הנתונים ואז זה תוקן: לא ניתן לעשות זאת, כל השינויים מתבצעים רק באמצעות העברה חדשה וכדי למנוע את זה, כמות הצ'ק עוקבת אחר זה) , שם sql של המשתמש, עיבוד הגירה תאריך, זמן ביצוע ותוצאה (מוצלח או לא מוצלח). הגירה שנכתבה פעם אחת לא צריכה להשתנות בעתיד. גם אם יש בו פגם. כל השינויים מתרחשים רק באמצעות הגירה חדשה. זה מאוד חשוב. כדי להראות מה יקרה, בואו נשנה מעט את הסקריפט שלנו וננסה להפעיל אותו שוב. הבה נוסיף ערך אחד לטבלת המדינה בהעברה שלנו: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 21ונפעיל את השיטה הראשית וזה מה שנקבל: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 22כפי שציפיתי, flyway זיהה שהסקריפט השתנה ולא ביצע את ההגירה. במקרים מסוימים, ייתכן שיהיה צורך להפעיל העברה מעודכנת, וכדי ש-flyway ידלג על זה, עליך למחוק את הערך בטבלת flyway_schema_history ולאחר מכן להפעיל את ההגירה המעודכנת. זו לא התנהגות נורמלית ולא אמורה להיות כך, אבל אתה גם צריך לדעת על שיטה זו לפתרון הבעיה. עסקנו בהגירה הראשונה. עכשיו אני רוצה להוסיף הגירה נוספת, עם נתונים על מדינות, כפי שהיה במאמר על בסיס הנתונים: קובץ V00002__Add_test_data_to_country.sql"פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 23 ובואו נריץ שוב את השיטה הראשית: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 24מהלוגים ברור שלפני תחילת ההגירה, בסיס הנתונים היה בגרסה 00001, אז כל ההגירות לאחר גרסה זו. לאחר מכן, גרסה 00002 הושקה והצליחה. בוא נבדוק, או שאתה כבר מאמין לי ששלושה רשומות בארץ כבר יהיו במאגר?)) הייתי בודק, אז הוכחה: "פרויקט ג'אווה מא' עד ת': SpringBoot + Flyway - 25משהו כזה. אם תפעיל את הפרויקט שוב, flyway פשוט ידלג על הפעלת העברות, מכיוון שמסד הנתונים תואם באופן מלא לגרסה הנדרשת.

סיכום

הפעם למדנו כיצד להבין ולהשתמש בכלי העברת מסד נתונים בשילוב עם SpringBoot. מידע זה נחוץ כדי להבין מהו כלי בקרת גרסאות של מסד נתונים, תוך שימוש ב-Flyway כדוגמה. חברים, קוד המקור של הפרויקט שהראיתי פורסם בארגון שלנו ב-Github . אם אתה אוהב את הדוגמה, תן לה כוכב , ואני אבין שהעבודה שלי מועילה ובאמת שווה להמשיך. באופן מסורתי, אני מציע להירשם לחשבון Github שלי . דרכו אני מנהל את כל עבודתי על קוד פתוח וכל פרויקטי ההדגמה האלה שמלווים תמיד את המאמרים שלי. תודה לכולם על הקריאה. בפעם הבאה נכתוב את הבקשה שלנו. תהיה תיאוריה הכרחית על Docker בעתיד, אבל נדלל אותה מאוד עם תרגול.

קישורים שימושיים

היום אין הרבה קישורים שימושיים. שימו לב לסרטון של Evgeniy, זה ממש שווה את זה!
  1. אתר ליצירת פרויקטים באביב
  2. יבגני בוריסוב - בונה אביב
  3. תיעוד באביב עבור Flyway

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

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