JavaRush /בלוג Java /Random-HE /אנו מיישמים פריסת אפליקציות - "פרויקט ג'אווה מא' עד ת'"
Roman Beekeeper
רָמָה

אנו מיישמים פריסת אפליקציות - "פרויקט ג'אווה מא' עד ת'"

פורסם בקבוצה
שלום לכולם. אנו ממשיכים את סדרת המאמרים על כתיבת הפרויקט שלך. "פרויקט ג'אווה מא' עד ת': יישום פריסת יישומים - 1

מיין את הענפים

מהחשיבות, כדי לא ללכת לאיבוד בסניפים ובסדר שלהם במאגר, החלטתי לשנות את שמם על ידי הוספת הקידומת STEP_{number} . לדוגמה, יש לנו שלושה סניפים בנוסף לסניף הראשי:
  • JRTB-0
  • JRTB-2
  • JRTB-3
לא תבינו מיד איזה מהם צריך ללכת אחריו. אז אני אשנה את שמם באופן הבא:
  • STEP_1_JRTB-0 - שלב ראשון
  • STEP_2_JRTB-2 - שלב שני
  • STEP_3_JRTB-3 - שלב שלישי
וכן הלאה למאמרים הבאים. לשינוי שמות סניפים כנסו לעמוד המאגר , מצאו את תיבת הסניפים , עקבו אחריה: "פרויקט ג'אווה מא' עד ת': הטמעת פריסת יישומים - 2מתחת לכל סניף לחצו על העיפרון ושנו את שם הסניף: "פרויקט ג'אווה מא' עד ת': הטמעת פריסת יישומים - 3וכתוצאה מכך נקבל: "פרויקט ג'אווה מא' עד ת': הטמעת פריסת יישומים - 4אגב, כל מי שנרשם לערוץ הטלגרם שלי מצא מיד שיניתי את שמות הסניפים.

קצת על דוקר

מה זה דוקר? בקיצור, מדובר בכלי שבעזרתו ניתן לפרוס (פרוס) אפליקציות במהירות ובבטחה, וליצור עבורם תשתית סגורה הנחוצה רק עבורם. זה עדיין קשה, אני מבין. באופן כללי, ניתן להבין את Docker כפלטפורמת פיתוח שבה אתה יכול לעבוד במהירות וביעילות. ניתן להבין את Docker כתוכנית הפועלת על שרת. לתוכנית זו יש את היכולת לאחסן מכולות עם יישומים. מה זה מיכל? זוהי תשתית נפרדת אליה אתה יכול להוסיף את כל מה שאתה צריך. לדוגמא, עבור אפליקציית Java אנחנו צריכים JRE כדי להריץ את האפליקציה, לקונטיינר יהיה את זה, נצטרך תוכנה אחרת - אנחנו יכולים להוסיף את זה. או אולי אנחנו צריכים לינוקס ומיכל servlet של Tomcat. ניתן לעשות זאת גם. קונטיינרים נוצרים על סמך תמונה: כלומר, זוהי תבנית ספציפית המכילה את כל הדרוש ליצירת קונטיינר Docker. איך יוצרים את התמונה הזו? במקרה שלנו, נצטרך ליצור Dockerfile בשורש הפרוייקט המתאר מה צריך להיות בקונטיינר. מכיוון שאנו לא רוצים לחשוף את האסימון של הבוט בשום מקום, נצטרך לפנות אותו בכל פעם שנרצה לפרוס את האפליקציה. תוכלו לקרוא עוד על נושא זה כאן וכאן .

אנו כותבים JRTB-13

עלינו להגדיר תהליך פריסה מהיר וקל עבור האפליקציה שלנו לשרת. כלומר, למכונה שעובדת 24/7. בואו ניקח את דוקר כבסיס. אבל אין משימה ברשימה שלנו שתהיה אחראית להוספת פונקציונליות זו. איכשהו התגעגעתי אליו כשיצרתי אותו. אין בעיה, אנחנו ניצור את זה עכשיו. עבור ללשונית יצירת הבעיה ב-GitHub ובחר באפשרות בקשת פיצ'ר: "פרויקט ג'אווה מא' עד ת': הטמעת פריסת יישומים - 5הוסף תיאור של המשימה, קריטריונים לקבלתה, הגדר לאיזה פרויקט נושא זה שייך ותוכל ליצור בעיה חדשה: "פרויקט ג'אווה מא' עד ת': הטמעת פריסת יישומים - 6כעת, כדי להראות שהמשימה התקבלה לעבודה, שנה את סטטוס המשימה מ-To do on Progress: "פרויקט ג'אווה מא' עד ת': הטמעת פריסת יישומים - 7זה הולך להיות מאמר קשה. אם יש לכם בעיות כתבו בתגובות: אני אעקוב ואענה כמיטב יכולתי. זו תהיה תמיכת לקוחות קטנה :D

