JavaRush /Java Blogu /Random-AZ /Tətbiq yerləşdirməsini həyata keçiririk - "A-dan Z-yə Jav...
Roman Beekeeper
Səviyyə

Tətbiq yerləşdirməsini həyata keçiririk - "A-dan Z-yə Java layihəsi"

Qrupda dərc edilmişdir
Hamıya salam. Layihənizi yazmaq üçün silsilə məqalələri davam etdiririk. “A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 1

Filialları sıralayın

Əhəmiyyətli olandan, filiallarda və onların repozitoriyadakı sıralarında itməmək üçün STEP_{nömrə} prefiksini əlavə edərək onların adını dəyişməyə qərar verdim . Məsələn, əsas filialdan əlavə üç filialımız var:
  • JRTB-0
  • JRTB-2
  • JRTB-3
Hansının hansının ardınca getməli olduğunu dərhal başa düşməyəcəksiniz. Beləliklə, mən onların adını aşağıdakı kimi dəyişdirəcəyəm:
  • STEP_1_JRTB-0 - ilk addım
  • STEP_2_JRTB-2 - ikinci addım
  • STEP_3_JRTB-3 - üçüncü addım
Və s. növbəti məqalələr üçün. Filialların adını dəyişmək üçün repository səhifəsinə keçin , filiallar qutusunu tapın , ona əməl edin: “A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 2Hər filialın altında karandaşın üzərinə klikləyin və filialın adını dəyişin: “A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 3Və nəticədə əldə edirik: “A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 4Yeri gəlmişkən, telegram kanalıma abunə olan hər kəs tapdı . Mən dərhal filialların adını dəyişdim.

Docker haqqında bir az

Docker nədir? Bir sözlə, bu, tətbiqləri tez və təhlükəsiz şəkildə yerləşdirə (yerləşdirə) və onlar üçün yalnız onlar üçün zəruri olan qapalı infrastruktur yarada biləcəyiniz bir vasitədir. Hələ çətindir, başa düşürəm. Ümumiyyətlə, Docker-i tez və səmərəli işləyə biləcəyiniz bir inkişaf platforması kimi başa düşmək olar. Docker bir serverdə işləyən bir proqram kimi başa düşülə bilər. Bu proqram proqramlarla konteynerləri saxlamaq imkanına malikdir. Konteyner nədir? Bu, sizə lazım olan hər şeyi əlavə edə biləcəyiniz ayrı bir infrastrukturdur. Məsələn, Java proqramı üçün proqramı işə salmaq üçün JRE lazımdır, konteynerdə bu olacaq, bizə başqa proqramlar lazım olacaq - bunu əlavə edə bilərik. Və ya bəlkə bizə Linux və Tomcat servlet konteynerinə ehtiyacımız var. Bu da edilə bilər. Konteynerlər bir şəkil əsasında yaradılır: yəni bu, Docker konteyneri yaratmaq üçün lazım olan hər şeyi ehtiva edən xüsusi bir şablondur. Bu obrazı necə yaratmaq olar? Bizim vəziyyətimizdə, layihənin kökündə konteynerdə nələrin olması lazım olduğunu təsvir edən Dockerfile yaratmalıyıq. Biz botun işarəsini heç bir yerdə ifşa etmək istəmədiyimiz üçün proqramı hər dəfə yerləşdirmək istədikdə onu ötürməyə müraciət etməli olacağıq. Bu mövzu haqqında buradaburada oxuya bilərsiniz .

JRTB-13 yazırıq

Tətbiqimiz üçün serverə sürətli və asan yerləşdirmə prosesini qurmalıyıq. Yəni 24/7 işləyən maşın üçün. Docker-i əsas götürək. Ancaq siyahımızda bu funksiyanı əlavə etmək üçün cavabdeh olan heç bir vəzifə yoxdur. Onu yaradanda nədənsə darıxmışdım. Problem yoxdur, biz onu indi yaradacağıq. GitHub-da məsələnin yaradılması sekmesine keçin və Xüsusiyyət Sorğunu seçin: “A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 5Tapşırığın təsvirini, onun qəbulu üçün meyarları əlavə edin, bu məsələnin hansı layihəyə aid olduğunu təyin edin və yeni buraxılış yarada bilərsiniz: İndi tapşırığın qəbul edildiyini “A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 6göstərmək üçün iş üçün tapşırığın statusunu "Davam etmək üzrə"dən dəyişdirin: Bu çətin məqalə olacaq. Hər hansı bir probleminiz varsa, şərhlərdə yazın: Mən bacardığım qədər onlara nəzarət edib cavablandıracağam. Bu kiçik bir Müştəri Dəstəyi olacaq :D“A-dan Z-yə Java layihəsi”: Tətbiqlərin yerləşdirilməsinin həyata keçirilməsi - 7

