JavaRush /Blog Java /Random-MS /Kami melaksanakan penggunaan aplikasi - "Projek Java dari...

Kami melaksanakan penggunaan aplikasi - "Projek Java dari A hingga Z"

Diterbitkan dalam kumpulan
Hai semua. Kami meneruskan siri artikel mengenai penulisan projek anda. “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 1

Susun dahan

Daripada kepentingannya, untuk tidak tersesat dalam cawangan dan susunannya dalam repositori, saya memutuskan untuk menamakan semula mereka dengan menambahkan awalan STEP_{number} . Sebagai contoh, kami mempunyai tiga cawangan sebagai tambahan kepada yang utama:
  • JRTB-0
  • JRTB-2
  • JRTB-3
Anda tidak akan faham dengan serta-merta yang mana satu harus pergi selepas itu. Jadi saya akan menamakan semula mereka seperti berikut:
  • STEP_1_JRTB-0 - langkah pertama
  • STEP_2_JRTB-2 - langkah kedua
  • STEP_3_JRTB-3 - langkah ketiga
Dan seterusnya untuk artikel seterusnya. Untuk menamakan semula cawangan, pergi ke halaman repositori , cari kotak cawangan , ikutinya: “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 2Di bawah setiap cawangan, klik pada pensel dan namakan semula cawangan: “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 3Dan hasilnya kami mendapat: “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 4By the way, semua orang yang melanggan saluran telegram saya mendapati keluar dengan segera bahawa saya menamakan semula cawangan.

Sedikit tentang Docker

Apa itu Docker? Ringkasnya, ia adalah alat yang anda gunakan dengan cepat dan selamat menggunakan (mengerahkan) aplikasi, mewujudkan untuk mereka infrastruktur tertutup yang hanya diperlukan untuk mereka. Masih sukar, saya faham. Secara umum, Docker boleh difahami sebagai platform pembangunan di mana anda boleh bekerja dengan cepat dan cekap. Docker boleh difahami sebagai program yang berjalan pada pelayan. Program ini mempunyai keupayaan untuk menyimpan bekas dengan aplikasi. Apakah bekas? Ini adalah infrastruktur yang berasingan di mana anda boleh menambah semua yang anda perlukan. Sebagai contoh, untuk aplikasi Java kita memerlukan JRE untuk menjalankan aplikasi, bekas akan mempunyai ini, kita akan memerlukan beberapa perisian lain - kita boleh menambah ini. Atau mungkin kita memerlukan Linux dan bekas servlet Tomcat. Ini juga boleh dilakukan. Bekas dibuat berdasarkan imej: iaitu, ini adalah templat khusus yang mengandungi semua yang diperlukan untuk membuat bekas Docker. Bagaimana untuk mencipta imej ini? Dalam kes kami, kami perlu mencipta Dockerfile pada akar projek yang menerangkan perkara yang sepatutnya ada dalam bekas. Memandangkan kami tidak mahu mendedahkan token bot di mana-mana sahaja, kami perlu meneruskannya setiap kali kami mahu menggunakan aplikasi. Anda boleh membaca lebih lanjut mengenai topik ini di sini dan di sini .

Kami menulis JRTB-13

Kami perlu menyediakan proses penempatan yang cepat dan mudah untuk aplikasi kami kepada pelayan. Iaitu, untuk mesin yang berfungsi 24/7. Mari kita ambil Docker sebagai asas. Tetapi tiada tugas dalam senarai kami yang akan bertanggungjawab untuk menambah fungsi ini. Entah bagaimana saya terlepas ketika menciptanya. Tiada masalah, kami akan menciptanya sekarang. Pergi ke tab penciptaan isu pada GitHub dan pilih Permintaan Ciri: “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 5Tambahkan penerangan tugas, kriteria penerimaannya, tetapkan projek mana yang dimiliki oleh isu ini dan anda boleh mencipta isu baharu: “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 6Sekarang, untuk menunjukkan bahawa tugas itu telah diterima untuk kerja, tukar status tugas daripada Untuk dilakukan pada Sedang Dijalankan: “Projek Java dari A hingga Z”: Melaksanakan penggunaan aplikasi - 7Ini akan menjadi artikel yang sukar. Jika anda mempunyai sebarang masalah, tulis dalam komen: Saya akan memantau dan menjawabnya dengan sebaik mungkin. Ini akan menjadi Sokongan Pelanggan yang kecil :D

Mencipta fail Docker

Apakah fail docker? Untuk Docker, ini ialah skrip (arahan langkah demi langkah) tentang cara mencipta imej untuk bekas Docker. Untuk aplikasi kami berfungsi, kami memerlukan JDK, versi 11 pada masa itu. Iaitu, kita perlu mencari imej docker JDK 11 dan menambahnya pada imej kita. Ini adalah sesuatu yang serupa dengan cara kita menambah kebergantungan pada ingatan. Docker mempunyai DockerHub untuk tujuan ini . Untuk memuat turun imej secara tempatan, anda perlu mendaftar di sana. Lepas daftar, jom cari JDK11. Daripada apa yang saya dapati, ini ialah bekasnya: adoptopenjdk/openjdk11 . Perihalan bekas ini mempunyai perkara yang diperlukan untuk fail docker:
FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
Mari kita betulkan folder dari mana kita mengambil fail jar. Kami mempunyainya dalam folder sasaran selepas kami menjalankan tugas maven pakej mvn. Sebelum melakukan semua ini, berdasarkan cawangan utama yang dikemas kini, kami mencipta cawangan baharu untuk tugas kami: STEP_4_JRTB-13 . Sekarang anda boleh bekerja. Dalam akar projek, buat fail tanpa sambungan Dockerfile dan tambahkan yang berikut di dalam:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Baris pertama ialah imej akan berdasarkan - adoptopenjdk/openjdk11. Baris kedua adalah untuk menambah hujah pada imej bernama JAR_FILE, yang terletak dalam folder sasaran. Selain itu, folder semasa ditentukan oleh lokasi Dockerfile. Baris ketiga - salin balang projek kami ke dalam imej docker. Baris terakhir pada dasarnya mengandungi tatasusunan yang dibuat daripada arahan dalam terminal, yang dipisahkan oleh ruang. Iaitu, pada akhirnya perkara berikut akan dilaksanakan: “java -jar /app.jar” Untuk merahsiakan token bot, apabila memulakan bekas kita perlu lulus dua pembolehubah - nama bot dan tokennya. Untuk melakukan ini, kami akan menulis pertanyaan yang sepatutnya melancarkan projek kami dengan pembolehubah. Dan bagaimana untuk melakukannya? Anda perlu Google itu: berikut ialah pautan pertama dengan penerangan biasa. Apa yang kita nak buat? Kami mempunyai dua pembolehubah dalam fail application.properties yang kami takrifkan di sana:
  • bot.nama pengguna
  • bot.token
Saya mahu menjalankan bekas docker dan lulus nilai saya di sana setiap kali supaya tiada siapa yang boleh melihat nilai ini. Saya tahu bahawa dalam SpringBoot, pembolehubah persekitaran yang ditetapkan apabila projek balang dilancarkan akan diutamakan berbanding pembolehubah dalam fail application.properties. Untuk menghantar pembolehubah dalam permintaan, anda perlu menambah binaan berikut: -D{variable name}=”{variable value}” . Kami tidak menambah pendakap kerinting ;) Kami akan menerima permintaan yang akan melancarkan aplikasi kami dengan nilai yang telah ditetapkan - nama dan token bot: java -jar -Dbot.username=”test.javarush.community_bot” -Dbot. token=”dfgkdjfglkdjfglkdjfgk” *.jar Sekarang kita perlu menghantar pembolehubah ini di dalam bekas docker. Ini adalah pembolehubah persekitaran. Untuk memastikan bahawa pada masa hadapan pangkalan data kami berfungsi dengan lancar dan tanpa masalah dengan aplikasi kami, kami akan menggunakan docker-compose. Ini ialah alat yang berasingan di mana anda boleh mengatur kerja, permulaan dan kebergantungan antara bekas. Dalam erti kata lain, ia adalah tambahan di atas Docker untuk mengurus bekas satu infrastruktur. Selain itu, sebelum menjalankan docker-compose, kami perlu memastikan bahawa kami telah menarik semua perubahan kod daripada pelayan, membina aplikasi dan menghentikan versi lama. Untuk ini kami akan menggunakan skrip bash. Wah... Bunyinya susah, saya setuju. Tetapi bekerja dengan menyediakan penggunaan aplikasi sentiasa merupakan proses yang membosankan dan kompleks. Oleh itu, kami mempunyai skema yang cukup baik:
  1. Mari jalankan skrip bash.
  2. Skrip bash menjalankan docker-compose.
  3. Docker-compose melancarkan bekas docker dengan aplikasi kami.
  4. Bekas Docker menjalankan aplikasi kami.
Dan sekarang kita perlu memastikan bahawa dua pembolehubah - nama bot dan tokennya - pergi dari titik 1 ke titik 4. Dan supaya kedua-dua pembolehubah ini digunakan semasa melancarkan aplikasi java kami. Mari kita pergi dari akhir hingga awal. Kita sudah tahu arahan apa yang perlu dilaksanakan untuk memulakan jarnik. Oleh itu, kami akan mengkonfigurasi Dockerfile supaya ia belajar menerima dua pembolehubah dan menyerahkannya kepada permintaan. Untuk melakukan ini, mari kurangkan Dockerfile kepada bentuk berikut:
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"]
Anda dapat melihat bahawa kami menambah dua baris dan mengemas kini ENTRYPOINT. Garisan:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
mengisytiharkan pembolehubah di dalam fail pengekod. Secara lalai mereka mempunyai nilai yang ditentukan. Jika, apabila mencipta imej daripada fail docker ini, pembolehubah persekitaran dengan nama sedemikian diluluskan, nilainya akan berbeza. Dan dalam ENTRYPOINT kami menambah beberapa lagi elemen yang akan membaca pembolehubah persekitaran ini:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
Di sini anda boleh melihat bahawa di dalam baris, menggunakan binaan ${}, nilai BOT_NAME dan BOT_TOKEN akan dihantar. Seterusnya, kita perlu mengajar cara menerima dan menghantar pembolehubah ini kepada docker-compose.

Buat docker-compose.yml

Adalah baik untuk anda membaca tentang format YAML secara berasingan, jika tidak artikel itu sudah berkembang dengan pesat. Bagi kami, ini hanyalah satu lagi perihalan pembolehubah jenis .properties. Hanya dalam sifat ia ditulis melalui titik, tetapi dalam YAML ini dilakukan dengan lebih cantik sedikit. Sebagai contoh, seperti ini. Dua pembolehubah dalam .properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin Tetapi dalam .yaml (sama seperti .yml) ia akan menjadi seperti ini:
javarush:
	telegram:
		bot:
		  name: ivan
		  token: pupkin
Pilihan kedua lebih cantik dan boleh difahami. Ruang hendaklah betul-betul seperti yang ditunjukkan di atas. Mari menterjemahkan application.properties dan application.yml kami entah bagaimana. Mula-mula anda perlu menciptanya. Dalam akar projek, buat fail docker-compose.yml dan tulis yang berikut di sana:
version: '3.1'

services:
 jrtb:
   build:
     context: .
   environment:
     - BOT_NAME=${BOT_NAME}
     - BOT_TOKEN=${BOT_TOKEN}
   restart: always
Baris pertama ialah versi docker-compose. services: mengatakan bahawa semua baris berikut selepas ini (akan dialihkan) merujuk kepada perkhidmatan yang kami konfigurasikan. Kami hanya mempunyai satu daripada ini setakat ini - aplikasi java yang dipanggil jrtb . Dan sudah di bawahnya semua tetapannya. Sebagai contoh, bina: konteks: . mengatakan bahawa kami akan mencari Dockerfile dalam direktori yang sama seperti docker-compose.yml. Tetapi bahagian persekitaran: akan bertanggungjawab untuk memastikan bahawa kami menghantar pembolehubah persekitaran yang diperlukan kepada Dockerfile. Hanya apa yang kita perlukan. Oleh itu, kami lulus pembolehubah di bawah. Docker-compose akan mencarinya dalam pembolehubah persekitaran operasi pelayan. Mari tambahkan mereka pada skrip bash.

Mencipta skrip bash

Langkah terakhir ialah membuat skrip bash. Buat fail yang dipanggil start.sh dalam akar projek dan tulis yang berikut di sana:
#!/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
Baris pertama diperlukan untuk semua skrip bash: ia tidak akan berfungsi tanpanya. Dan kemudian - hanya satu set arahan dalam terminal yang perlu dilaksanakan. Saya telah menambah komen dalam setiap arahan supaya ia harus jelas. Satu-satunya perkara yang saya ingin jelaskan ialah maksud $1 dan $2. Ini adalah dua pembolehubah yang akan diluluskan apabila skrip bash dilancarkan. Menggunakan arahan eksport, ia akan ditambahkan pada pembolehubah pelayan dan dibaca dalam docker-compose. Ini berfungsi untuk Ubuntu, mungkin bukan untuk Windows, tetapi saya tidak pasti. Sekarang anda perlu menambah skrip stop.sh, yang akan menghentikan kerja. Ia akan mengandungi beberapa baris:
#!/bin/bash

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

# Ensure, that the old application won't be deployed again.
mvn clean
Di sini kita berhenti mengarang docker dan membersihkan jarnik projek, yang telah sedia ada sejak binaan terakhir. Kami melakukan ini untuk memastikan projek kami dibina semula dengan tepat. Terdapat preseden, itulah sebabnya saya menambah) Akibatnya, kami mendapat 4 fail baharu:
  • Dockerfile - fail untuk mencipta imej aplikasi kami;
  • docker-compose.yml - fail dengan tetapan untuk cara kami melancarkan bekas kami;
  • start.sh - skrip bash untuk menggunakan aplikasi kami;
  • stop.sh ialah skrip bash untuk menghentikan aplikasi kami.
Kami juga akan mengemas kini versi aplikasi kami daripada 0.2.0-SNAPSHOT kepada 0.3.0-SNAPSHOT. Mari tambahkan perihalan versi baharu pada RELEASE_NOTES dan faktorkan semula sedikit perkara yang ada:
# Nota Keluaran ## 0.3.0-SNAPSHOT * JRTB-13: menambahkan proses penempatan pada projek ## 0.2.0-SNAPSHOT * JRTB-3: melaksanakan corak Perintah untuk mengendalikan arahan Bot Telegram ## 0.1.0-SNAPSHOT * JRTB -2: menambah bot telegram rintisan * JRTB-0: menambah projek rangka SpringBoot
Dan dalam README kami akan menambah perenggan baharu yang menerangkan cara menggunakan aplikasi kami:
## Proses Deployment semudah mungkin: Perisian yang diperlukan: - terminal untuk menjalankan skrip bash - docker - docker-compose untuk menggunakan aplikasi, beralih ke cawangan yang diperlukan dan jalankan skrip bash: $ bash start.sh ${bot_username} ${bot_token } Itu sahaja.
Sudah tentu, semuanya ditulis dalam bahasa Inggeris. Seperti biasa, dalam cawangan kami yang baru dibuat STEP_4_JRTB-13 kami membuat komitmen baharu dengan nama: JRTB-13: melaksanakan proses penempatan melalui docker dan menolaknya. Saya berhenti memikirkan secara terperinci perkara-perkara yang telah saya jelaskan dalam artikel sebelumnya. Saya tidak nampak guna mengulangi perkara yang sama. Selain itu, mereka yang mengetahuinya dan melakukannya sendiri tidak akan mempunyai sebarang soalan. Ini saya bercakap tentang cara membuat cawangan baharu, cara membuat komit, cara menolak komit ke repositori.

Pokoknya

Hari ini saya telah menunjukkan satu tan maklumat baharu yang perlu dipertimbangkan dengan teliti dan dikembangkan dengan bacaan tambahan. Perkara yang paling penting: dengan bantuan arahan SATU (!!!), semua yang diperlukan untuk menggunakan aplikasi kami akan dilakukan. Ini sangat keren sehingga saya tidak dapat memberitahu anda. Ya, saya terpaksa menghabiskan banyak masa dalam dokumentasi Docker untuk memahami cara memajukan pembolehubah dengan betul. Mulai sekarang, bot telegram akan sentiasa berfungsi pada versi terkini cawangan utama . Pautan ke bot telegram. Hari ini tidak akan ada pautan ke bahan yang bagus untuk dibaca: tanggungjawab terletak pada anda. Anda perlu belajar mencari maklumat. Semua orang yang melanggan saluran telegram saya mengetahui tentang penggunaan bot hampir serta-merta. Kawan-kawan, adakah anda suka projek itu? Beri dia bintang ! Dengan cara ini ia akan menjadi lebih popular dan lebih ramai orang akan dapat mempelajarinya dan belajar daripadanya. Seperti biasa, saya cadangkan mendaftar di GitHub dan mengikuti akaun saya untuk mengikuti siri ini dan projek saya yang lain yang saya kerjakan di sana. Kini kami bersedia untuk menyambung pangkalan data. Artikel seterusnya akan lebih panjang dan di dalamnya kami akan melakukan segala yang diperlukan untuk bekerja dengan pangkalan data. Semua huraian ada dalam JRTB-1 .

Senarai semua bahan dalam siri ini adalah pada permulaan artikel ini.

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