יצירת Dockerfile

מהו dockerfile? עבור Docker, זהו סקריפט (הוראות שלב אחר שלב) כיצד ליצור תמונה עבור קונטיינר Docker. כדי שהאפליקציה שלנו תעבוד, אנחנו צריכים את ה-JDK, גרסה 11. כלומר, עלינו למצוא את תמונת ה-JDK 11 docker ולהוסיף אותה לתמונה שלנו. זה משהו שדומה לאופן שבו אנו מוסיפים תלות לזיכרון. ל- Docker יש DockerHub למטרה זו . כדי להוריד תמונות מקומית, עליך להירשם שם. לאחר ההרשמה, בוא נלך לחפש JDK11. ממה שמצאתי, זה המיכל: adoptopenjdk/openjdk11 . בתיאור של מיכל זה יש את מה שנדרש עבור קובץ docker:
FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
בואו נתקן את התיקיה ממנה אנחנו לוקחים את קובץ ה-jar. יש לנו את זה בתיקיית היעד לאחר שהרצנו את משימת mvn package maven. לפני שנעשה את כל זה, בהתבסס על הסניף הראשי המעודכן, אנו יוצרים אחד חדש למשימה שלנו: STEP_4_JRTB-13 . עכשיו אתה יכול לעבוד. בשורש הפרויקט, צור קובץ ללא סיומת Dockerfile והוסף בתוכו את הדברים הבאים:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
השורה הראשונה היא על מה תתבסס התמונה - adoptopenjdk/openjdk11. השורה השנייה היא להוסיף ארגומנט לתמונה בשם JAR_FILE, שנמצאת בתיקיית היעד. יתר על כן, התיקיה הנוכחית נקבעת על פי המיקום של ה- Dockerfile. שורה שלישית - העתק את הצנצנת של הפרויקט שלנו לתמונת הדוקר. השורה האחרונה מכילה בעצם מערך שנוצר מהפקודה בטרמינל, שהופרד על ידי רווח. כלומר, בסופו של דבר יתבצעו הפעולות הבאות: "java -jar /app.jar" כדי לשמור על אסימון הבוט בסוד, בעת הפעלת הקונטיינר נצטרך להעביר שני משתנים - שם הבוט והטוקן שלו. לשם כך, נכתוב שאילתה שאמורה להפעיל את הפרויקט שלנו עם משתנים. ואיך עושים את זה? אתה צריך לחפש בגוגל: הנה הקישור הראשון עם תיאור רגיל. מה אנחנו רוצים לעשות? יש לנו שני משתנים בקובץ application.properties שאנו מגדירים שם:
  • bot.username
  • bot.token
אני רוצה להפעיל קונטיינר docker ולהעביר את הערך שלי לשם בכל פעם כדי שאף אחד לא יוכל לראות את הערכים האלה. אני יודע שב-SpringBoot, משתני סביבה שנקבעים בעת השקת פרויקט ה-jar יקבלו עדיפות על פני אלה בקובץ application.properties. כדי להעביר משתנה בבקשה, עליך להוסיף את המבנה הבא: -D{שם משתנה}=”{ערך משתנה}” . אנחנו לא מוסיפים פלטה מתולתלת ;) נקבל בקשה שתפעיל את האפליקציה שלנו עם ערכים מוגדרים מראש - השם והאסימון של הבוט: java -jar -Dbot.username=”test.javarush.community_bot” -Dbot. token=”dfgkdjfglkdjfglkdjfgk” *.jar כעת עלינו להעביר את המשתנים הללו בתוך הקונטיינר של docker. זהו משתנה סביבה. כדי להבטיח שבעתיד מסד הנתונים שלנו יעבוד בצורה חלקה וללא בעיות עם האפליקציה שלנו, נשתמש ב-docer-compose. זהו כלי נפרד שבו אתה יכול לארגן עבודה, הפעלה ותלות בין קונטיינרים. במילים אחרות, זהו תוסף על גבי Docker לניהול קונטיינרים של תשתית אחת. בנוסף, לפני הפעלת docker-compose, עלינו להיות בטוחים שלפנו את כל שינויי הקוד מהשרת, בנינו את האפליקציה ועצרנו את הגרסה הישנה. לשם כך נשתמש בסקריפט bash. וואו... הכל נשמע קשה, אני מסכים. אבל העבודה עם הגדרת פריסת יישומים היא תמיד תהליך מייגע ומורכב. לכן, יש לנו תוכנית די טובה:
  1. בוא נריץ את תסריט ה-bash.
  2. סקריפט ה-bash מפעיל docker-compose.
  3. Docker-compose משיק קונטיינר docker עם האפליקציה שלנו.
  4. הקונטיינר של Docker מריץ את האפליקציה שלנו.
