JavaRush /Java blogi /Random-UZ /Biz ilovalarni joylashtirishni amalga oshiramiz - "A dan ...

Biz ilovalarni joylashtirishni amalga oshiramiz - "A dan Zgacha Java loyihasi"

Guruhda nashr etilgan
Hammaga salom. Loyihangizni yozish bo'yicha maqolalar turkumini davom ettiramiz. "A dan Zgacha Java loyihasi": Ilovalarni joylashtirishni amalga oshirish - 1

Filiallarni tartiblang

Muhimi shundaki, filiallarda va ularning ombordagi tartibida yo'qolmaslik uchun men STEP_{number} prefiksini qo'shib, ularni qayta nomlashga qaror qildim . Masalan, bizda asosiydan tashqari uchta filial mavjud:
  • JRTB-0
  • JRTB-2
  • JRTB-3
Qaysi biri keyin ketishi kerakligini darhol tushunolmaysiz. Shunday qilib, men ularni quyidagicha nomlayman:
  • STEP_1_JRTB-0 - birinchi qadam
  • STEP_2_JRTB-2 - ikkinchi bosqich
  • STEP_3_JRTB-3 - uchinchi bosqich
Va shunga o'xshash keyingi maqolalar uchun. Filiallar nomini o'zgartirish uchun ombor sahifasiga o'ting , filiallar oynasini toping , unga amal qiling: “A dan Zgacha Java loyihasi”: Ilovalarni joylashtirishni amalga oshirish - 2Har bir filial ostida, qalam ustiga bosing va filial nomini o'zgartiring: "A dan Zgacha Java loyihasi": Ilovalarni joylashtirishni amalga oshirish - 3Va natijada biz olamiz: "A dan Zgacha Java loyihasi": Ilovalarni joylashtirishni amalga oshirish - 4Aytgancha, mening telegram kanalimga obuna bo'lganlarning barchasi topildi . Men darhol filiallarning nomini o'zgartirdim.

Docker haqida bir oz

Docker nima? Muxtasar qilib aytganda, bu siz ilovalarni tez va xavfsiz tarzda joylashtirishingiz (joylashtirishingiz) va ular uchun faqat ular uchun zarur bo'lgan yopiq infratuzilmani yaratishingiz mumkin bo'lgan vositadir. Hali ham qiyin, tushunaman. Umuman olganda, Dockerni tez va samarali ishlashingiz mumkin bo'lgan rivojlanish platformasi sifatida tushunish mumkin. Dockerni serverda ishlaydigan dastur sifatida tushunish mumkin. Ushbu dastur konteynerlarni ilovalar bilan saqlash imkoniyatiga ega. Konteyner nima? Bu alohida infratuzilma bo'lib, unga barcha kerakli narsalarni qo'shishingiz mumkin. Misol uchun, Java ilovasi uchun dasturni ishga tushirish uchun bizga JRE kerak, konteynerda bu bo'ladi, bizga boshqa dasturiy ta'minot kerak bo'ladi - biz buni qo'shishimiz mumkin. Yoki bizga Linux va Tomcat servlet konteyneri kerak bo'lishi mumkin. Buni ham qilish mumkin. Konteynerlar rasm asosida yaratilgan: ya'ni bu Docker konteynerini yaratish uchun zarur bo'lgan barcha narsalarni o'z ichiga olgan maxsus shablon. Ushbu rasmni qanday yaratish mumkin? Bizning holatda, loyihaning ildizida konteynerda nima bo'lishi kerakligini tavsiflovchi Dockerfile yaratishimiz kerak bo'ladi. Biz bot tokenini hech qayerda ochishni istamaganimiz sababli, dasturni har safar joylashtirmoqchi bo‘lganimizda uni o‘tkazishga murojaat qilishimiz kerak bo‘ladi. Ushbu mavzu haqida ko'proq ma'lumotni bu erda va bu erda o'qishingiz mumkin .

Biz JRTB-13 yozamiz

Biz serverga ilovamiz uchun tez va oson joylashtirish jarayonini sozlashimiz kerak. Ya'ni, 24/7 ishlaydigan mashina uchun. Keling, Dockerni asos qilib olaylik. Ammo bizning ro'yxatimizda ushbu funktsiyani qo'shish uchun javobgar bo'lgan vazifa yo'q. Negadir uni yaratishda men uni sog'indim. Muammo yo'q, biz uni hozir yaratamiz. Biz GitHub-da muammo yaratish yorlig'iga o'tamiz va Xususiyatlar so'rovini tanlaymiz: "A dan Zgacha Java loyihasi": Ilovalarni joylashtirishni amalga oshirish - 5Vazifa tavsifini, uni qabul qilish mezonlarini qo'shing, ushbu muammo qaysi loyihaga tegishli ekanligini belgilang va siz yangi son yaratishingiz mumkin: Endi vazifa bajarilganligini "A dan Zgacha Java loyihasi": Ilovalarni joylashtirishni amalga oshirish - 6ko'rsatish uchun ish uchun qabul qilingan boʻlsa, vazifa holatini “Bajarilmoqda” dan “Bajarilmoqda” dan oʻzgartiring: Bu qiyin maqola boʻladi. Agar sizda biron bir muammo bo'lsa, sharhlarda yozing: Men ularni kuzatib boraman va imkonim boricha javob beraman. Bu kichik mijozlarni qo'llab-quvvatlash xizmati bo'ladi: D"A dan Zgacha Java loyihasi": Ilovalarni joylashtirishni amalga oshirish - 7

Docker faylini yaratish

Docker fayli nima? Docker uchun bu Docker konteyneri uchun tasvirni yaratish bo'yicha skript (bosqichma-bosqich ko'rsatmalar). Ilovamiz ishlashi uchun bizga JDK, 11-versiya kerak. Ya'ni, biz JDK 11 docker tasvirini topishimiz va uni rasmimizga qo'shishimiz kerak. Bu xotiraga qanday bog'liqlikni qo'shishimizga o'xshash narsa. Buning uchun Dockerda DockerHub mavjud . Rasmlarni mahalliy sifatida yuklab olish uchun u erda ro'yxatdan o'tishingiz kerak. Ro'yxatdan o'tgandan so'ng JDK11 ni qidiramiz. Men topgan narsamdan bu konteyner: acceptopenjdk/openjdk11 . Ushbu konteyner tavsifida docker fayli uchun zarur bo'lgan narsalar mavjud:
FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Keling, jar faylini oladigan papkani tuzatamiz. Mvn paketi maven vazifasini bajarganimizdan so'ng, biz uni maqsadli papkada olamiz. Bularning barchasini bajarishdan oldin, yangilangan asosiy filialga asoslanib, biz vazifamiz uchun yangisini yaratamiz: STEP_4_JRTB-13 . Endi siz ishlashingiz mumkin. Loyihaning ildizida Dockerfile kengaytmasisiz fayl yarating va ichiga quyidagilarni qo'shing:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Birinchi qator tasvir nimaga asoslanadi - acceptopenjdk/openjdk11. Ikkinchi qator maqsadli papkada joylashgan JAR_FILE nomli rasmga argument qo'shishdir. Bundan tashqari, joriy papka Dockerfile joylashuvi bilan belgilanadi. Uchinchi qator - loyihamizning bankasini docker tasviriga nusxalash. Oxirgi qatorda terminalda bo'sh joy bilan ajratilgan buyruqdan yaratilgan massiv mavjud. Ya'ni, oxirida quyidagilar bajariladi: "java -jar /app.jar" Bot tokenini sir saqlash uchun konteynerni ishga tushirishda ikkita o'zgaruvchini - bot nomi va uning tokenini o'tkazishimiz kerak bo'ladi. Buning uchun biz o'zgaruvchilar bilan loyihamizni ishga tushirishi kerak bo'lgan so'rov yozamiz. Va buni qanday qilish kerak? Siz Google-ga kirishingiz kerak: bu erda oddiy tavsifga ega birinchi havola . Biz nima qilmoqchimiz? application.properties faylida biz ikkita o'zgaruvchiga egamiz, ularni u erda aniqlaymiz:
  • bot.username
  • bot.token
Men docker konteynerini ishga tushirmoqchiman va hech kim bu qiymatlarni ko'ra olmasligi uchun har safar o'z qiymatimni u erga o'tkazmoqchiman. Men SpringBoot-da jar loyihasi ishga tushirilganda o'rnatiladigan muhit o'zgaruvchilari application.properties faylidagilardan ustun bo'lishini bilaman. O'zgaruvchini so'rovga yuborish uchun quyidagi konstruktsiyani qo'shishingiz kerak: -D{variable name}=”{variable value}” . Biz jingalak qavslar qo'shmaymiz;) Biz ilovamizni oldindan belgilangan qiymatlar bilan ishga tushiradigan so'rovni olamiz - botning nomi va tokeni: java -jar -Dbot.username=”test.javarush.community_bot” -Dbot. token=”dfgkdjfglkdjfglkdjfgk” *.jar Endi biz ushbu o'zgaruvchilarni docker konteyneriga o'tkazishimiz kerak. Bu atrof-muhit o'zgaruvchisi. Kelajakda ma'lumotlar bazasi muammosiz va ilovamiz bilan muammosiz ishlashini ta'minlash uchun biz docker-compose dan foydalanamiz. Bu konteynerlar orasidagi ishlarni, ishga tushirishni va bog'liqliklarni tashkil qilishingiz mumkin bo'lgan alohida vositadir. Boshqacha qilib aytganda, bu bitta infratuzilmaning konteynerlarini boshqarish uchun Docker-ning yuqori qismidagi qo'shimcha. Bundan tashqari, docker-compose-ni ishga tushirishdan oldin, biz serverdan barcha kod o'zgarishlarini olib tashlaganimizga, dasturni yaratganimizga va eski versiyani to'xtatganimizga ishonch hosil qilishimiz kerak. Buning uchun biz bash skriptidan foydalanamiz. Voy... Hammasi qiyin tuyuladi, roziman. Ammo ilovalarni joylashtirishni sozlash bilan ishlash har doim zerikarli va murakkab jarayondir. Shunday qilib, bizda juda yaxshi sxema mavjud:
  1. Keling, bash skriptini ishga tushiramiz.
  2. Bash skripti docker-compose ishlaydi.
  3. Docker-compose ilovamiz bilan docker konteynerini ishga tushiradi.
  4. Docker konteyneri bizning dasturimizni ishga tushiradi.
Va endi biz ikkita o'zgaruvchining - bot nomi va uning tokeni - 1-banddan 4-bandga o'tishiga ishonch hosil qilishimiz kerak. Va bu ikki o'zgaruvchidan java ilovamizni ishga tushirishda foydalanilishi uchun. Keling, boshidan oxirigacha boraylik. Jarnikni boshlash uchun qanday buyruq bajarilishi kerakligini allaqachon bilamiz. Shuning uchun biz Dockerfile-ni ikkita o'zgaruvchini qabul qilishni va ularni so'rovga o'tkazishni o'rganadigan tarzda sozlaymiz. Buning uchun Dockerfile faylini quyidagi shaklga qisqartiramiz:
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"]
Siz ikkita qator qo'shganimizni va ENTRYPOINTni yangilaganimizni ko'rishingiz mumkin. Chiziqlar:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
kodlovchi fayl ichida o'zgaruvchilarni e'lon qilish. Odatiy bo'lib, ular belgilangan qiymatga ega. Agar ushbu docker-fayldan rasm yaratishda bunday nomli muhit o'zgaruvchilari uzatilsa, qiymatlar boshqacha bo'ladi. ENTRYPOINT-da biz ushbu muhit o'zgaruvchilarini o'qiy oladigan yana bir nechta elementlarni qo'shdik:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Bu erda siz ${} konstruktsiyasidan foydalangan holda qator ichida BOT_NAME va BOT_TOKEN qiymatlari o'tkazilishini ko'rishingiz mumkin. Keyinchalik, biz ushbu o'zgaruvchilarni docker-compose-ga qanday qabul qilishni va uzatishni o'rgatishimiz kerak.

docker-compose.yml faylini yarating

YAML formati haqida alohida o'qib chiqsangiz yaxshi bo'lardi, aks holda maqola allaqachon sakrab o'sib bormoqda. Biz uchun bu .properties tipidagi o'zgaruvchilarning yana bir tavsifi. Faqat xossalarda u nuqta orqali yoziladi, lekin YAMLda bu biroz chiroyliroq bajariladi. Masalan, bu kabi. .propertiesda ikkita o'zgaruvchi: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Lekin .yaml da (.yml bilan bir xil) u shunday bo'ladi:
javarush:
	telegram:
		bot:
		  name: ivan
		  token: pupkin
Ikkinchi variant yanada chiroyli va tushunarli. Bo'shliqlar yuqorida ko'rsatilgandek bo'lishi kerak. Keling, qandaydir tarzda application.properties va application.yml ni tarjima qilaylik. Avval siz uni yaratishingiz kerak. Loyihaning ildizida docker-compose.yml faylini yarating va u erga quyidagilarni yozing:
version: '3.1'

services:
 jrtb:
   build:
     context: .
   environment:
     - BOT_NAME=${BOT_NAME}
     - BOT_TOKEN=${BOT_TOKEN}
   restart: always
Birinchi qator docker-compose versiyasidir. xizmatlar: bundan keyingi barcha qatorlar (o'zgartiriladi) biz sozlayotgan xizmatlarga tegishli ekanligini aytadi. Hozircha bizda ulardan faqat bittasi bor - jrtb deb nomlangan java ilovasi . Va allaqachon uning ostida uning barcha sozlamalari bo'ladi. Masalan, qurilish: kontekst: . Biz Dockerfile faylini docker-compose.yml bilan bir xil katalogdan qidiramiz, deydi. Ammo atrof-muhit: bo'limi zarur muhit o'zgaruvchilarini Dockerfile-ga o'tkazishimizni ta'minlash uchun javobgar bo'ladi. Faqat bizga kerak bo'lgan narsa. Shuning uchun biz o'zgaruvchilarni quyida o'tkazamiz. Docker-compose ularni server operatsion muhiti o'zgaruvchilarida qidiradi. Keling, ularni bash skriptiga qo'shamiz.

Bash skriptlarini yaratish

Oxirgi qadam - bash skriptini yaratish. Loyihaning ildizida start.sh nomli fayl yarating va u yerga quyidagilarni yozing:
#!/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
Birinchi qator barcha bash skriptlari uchun kerak: usiz ishlamaydi. Va keyin - faqat terminalda bajarilishi kerak bo'lgan buyruqlar to'plami. Men har bir buyruqda sharhlar qo'shdim, shuning uchun u aniq bo'lishi kerak. Men tushuntirmoqchi bo'lgan yagona narsa - $1 va $2 nimani anglatadi. Bu bash skripti ishga tushirilganda uzatiladigan ikkita o'zgaruvchidir. Eksport buyrug'i yordamida ular server o'zgaruvchilariga qo'shiladi va docker-compose-da o'qiladi. Bu Ubuntu uchun ishlaydi, ehtimol Windows uchun emas, lekin ishonchim komil emas. Endi siz stop.sh skriptini qo'shishingiz kerak, bu esa ishni to'xtatadi. U bir nechta qatorlarni o'z ichiga oladi:
#!/bin/bash

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

# Ensure, that the old application won't be deployed again.
mvn clean
Bu erda biz docker-compose-ni to'xtatamiz va oxirgi qurilishdan beri yotgan jarnik loyihasini tozalaymiz. Biz buni loyihamiz to'g'ri qayta qurilganligini ta'minlash uchun qilamiz. Pretsedentlar bor edi, shuning uchun men qo'shyapman) Natijada, biz 4 ta yangi faylga ega bo'lamiz:
  • Dockerfile - ilovamiz tasvirini yaratish uchun fayl;
  • docker-compose.yml - konteynerlarimizni ishga tushirish sozlamalari bo'lgan fayl;
  • start.sh - ilovamizni joylashtirish uchun bash skripti;
  • stop.sh - bu bizning dasturimizni to'xtatish uchun bash skripti.
Shuningdek, ilovamiz versiyasini 0.2.0-SNAPSHOT dan 0.3.0-SNAPSHOT ga yangilaymiz. Keling, RELEASE_NOTES ga yangi versiya tavsifini qo'shamiz va u erda nima borligini biroz o'zgartiramiz:
# Relizlar uchun eslatmalar ## 0.3.0-SNAPSHOT * JRTB-13: loyihaga qo'shilgan joylashtirish jarayoni ## 0.2.0-SNAPSHOT * JRTB-3: Telegram Bot buyruqlarini boshqarish uchun amalga oshirilgan buyruq namunasi ## 0.1.0-SNAPSHOT * JRTB -2: qo'shilgan stub telegram bot * JRTB-0: qo'shilgan SpringBoot skelet loyihasi
Va README-da biz ilovamizni qanday joylashtirishni tavsiflovchi yangi paragraf qo'shamiz:
## Joylashtirish Joylashtirish jarayoni iloji boricha oson: Kerakli dasturiy ta'minot: - bash skriptlarini ishga tushirish uchun terminal - docker - ilovani joylashtirish uchun docker-compose, kerakli bo'limga o'ting va bash skriptini ishga tushiring: $ bash start.sh ${bot_username} ${bot_token } Ana xolos.
Albatta, hamma narsa ingliz tilida yozilgan. Odatdagidek, bizning yangi yaratilgan STEP_4_JRTB-13 filialimizda biz JRTB-13 nomli yangi majburiyat yaratamiz: joylashtirish jarayonini docker orqali amalga oshiring va uni suring. Men oldingi maqolalarda aytib o'tgan narsalar haqida batafsil to'xtashni to'xtataman. Xuddi shu narsani takrorlashdan ma’no ko‘rmayapman. Qolaversa, buni o'ylab topib, o'zi qilganlarga hech qanday savol tug'ilmaydi. Bu men yangi filialni qanday yaratish, qanday qilib majburiyat yaratish, qanday qilib majburiyatni omborga surish haqida gapiryapman.

Pastki chiziq

Bugun men diqqat bilan ko'rib chiqilishi va qo'shimcha o'qish bilan kengaytirilishi kerak bo'lgan ko'plab yangi ma'lumotlarni ko'rsatdim. Eng muhimi: ONE (!!!) buyrug'i yordamida ilovamizni joylashtirish uchun zarur bo'lgan hamma narsa amalga oshiriladi. Bu shunchalik ajoyibki, men sizga aytolmayman. Ha, o'zgaruvchilarni qanday qilib to'g'ri yo'naltirishni tushunish uchun Docker hujjatlarida munosib vaqt sarflashim kerak edi. Bundan buyon telegram boti doimo asosiy filialning eng so‘nggi versiyasida ishlaydi. Telegram botga havola. Bugun o'qish uchun yaxshi bo'lgan materiallarga havolalar bo'lmaydi: javobgarlik sizning zimmangizda. Siz ma'lumot qidirishni o'rganishingiz kerak. Telegram kanalimga obuna bo'lgan har bir kishi deyarli darhol botni joylashtirish haqida bilib oldi. Do'stlar, sizga loyiha yoqdimi? Unga yulduz bering ! Shunday qilib, u yanada mashhur bo'ladi va ko'proq odamlar bu haqda o'rganishlari va undan o'rganishlari mumkin bo'ladi. Odatdagidek, men GitHub-da ro'yxatdan o'tishni va ushbu seriyani va u erda ishlayotgan boshqa loyihalarimni kuzatish uchun hisobimni kuzatishni taklif qilaman. Endi biz ma'lumotlar bazasini ulashga tayyormiz. Keyingi maqola uzunroq bo'ladi va unda biz ma'lumotlar bazasi bilan ishlash uchun zarur bo'lgan hamma narsani qilamiz. Barcha tavsiflar JRTB-1 da .

Seriyadagi barcha materiallar ro'yxati ushbu maqolaning boshida.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION