Sebelum menggunakan perakitan untuk mengemas proyek -proyek layanan microsboot, saya ingin berbicara tentang beberapa metode penyebaran umum untuk proyek springboot saat ini.
Gunakan wadah Docker untuk digunakan, membangun aplikasi Springboot ke dalam gambar Docker, dan kemudian mulai gambar melalui wadah. Metode ini sangat nyaman ketika aplikasi skala besar dan ekstensi aplikasi diperlukan. Ini adalah solusi penyebaran tingkat industri saat ini, tetapi membutuhkan penguasaan teknologi ekosistem Docker.
Gunakan Fatjar untuk menggunakan dan memulai secara langsung, yang merupakan metode penyebaran aplikasi sederhana untuk banyak pemula atau situasi skala kecil.
Artikel ini terutama menyediakan solusi pengemasan yang lebih ramah untuk metode penyebaran kedua, yaitu untuk membuat manajemen penyebaran lebih mudah. Metode pertama dapat ditulis di blog saya di masa depan.
1. Mengapa Springboot harus dikemas dalam layanan?
Baru -baru ini saya melihat tim proyek. Mereka menggunakan Springboot untuk mengembangkan proyek dan membangun interaksi ke tim Operasi dan Pemeliharaan, yang merupakan Fatjar Spring Boot. Selain itu, paket asli ini tidak diragukan lagi sangat fatal untuk pengoperasian dan personel pemeliharaan di perusahaan pengembangan proyek tradisional. Setelah proyek dikirimkan, seluruh file konfigurasi disembunyikan di dalam toples, dan memodifikasi file konfigurasi untuk lingkungan yang berbeda menjadi hal yang sangat sulit. Oleh karena itu, ketika kami memperkenalkan teknologi baru di perusahaan, kami harus mempertimbangkan bagaimana menjadi berorientasi layanan dan rekayasa. Jika kita hanya merujuk pada kerangka kerja teknis, kita mungkin hanya perlu menambahkan beberapa dependensi, dan membaca API dan menulis beberapa baris kode untuk dijalankan.
Untuk mengatasi masalah di atas, kita harus berorientasi pada layanan dan berorientasi pada rekayasa, dan kita perlu secara kasar menyelesaikan dua masalah:
Aktifkan springboot untuk memuat file konfigurasi di luar toples.
Berikan skrip startup berbasis layanan, yang biasanya merupakan shell atau kelelawar di bawah Windows. Dengan skrip layanan aplikasi Springboot, Anda dapat memulai dan menghentikan aplikasi Springboot.
2. Diagram Struktur Aplikasi Springboot Kemasan
Di sini pertama -tama kita melihat rendering setelah menggunakan perakitan untuk mengemas layanan springboot.
3. Langkah -langkah penting untuk pengemasan layanan
Di bawah ini adalah langkah -langkah terperinci untuk mengemas springboot.
3.1 Tambahkan Plugin Paket Perakitan
<Plugin> <ArtifactId> Maven-assembly-plugin </t Artifactid> <version> 3.0.0 </version> <configuration> <cescriptors> <descriptor> SRC/Main/Assembly/Assembly. <jetik> Single </ject> </ject> </execution> </executions> </tugin>
Dari kode di atas, saya telah menempatkan konfigurasi perakitan di direktori utama. Ini adalah kebiasaan, dan Anda tidak bisa meletakkannya di sini. Berikut adalah diagram struktur umum perakitan dalam proyek:
3.2 Konfigurasi Assembly.xml
Konfigurasi perakitan mirip dengan konfigurasi berikut, yang tidak lebih dari skrip layanan pengemasan, toples, file konfigurasi, dll. Dari kode berikut, Anda akan menemukan bahwa perakitan telah mengetik file konfigurasi di bawah konfigurasi.
<sakitan> <d> 1.0 </dent> <formats> <format> tar.gz </format> </format> <pherpherets> <pheileset> <pangkeset> <recrectory> src/main/perakit <directory>src/main/assembly/config</directory> <outputDirectory>config</outputDirectory> <fileMode>0644</fileMode> </fileSet> <fileSet> <directory>target</directory> <outputDirectory>lib</outputDirectory> <includes> <include>*.jar</include> </includes> </fileSet> <fileSet> <Rectory> SRC/Main/Resources </Directory> <OutputDirectory> Log </OutputDirectory> <FILEMODE> 0755 </filemode> <Enpludes> <Encuxlude> **/*</tidak termasuk </tidak termasuk> </Fileset> </Filesets> </assembly>
3.3 Menulis skrip layanan
Sekarang tulis skrip untuk lingkungan Linux.
Yang pertama: skrip startup start.sh
#!/bin/bashSERVER_NAME='spring-vue'# jar name JAR_NAME='springboot-vue.jar'cd `dirname $0`BIN_DIR=`pwd`cd ..DEPLOY_DIR=`pwd`CONF_DIR=$DEPLOY_DIR/config# SERVER_PORT=`sed '/server.port/!d;s/.*=//' config/application.properties | tr -d '/r'`# Dapatkan nomor port dari server aplikasi_port = `sed -nr'/port: [0-9]+/s /.* port:+([0-9]+).*// 1/p 'config/application.yml`pids =` ps -f | Grep Java | grep "$ conf_dir" | awk '{cetak $ 2}' `if [" $ 1 "=" status "]; maka jika [-n "$ pids"]; Lalu echo "$ server_name sedang berjalan ...!" echo "pid: $ pids" keluar 0 else echo "$ server_name berhenti" keluar 0 fifiif [-n "$ pids"]; Lalu Echo "Kesalahan: $ server_name sudah dimulai!" echo "pid: $ pids" keluar 1fiif [-n "$ server_port"]; lalu server_port_count = `netstat -tln | grep $ server_port | wc -l` if [$ server_port_count -gt 0]; Lalu Echo "Kesalahan: Port $ server_name $ server_port sudah digunakan!" Keluar dari 1 fifilogs_dir = $ deploy_dir/logsif [! -d $ logs_dir]; Kemudian mkdir $ logs_dirfistdout_file = $ logs_dir/stdout.logjava_opts = "-djava.awt.headless = true -djava.net.preferipv4stack = true" java_debug_opts = "" jika ["$ 1" Lalu java_debug_opts = "-xdebug -xnoagent -djava.compiler = tidak ada -xrunjdwp: transport = dt_socket, alamat = 8000, server = y, suspend = n" fijava_jmx_opts = "" jika ["$ 1" = "jm"; lalu java_jmx_opts = "-dcom.sun.management.jmxremote.port = 1099 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.Authenticate = false" fijava_mem_opts = "" " -authenticate = false" fijava_mem_opts = "" " -authenticate = fise" fijava_mem_opts = "" "" -As = "fijava_mem_opts =" "" "-aSticate = fijava_mem_opts =" "" "fiST`> "fijava_mem_opts =" " grep -i 64 -bit`if [-n "$ bits"]; Kemudian java_mem_opts = "-server -xmx512m -xms512m -xmn256m -xx: permsize = 128m -xss256k -xx:+disablexplicitgc -xx:+USeconcmarksweepgc -xx:+CMSPARLELEDRELED:+USECONCMARKSWEEPGC -XX:+CMMSPARADRELEK: +MAkenCMARKSWEEPGC -XX:+CMMSPARLELEK: -Xx:+usecmscompactatfullcollection -xx: largePagesizeInbytes = 128m -xx:+usefastaccessormethods -xx:+usecmsineTiatOcOccupancyonly -xx: cmsinItiatCupancyFraction = 70 "lain JAVA_MEMEM_OPTS = "ServORTFRACTE = 70" Lain JAVA_MEMEM_OPTS = "Serper XX: Permsize = 128m -xx: Survivorratio = 2 -xx:+useparallelgc "ficonfig_files =" -dlogging.path = $ logs_dir -dlogging.config = $ conf_dir/log4j2.xml -dspring.config.config = $ $ " $SERVER_NAME..."nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/lib/$JAR_NAME > $STDOUT_FILE 2>&1 &COUNT=0while [ $COUNT -lt 1 ]; do echo -e "./c" sleep 1 if [-n "$ server_port"]; Kemudian hitung = `netstat -an | grep $ server_port | wc -l` else count = `ps -f | Grep Java | grep "$ deploy_dir" | awk '{cetak $ 2}' | wc -l` fi if [$ count -gt 0]; Kemudian break fidoneecho "ok!" pids = `ps -f | Grep Java | grep "$ deploy_dir" | AWK '{print $ 2}' `echo" pid: $ pids "echo" stdout: $ stdout_file "skrip penggunaan kasus:# mulai aplikasi./start.sh# Mulai dalam mode debug./start status debug saat ini dan mulai status bow. $ 0`bin_dir = `pwd`cd ..deploy_dir =` pwd`conf_dir = $ deploy_dir/configserver_name = $ deploy_dirpids = `ps -ef | Grep Java | grep "$ conf_dir" | awk '{print $ 2}' `if [-z" $ pids "]; Lalu Echo "Kesalahan: $ server_name tidak dimulai!" Keluar 1fiif ["$ 1"! = "Skip"]; lalu $ bin_dir/dump.shfiecho -e "Menghentikan $ server_name .../c" untuk pid dalam $ pids; do bunuh $ pid> /dev /null 2> & 1doneCount = 0 sementara [$ count -lt 1]; do echo -e "./c" sleep 1 count = 1 untuk pid dalam $ pids; do pid_exist = `ps -f -p $ pid | grep java` if [-n "$ pid_exist"]; Kemudian hitung = 0 break fi doDoneecho "ok!" echo "pid: $ pids"Script startup untuk lingkungan Windows:
ECHO Offset app_name = springboot-vue.jarset config = -dlogging.path = ../logs -dlogging.config = ../config/log4j2.xml -dspring.config.location = ../config/application.yml set debug_opts = if ""%1 "==" "" "" "" "" "" "" if "if" if "if" if "if" if "if" if -Xloggc: ../ log/gc.log -Verbose: gc -xx:+printgcdetails -xx:+heapdumponoutofmemoryError -xx: heapduppath = ../log debug) set jmx_opts = if ""%1 "" == "" "" "" "" "JMX_OPTS = if" "%1" "" "" "" "" ifX_OPTS = IF "%1" "JMX = IF"%1 " -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9888 -Dcom.sun.management.jmxremote.ssl=FALSE -Dcom.sun.management.jmxremote.authenticate=FALSE goto jmx)echo "Starting the %APP_NAME%"java -Xms512m -Xmx512m -server%debug_opts%%jmx_opts%%config%-jar ../lib/%app_name%goto end: debugecho "debug" java -xms512m -xmx512m -server%debug_opts%%%-jark .. -Xms512m -xmx512m -server%jmx_opts%%config%-jar ../lib/%app_name%goto end: endpause
Untuk proyek springboot yang berbeda, Anda hanya perlu memodifikasi skrip dengan tepat. Untuk menghemat ruang, saya tidak akan mencantumkan skrip lain di sini. Anda dapat merujuk pada demo yang saya kirimkan: https://github.com/shalousun/springboot-vue.git
CATATAN: Skrip di atas dirujuk dari Dubbo Official. Bahkan, ini juga mirip dengan konstruksi ringan proyek Dubbo.
4. Pemrosesan jalur log setelah kemasan
Pada gambar di bagian kedua, Anda dapat melihat bahwa log aplikasi yang dikemas umumnya output ke direktori log. Namun, untuk platform sistem yang berbeda, meskipun jalur output log yang dikonfigurasi adalah sama, mereka mungkin tidak harus output ke log pada akhirnya. Setelah pengujian, tidak ada masalah untuk menggunakan jalur log relatif di platform windows ../ log, tetapi untuk menggunakan jalur relatif dalam sistem Linux, itu tidak dapat menjadi output ke log. Oleh karena itu, disarankan untuk menulis jalur absolut di platform Linux. Namun, dalam skrip yang saya berikan, atur jalur ke log keluaran
-Dlogging.path = ../log
Oleh karena itu, menggabungkan kemampuan parsing yang kuat dari log4j2, Anda dapat mengatur jalur log log42:
<name properti = "log_home"> $ {sys: logging.path} </prop Property>Namun, log akses untuk aplikasi springboot tampaknya hanya menggunakan jalur absolut di bawah Linux.
# Server ConfigServer: Port: 8080 Undertow: AccessLog: Diaktifkan: Dir True:/usr/xxx/logslogging: path:/usr/xxx/logs
Tentu saja, siswa yang menggunakan konfigurasi untuk menyelesaikan masalah nanti dapat mengingatkan mereka untuk memperbaikinya.
Meringkaskan:
Rencana ini sendiri tidak membawa sesuatu yang baru, dan sebagian besar skrip dirujuk ke skrip resmi Dubbo, tetapi mereka telah melakukan beberapa perbaikan di atasnya. Tetapi poin penting adalah bagaimana berpikir tentang layanan dan rekayasa yang diperlukan untuk menggunakan teknologi ini berdasarkan skenario aplikasi teknis yang sebenarnya.
Di atas adalah solusi pengemasan layanan berbasis Majelis Springboot yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!