ועכשיו אנחנו צריכים לוודא ששני משתנים - שם הבוט והאסימון שלו - עוברים מנקודה 1 לנקודה 4. וכדי ששני המשתנים הללו ישמשו בעת השקת אפליקציית ה-Java שלנו. בואו נלך מהסוף להתחלה. אנחנו כבר יודעים איזו פקודה צריך להתבצע כדי להפעיל את ה-jarnik. לכן, נגדיר את ה- Dockerfile כך שילמד לקבל שני משתנים ולהעביר אותם לבקשה. לשם כך, בואו נצמצם את ה- Dockerfile לטופס הבא:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
ניתן לראות שהוספנו שתי שורות ועדכנו את ENTRYPOINT. שורות:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
להכריז על משתנים בתוך קובץ המקודד. כברירת מחדל יש להם ערך שצוין. אם, בעת יצירת תמונה מ-docerfile זה, משתני סביבה עם שמות כאלה מועברים, הערכים יהיו שונים. וב-ENTRYPOINT הוספנו עוד כמה אלמנטים שיקראו את משתני הסביבה האלה:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
כאן אתה יכול לראות שבתוך השורה, באמצעות המבנה ${}, הערכים של BOT_NAME ו-BOT_TOKEN יעברו. לאחר מכן, עלינו ללמד כיצד לקבל ולהעביר את המשתנים הללו ל-docker-compose.

צור docker-compose.yml

כדאי שתקראו בנפרד על פורמט YAML, אחרת הכתבה כבר צומחת בצעדי ענק. עבורנו, זה רק עוד תיאור של משתנים מסוג .properties. רק בנכסים זה כתוב דרך נקודה, אבל ב-YAML זה נעשה קצת יותר יפה. למשל, ככה. שני משתנים ב-.properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin אבל ב-.yaml (זהה ל-.yml) זה יהיה כך:
javarush:
	telegram:
		bot:
		  name: ivan
		  token: pupkin
האפשרות השנייה יפה ומובנת יותר. הרווחים צריכים להיות בדיוק כפי שצוין למעלה. בואו נתרגם איכשהו את application.properties ואת application.yml שלנו. ראשית עליך ליצור אותו. בשורש הפרויקט, צור קובץ docker-compose.yml וכתוב שם את הדברים הבאים:
version: '3.1'

services:
 jrtb:
   build:
     context: .
   environment:
     - BOT_NAME=${BOT_NAME}
     - BOT_TOKEN=${BOT_TOKEN}
   restart: always
השורה הראשונה היא גרסת docker-compose. services: אומר שכל השורות הבאות לאחר מכן (יוזזו) מתייחסות לשירותים שאנו מגדירים. יש לנו רק אחד כזה עד כה - יישום Java בשם jrtb . וכבר מתחתיו יהיו כל ההגדרות שלו. לדוגמה, build: context: . אומר שנחפש את ה- Dockerfile באותה ספרייה כמו docker-compose.yml. אבל מדור הסביבה: יהיה אחראי להבטיח שנעביר את משתני הסביבה הדרושים ל- Dockerfile. בדיוק מה שאנחנו צריכים. לכן, אנו מעבירים משתנים להלן. Docker-compose יחפש אותם במשתני סביבת ההפעלה של השרת. בואו נוסיף אותם לתסריט ה-bash.

יצירת תסריטי bash

השלב האחרון הוא יצירת סקריפט bash. צור קובץ בשם start.sh בשורש הפרוייקט וכתוב שם את הדברים הבאים:
#!/bin/bash

# Pull new changes
git pull

# Prepare Jar
mvn clean
mvn package

# Ensure, that docker-compose stopped
docker-compose stop

# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2

# Start new deployment
docker-compose up --build -d
השורה הראשונה נחוצה עבור כל תסריטי הבש: זה לא יעבוד בלעדיה. ואז - רק קבוצה של פקודות בטרמינל שצריך לבצע. הוספתי הערות בכל פקודה כדי שזה יהיה ברור. הדבר היחיד שאני רוצה להסביר הוא מה המשמעות של $1 ו-$2. אלו שני משתנים שיעברו עם השקת סקריפט ה-bash. באמצעות פקודת הייצוא, הם יתווספו למשתני שרת ויקראו ב-docker-compose. זה עובד עבור אובונטו, כנראה לא עבור Windows, אבל אני לא בטוח. כעת עליך להוסיף את הסקריפט stop.sh, שיעצור את העבודה. הוא יכיל מספר שורות:
#!/bin/bash

# Ensure, that docker-compose stopped
docker-compose stop

# Ensure, that the old application won't be deployed again.
mvn clean
כאן אנחנו עוצרים את docker-compose ומנקים את הפרויקט jarnik, ששוכב שם מאז הבנייה האחרונה. אנו עושים זאת כדי להבטיח שהפרויקט שלנו נבנה מחדש בצורה מדויקת. היו תקדימים, בגלל זה אני מוסיף) כתוצאה מכך, אנחנו מקבלים 4 קבצים חדשים:
  • Dockerfile - קובץ ליצירת תמונה של האפליקציה שלנו;
  • docker-compose.yml - קובץ עם הגדרות כיצד נשיק את הקונטיינרים שלנו;
  • start.sh - סקריפט bash לפריסת האפליקציה שלנו;
  • stop.sh הוא סקריפט bash כדי לעצור את היישום שלנו.
אנו גם נעדכן את גרסת האפליקציה שלנו מ-0.2.0-SNAPSHOT ל-0.3.0-SNAPSHOT. בואו נוסיף תיאור של הגרסה החדשה ל-RELEASE_NOTES ונשנה מעט את מה שהיה שם:
# הערות שחרור ## 0.3.0-SNAPSHOT * JRTB-13: תהליך פריסה נוסף לפרויקט ## 0.2.0-SNAPSHOT * JRTB-3: דפוס פקודה מיושם לטיפול בפקודות Telegram Bot ## 0.1.0-SNAPSHOT * JRTB -2: בוט טלגרם בדל נוסף * JRTB-0: פרויקט שלד SpringBoot נוסף
וב-README נוסיף פסקה חדשה המתארת ​​כיצד לפרוס את האפליקציה שלנו:
## פריסה תהליך פריסה קל ככל האפשר: תוכנה נדרשת: - מסוף להרצת סקריפטים של bash - docker - docker-compose לפריסת אפליקציה, עבור לסניף הדרוש והפעל את סקריפט bash: $ bash start.sh ${bot_username} ${bot_token } זה הכל.
כמובן שהכל כתוב באנגלית. כרגיל, בסניף החדש שלנו STEP_4_JRTB-13 אנו יוצרים commit חדש בשם: JRTB-13: יישם תהליך פריסה באמצעות docker ודחף אותו. אני מפסיק להתעכב בפירוט על דברים שכבר תיארתי במאמרים קודמים. אני לא רואה טעם לחזור על אותו דבר. חוץ מזה, למי שהבין ועשה זאת בעצמו לא יהיו שאלות. זה אני מדבר על איך ליצור סניף חדש, איך ליצור commit, איך לדחוף commit למאגר.

שורה תחתונה

היום הראיתי המון מידע חדש שצריך לשקול היטב ולהרחיב אותו בקריאה נוספת. הדבר החשוב ביותר: בעזרת פקודה ONE (!!!), יתבצע כל הדרוש לפריסת האפליקציה שלנו. זה כל כך מגניב שאני אפילו לא יכול להגיד לך. כן, הייתי צריך לבלות זמן הגון בתיעוד של Docker כדי להבין איך להעביר משתנים בצורה נכונה. מעתה והלאה, בוט הטלגרם תמיד יעבוד על הגרסה העדכנית ביותר של הסניף הראשי . קישור לבוט טלגרם. היום לא יהיו קישורים לחומרים שיהיה טוב לקרוא: האחריות מוטלת עליך. אתה צריך ללמוד לחפש מידע. כל מי שנרשם לערוץ הטלגרם שלי למד על פריסת הבוט כמעט מיד. חברים, האם אתם אוהבים את הפרויקט? תן לו כוכב ! כך הוא יהפוך לפופולרי יותר ויותר אנשים יוכלו ללמוד עליו וללמוד ממנו. כרגיל, אני מציע להירשם ב-GitHub ולעקוב אחר החשבון שלי כדי לעקוב אחר הסדרה הזו ואחר הפרויקטים שלי שאני עובד עליהם שם. כעת אנו מוכנים לחבר את מסד הנתונים. המאמר הבא יהיה ארוך יותר ובו נעשה כל מה שצריך כדי לעבוד עם בסיס הנתונים. כל התיאורים נמצאים ב- JRTB-1 .

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

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