Dockerfile yaradılması

Docker faylı nədir? Docker üçün bu, Docker konteyneri üçün təsvirin necə yaradılmasına dair skriptdir (addım-addım təlimat). Tətbiqimizin işləməsi üçün bizə JDK, 11-ci versiya lazımdır. Yəni JDK 11 docker şəklini tapıb şəklimizə əlavə etməliyik. Bu, yaddaşa asılılıq əlavə etməyimizə bənzəyir. Bu məqsədlə Docker-də DockerHub var . Şəkilləri yerli olaraq yükləmək üçün orada qeydiyyatdan keçməlisiniz. Qeydiyyatdan keçdikdən sonra gəlin JDK11-i axtaraq. Tapdıqlarımdan bu konteynerdir: acceptopenjdk/openjdk11 . Bu konteynerin təsvirində docker faylı üçün lazım olanlar var:
FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Jar faylını götürdüyümüz qovluğu düzəldək. Mvn paketi maven tapşırığını yerinə yetirdikdən sonra onu hədəf qovluğunda saxlayırıq. Bütün bunları etməzdən əvvəl, yenilənmiş əsas filiala əsaslanaraq, vəzifəmiz üçün yenisini yaradırıq: STEP_4_JRTB-13 . İndi işləyə bilərsiniz. Layihənin kök hissəsində Dockerfile uzantısı olmayan bir fayl yaradın və içərisinə aşağıdakıları əlavə edin:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Birinci sətir təsvirin nəyə əsaslanacağıdır - acceptopenjdk/openjdk11. İkinci sətir hədəf qovluqda yerləşən JAR_FILE adlı şəkilə arqument əlavə etməkdir. Bundan əlavə, cari qovluq Dockerfile-nin yeri ilə müəyyən edilir. Üçüncü sətir - layihəmizin bankasını docker şəklinə köçürün. Sonuncu sətir, mahiyyətcə, boşluqla ayrılmış terminalda əmrdən yaradılmış massivdən ibarətdir. Yəni, sonda aşağıdakılar yerinə yetiriləcək: “java -jar /app.jar” Bot nişanını məxfi saxlamaq üçün konteyneri işə salarkən iki dəyişəni – botun adı və onun işarəsini ötürməli olacağıq. Bunun üçün layihəmizi dəyişənlərlə işə salmalı olan sorğu yazacağıq. Və bunu necə etmək olar? Google-a müraciət etməlisiniz: burada normal təsviri olan ilk keçid var. biz nə etmək istəyirik? application.properties faylında orada müəyyən etdiyimiz iki dəyişən var:
  • bot.username
  • bot.token
Mən docker konteynerini işlətmək və hər dəfə dəyərimi ora ötürmək istəyirəm ki, heç kim bu dəyərləri görməsin. Bilirəm ki, SpringBoot-da jar layihəsi işə salındıqda təyin olunan mühit dəyişənləri application.properties faylında olanlardan üstün olacaq. Sorğuda dəyişəni ötürmək üçün aşağıdakı konstruksiyanı əlavə etməlisiniz: -D{dəyişən adı}=”{dəyişən dəyəri}” . Biz buruq mötərizələr əlavə etmirik;) Tətbiqimizi əvvəlcədən təyin edilmiş dəyərlərlə - botun adı və işarəsi ilə işə salacaq sorğu alacağıq: java -jar -Dbot.username=”test.javarush.community_bot” -Dbot. token=”dfgkdjfglkdjfglkdjfgk” *.jar İndi bu dəyişənləri docker konteynerinin içərisinə ötürməliyik. Bu mühit dəyişənidir. Gələcəkdə verilənlər bazamızın rəvan və tətbiqimizlə problemsiz işləməsini təmin etmək üçün biz docker-compose istifadə edəcəyik. Bu, konteynerlər arasında işi, başlanğıcı və asılılıqları təşkil edə biləcəyiniz ayrıca bir vasitədir. Başqa sözlə, bir infrastrukturun konteynerlərini idarə etmək üçün Docker-in üstündəki əlavədir. Üstəlik, docker-compose-u işə salmazdan əvvəl əmin olmalıyıq ki, biz bütün kod dəyişikliklərini serverdən çıxarmışıq, tətbiqi quraşdırmışıq və köhnə versiyanı dayandırmışıq. Bunun üçün bash skriptindən istifadə edəcəyik. Vay... Hər şey çətin səslənir, razıyam. Lakin proqramların yerləşdirilməsinin qurulması ilə işləmək həmişə yorucu və mürəkkəb bir prosesdir. Beləliklə, olduqca yaxşı bir sxemimiz var:
  1. Gəlin bash skriptini işə salaq.
  2. Bash skripti docker-compose işləyir.
  3. Docker-compose tətbiqimizlə docker konteynerini işə salır.
  4. Docker konteyneri tətbiqimizi idarə edir.
İndi biz əmin olmalıyıq ki, iki dəyişən - botun adı və onun işarəsi - 1-ci nöqtədən 4-cü nöqtəyə keçsin. Və beləliklə, bu iki dəyişən bizim java tətbiqimizi işə salarkən istifadə olunsun. Sondan əvvələ gedək. Biz artıq bilirik ki, jarnikə başlamaq üçün hansı əmri yerinə yetirmək lazımdır. Buna görə də, biz Dockerfile-ni konfiqurasiya edəcəyik ki, o, iki dəyişəni qəbul etməyi və onları sorğuya ötürməyi öyrənsin. Bunun üçün Dockerfile-ni aşağıdakı formaya endirək:
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"]
İki sətir əlavə etdiyimizi və ENTRYPOINT-i yenilədiyimizi görə bilərsiniz. Xətlər:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
kodlayıcı faylı daxilində dəyişənləri elan edin. Varsayılan olaraq, onların müəyyən edilmiş dəyəri var. Əgər bu doker faylından şəkil yaradarkən belə adları olan mühit dəyişənləri ötürülürsə, dəyərlər fərqli olacaq. Və ENTRYPOINT-də bu mühit dəyişənlərini oxuyacaq daha bir neçə element əlavə etdik:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Burada ${} konstruksiyasından istifadə edərək sətir daxilində BOT_NAME və BOT_TOKEN dəyərlərinin ötürüləcəyini görə bilərsiniz. Sonra, bu dəyişənləri necə qəbul etməyi və docker-compose-ə ötürməyi öyrətməliyik.

docker-compose.yml yaradın

YAML formatı haqqında ayrıca oxumağınız yaxşı olardı, əks halda məqalə artıq sıçrayışla böyüyür. Bizim üçün bu, .properties tipli dəyişənlərin başqa bir təsviridir. Yalnız xassələrdə nöqtə vasitəsilə yazılır, lakin YAML-də bu bir az daha gözəl edilir. Məsələn, bu kimi. .properties-də iki dəyişən: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Amma .yaml-da (.yml ilə eyni) bu belə olacaq:
javarush:
	telegram:
		bot:
		  name: ivan
		  token: pupkin
İkinci seçim daha gözəl və başa düşüləndir. Boşluqlar yuxarıda göstərildiyi kimi olmalıdır. Gəlin bizim application.properties və application.yml-ni birtəhər tərcümə edək. Əvvəlcə onu yaratmalısınız. Layihənin kökündə docker-compose.yml faylı yaradın və oraya aşağıdakıları yazın:
version: '3.1'

services:
 jrtb:
   build:
     context: .
   environment:
     - BOT_NAME=${BOT_NAME}
     - BOT_TOKEN=${BOT_TOKEN}
   restart: always
Birinci sətir docker-compose versiyasıdır. xidmətlər: bundan sonra bütün aşağıdakı sətirlərin (köçürüləcək) konfiqurasiya etdiyimiz xidmətlərə aid olduğunu söyləyir. Bizdə indiyə qədər bunlardan yalnız biri var - jrtb adlı java proqramı . Və artıq onun altında bütün parametrlər olacaq. Məsələn, build: context: . deyir ki, biz Dockerfile-ni docker-compose.yml ilə eyni qovluqda axtaracağıq. Lakin ətraf mühit: bölməsi lazımi mühit dəyişənlərini Dockerfile-ə ötürməyimizə cavabdeh olacaq. Sadəcə bizə lazım olan şey. Buna görə də dəyişənləri aşağıda keçirik. Docker-compose onları server əməliyyat mühiti dəyişənlərində axtaracaq. Gəlin onları bash skriptinə əlavə edək.

Bash skriptlərinin yaradılması

Son addım bir bash skripti yaratmaqdır. Layihənin kökündə start.sh adlı fayl yaradın və oraya aşağıdakıları yazın:
#!/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
Birinci sətir bütün bash skriptləri üçün lazımdır: onsuz işləməyəcək. Və sonra - yerinə yetirilməsi lazım olan terminalda yalnız bir sıra əmrlər. Mən hər bir əmrə şərhlər əlavə etdim ki, aydın olsun. Mən izah etmək istədiyim yeganə şey 1 və 2 dolların nə demək olduğudur. Bunlar bash skripti işə salındıqda ötürüləcək iki dəyişəndir. İxrac əmrindən istifadə edərək, onlar server dəyişənlərinə əlavə olunacaq və docker-compose-də oxunacaq. Bu Ubuntu üçün işləyir, yəqin ki, Windows üçün deyil, amma əmin deyiləm. İndi işi dayandıracaq stop.sh skriptini əlavə etməlisiniz. O, bir neçə sətirdən ibarət olacaq:
#!/bin/bash

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

# Ensure, that the old application won't be deployed again.
mvn clean
Burada docker-compose-ni dayandırırıq və son qurulmadan bəri mövcud olan jarnik layihəsini təmizləyirik. Biz bunu layihəmizin dəqiq şəkildə yenidən qurulmasını təmin etmək üçün edirik. Presedentlər var idi, ona görə də əlavə edirəm) Nəticədə 4 yeni fayl əldə edirik:
  • Dockerfile - tətbiqimizin şəklini yaratmaq üçün fayl;
  • docker-compose.yml - konteynerlərimizi necə işə salacağımıza dair parametrləri olan fayl;
  • start.sh - tətbiqimizi yerləşdirmək üçün bash skripti;
  • stop.sh tətbiqimizi dayandırmaq üçün bir bash skriptidir.
Biz həmçinin tətbiqimizin versiyasını 0.2.0-SNAPSHOT-dan 0.3.0-SNAPSHOT-a yeniləyəcəyik. Gəlin RELEASE_NOTES-ə yeni versiyanın təsvirini əlavə edək və orada olanları bir az refaktor edək:
# Buraxılış Qeydləri ## 0.3.0-SNAPSHOT * JRTB-13: layihəyə əlavə yerləşdirmə prosesi ## 0.2.0-SNAPSHOT * JRTB-3: Telegram Bot əmrlərini idarə etmək üçün həyata keçirilən Əmr nümunəsi ## 0.1.0-SNAPSHOT * JRTB -2: əlavə edilmiş stub teleqram botu * JRTB-0: əlavə edilmiş SpringBoot skelet layihəsi
Və README-də tətbiqimizi necə yerləşdirməyi təsvir edən yeni bir paraqraf əlavə edəcəyik:
## Yerləşdirmə Yerləşdirmə prosesi mümkün qədər asan: Tələb olunan proqram təminatı: - bash skriptlərini işə salmaq üçün terminal - docker - tətbiqi yerləşdirmək üçün docker-compose, lazım olan filiala keçin və bash skriptini işə salın: $ bash start.sh ${bot_username} ${bot_token } Hamısı budur.
Təbii ki, hər şey ingilis dilində yazılıb. Həmişə olduğu kimi, yeni yaradılmış STEP_4_JRTB-13 filialımızda biz adla yeni bir öhdəlik yaradırıq: JRTB-13: yerləşdirmə prosesini docker vasitəsilə həyata keçirin və itələyin. Əvvəlki məqalələrdə təsvir etdiyim şeylər üzərində ətraflı dayanmağı dayandırıram. Eyni şeyi təkrar etməyin mənasını görmürəm. Üstəlik, bunu anlayıb özləri edənlərin heç bir sualı olmayacaq. Bu, mən yeni filialın necə yaradılacağından, necə bir öhdəliyin yaradılmasından, öhdəliyi depoya necə itələyəcəyimdən danışıram.

Alt xətt

Bu gün mən diqqətlə nəzərdən keçirilməli və əlavə oxu ilə genişləndirilməli olan bir ton yeni məlumat göstərdim. Ən vacibi: BİR (!!!) əmrinin köməyi ilə tətbiqimizi yerləşdirmək üçün lazım olan hər şey ediləcək. Bu o qədər gözəldir ki, sizə deyə bilmərəm. Bəli, dəyişənləri necə düzgün yönləndirməyi başa düşmək üçün Docker sənədlərində kifayət qədər vaxt sərf etməli oldum. Bundan sonra teleqram botu həmişə əsas filialın ən son versiyası üzərində işləyəcək . Telegram botuna keçid. Bu gün oxumaq üçün yaxşı olacaq materiallara heç bir keçid olmayacaq: məsuliyyət sizin üzərinizdədir. Məlumat axtarmağı öyrənmək lazımdır. Telegram kanalıma abunə olan hər kəs botun yerləşdirilməsi haqqında demək olar ki, dərhal öyrəndi. Dostlar, layihəni bəyəndinizmi? Ona bir ulduz verin ! Beləliklə, o, daha populyarlaşacaq və daha çox insan bu barədə öyrənə və öyrənə biləcək. Həmişə olduğu kimi, bu seriyanı və orada işlədiyim digər layihələrimi izləmək üçün GitHub-da qeydiyyatdan keçməyi və hesabı izləməyi təklif edirəm . İndi verilənlər bazasına qoşulmağa hazırıq. Növbəti məqalə daha uzun olacaq və orada verilənlər bazası ilə işləmək üçün lazım olan hər şeyi edəcəyik. Bütün təsvirlər JRTB-1 -dədir .

Serialdakı bütün materialların siyahısı bu məqalənin əvvəlindədir.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION