Bevor ich Assembly zum Verpacken von Springboot Microservices -Projekten nutzte, möchte ich derzeit über mehrere gängige Bereitstellungsmethoden für Springboot -Projekte sprechen.
Verwenden Sie Docker -Container, um bereitzustellen, die Anwendung von Springboot in ein Docker -Bild zu erstellen und dann das Bild über den Container zu starten. Diese Methode ist sehr bequem, wenn große Anwendungen und Anwendungsverlängerungen erforderlich sind. Es handelt sich um eine aktuelle Bereitstellungslösung auf Industrieebene, erfordert jedoch die Beherrschung der Docker-Ökosystemtechnologie.
Verwenden Sie Fatjar, um direkt bereitzustellen und zu starten. Dies ist eine einfache Anwendungsbereitstellungsmethode für viele Anfänger oder sehr kleine Situationen.
Dieser Artikel bietet hauptsächlich eine freundlichere Verpackungslösung für die zweite Bereitstellungsmethode, die das Bereitstellungsmanagement erleichtert. Die erste Methode kann in Zukunft in meinem Blog geschrieben werden.
1. Warum sollte Springboot im Service verpackt werden?
Kürzlich habe ich ein Projektteam gesehen. Sie verwendeten Springboot, um das Projekt zu entwickeln und Interaktionen mit dem Betriebs- und Wartungsteam zu konstruieren, bei dem es sich um einen Spring Boot Fatjar handelt. Darüber hinaus ist dieses Originalpaket für Betriebs- und Wartungspersonal in herkömmlichen Projektentwicklungsunternehmen zweifellos sehr tödlich. Nachdem das Projekt geliefert wurde, ist die gesamte Konfigurationsdatei im Glas versteckt, und die Änderung der Konfigurationsdatei für verschiedene Umgebungen wird zu einer sehr schwierigen Sache. Wenn wir daher eine neue Technologie im Unternehmen einführen, müssen wir überlegen, wie man Service-orientiert und technisch ist. Wenn wir uns nur auf das technische Framework verweisen, müssen wir möglicherweise nur einige Abhängigkeiten hinzufügen und die API lesen und ein paar Codezeilen zum Ausführen schreiben.
Um die oben genannten Probleme anzugehen, müssen wir serviceorientiert und technisch orientiert sein, und wir müssen ungefähr zwei Probleme lösen:
Aktivieren Sie Springboot, um Konfigurationsdateien außerhalb des Glas zu laden.
Geben Sie ein servicebasiertes Startkript an, bei dem es sich normalerweise um eine Hülle oder ein Fledermaus unter Windows handelt. Mit dem Anwendungsservice -Skript von Springboot können Sie Springboot -Anwendungen Containerly Start and stoppen.
2. Packaged Springboot Application Strukturdiagramm
Hier schauen wir uns zuerst die Renderings an, nachdem wir die Assembly zum Verpacken von Springboot -Service verwendet haben.
3. Wichtige Schritte für die Serviceverpackung
Im Folgenden finden Sie die detaillierten Schritte zum Verpacken des Springboots.
3.1 Plugin des Montagepakets hinzufügen
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <configuration> <descriptors> <descriptor>src/main/assembly/assembly.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <giel> Single </gar
Aus dem obigen Code habe ich die Montagekonfiguration in das Hauptverzeichnis eingefügt. Dies ist eine Gewohnheit, und Sie können sie nicht hierher setzen. Hier ist ein allgemeines Strukturdiagramm der Montage im Projekt:
3.2 Assembly.xml Konfiguration
Die Konfiguration der Montage ähnelt der folgenden Konfiguration. Dies ist nichts anderes als Verpackungsdienstskripte, Gläser, Konfigurationsdateien usw. Aus dem folgenden Code werden Sie feststellen, dass die Montage die Konfigurationsdatei unter Konfiguration eingegeben hat.
<assembly> <id>1.0</id> <formats> <format>tar.gz</format> </formats> <fileSets> <fileSet> <fileSet> <directory>src/main/assembly/bin</directory> <outputDirectory>bin</outputDirectory> <fileMode>0755</fileMode> </fileSet> <fileSet> <verzeichnis> src/main/montage/config </verzeichnis> <outputDirectory> config </outputDirectory> <fileMode> 0644 </fileMode> </fileSet> <FileSet> <Regnitory> Ziel </Verzeichnis> <outputDirectory> lib </outditdirectory> <Clortset> <Clors> <Clors> <Clors> <Clänen> <Clänen> <Clänen> <Clänen> <Clänen> </included> </included> </Inclentor> </</</</</</</</<Code> <Clorts> <Clänen> <verzeichnisse> src/main/ressourcen </verzeichnis> <outputDirectory> Protokolls </outputDirectory> <fileMode> 0755 </fileMode> <xcludes> <exklude> **/*</exklude> </ausschließend> </fileet> </fileets> </montagely> </montage> </exklued
3.3 Schreibdiensteskripte schreiben
Schreiben Sie nun Skripte für die Linux -Umgebung.
Das erste: start.sh Startup -Skript
#!/bin/bashserver_name = 'Spring-vue'# jar name jar_name = 'Springboot-vue.jar'cd `Dirname $ 0`BIN_DIR =` pwd`cd ..Deploy_dir = `pwd`conf_dir = $ desply_dir/config# Server/Konfiguration# Server/Konfiguration# Server/Konfiguration# Server/Konfiguration# Server/Konfiguration# Server/Konfiguration# Server =##` sedr '/server.port/!d;s/.*=//' config/application.properties | Tr -D '/r'`# Erhalten Sie die Portnummer des Anwendungsservers server_port = `sed -nr'/port: [0-9]+/s /.* port:+([0-9]+).*// 1/p 'config/application.yml`pids =` ps -f | Grep Java | grep "$ conf_dir" | awk '{print $ 2}' `if [" $ 1 "=" Status "]; dann wenn [-n "$ pids"]; Dann echo "Der $ server_name wird ausgeführt ...!" echo "pid: $ pids" beenden 0 sonst echo "Der $ server_name wird gestoppt" beenden 0 fifiif [-n "$ pids"]; Dann echo "Fehler: Der $ server_name wurde bereits gestartet!" echo "pid: $ pids" exit 1fiif [-n "$ server_port"]; dann server_port_count = `netstat -tln | grep $ server_port | wc -l` if [$ server_port_count -Gt 0]; Dann echo "Fehler: Der $ server_name port $ server_port bereits verwendet!" Beenden Sie 1 Fifilogs_dir = $ destion_dir/logSif [! -d $ logs_dir]; Dann mkdir $ logs_dirfistdout_file = $ logs_dir/stdout.logjava_opts = "-djava.awt.headless = true -djava.net.preferipv4stack = true" java_debug_opts = "wenn [" $ 1 "=" = "=" = "=" = " dann java_debug_opts = "-xdebug -xnoagent -djava.compiler = none -xrunjdwp: transport = dt_socket, adressierung = 8000, server = y, suspend = n" fijava_jmx_opts = "" Wenn ["$ 1" = "=" = "=" = "=" dann java_jmx_opts = "-dcom.sun.management.jmxremote.port = 1099 -dcom.sun.Management.jmxremote.ssl = false -dcom.sun.Management.jmxremote.Authenticate = false" fijava_mem_mem_opts = "" bits grep -i 64 -bit`if [-n "$ bit"]; dann java_mem_opts = "-server -Xx: largePageSizeInBytes = 128m -xx:+UsefastAccessorTheTethods -xx:+usecmSinitiatingoccupancyonly -xx: -Xx: SurvivorRatio = 2 -xx:+UseParallelGC "ficonfig_files =" -dlogging.Path = $ logs_dir -dlogging $ Java_opts $ java_mem_opts $ java_debug_opts $ java_jmx_opts $ config_files -jar $ destion_dir/lib/$ jar_name> $ STDOut_file 2> & 1 & count = 0whe [$ count -lt 1]; do echo -e "./c" schlaf 1 wenn [-n "$ server_port"]; dann count = `netstat -an | grep $ server_port | wc -l` sonst count = `ps -f | Grep Java | Grep "$ darga_dir" | awk '{print $ 2}' | wc -l` fi if [$ count -gT 0]; Dann brechen Sie Fidoneecho "OK!" Pids = `ps -f | Grep Java | Grep "$ darga_dir" | awk '{drucken $ 2}' `echo" pid: $ pids "echo" stdout: $ stdout_file "Skript verwendete Fall:# starten Sie die Anwendung. $ 0`bin_dir = `pwd`cd ..Deploy_dir =` pwd`conf_dir = $ deploy_dir/configServer_name = $ deploy_dirpids = `ps -f | Grep Java | grep "$ conf_dir" | awk '{print $ 2}' `if [-z" $ pids "]; Dann echo "Fehler: Der $ server_name begann nicht!" beenden 1fiif ["$ 1"! = "überspringen"]; dann $ bin_dir/Dump.Shfiecho -e "Stoppen Sie den $ server_name .../c" für PID in $ pids; Töte $ pid> /dev /null 2> & 1DoneCount = 0Was [$ count -lt 1]; do echo -e "./c" sleep 1 count = 1 für pid in $ pids; do pid_exist = `ps -f -p $ pid | grep java` if [-n "$ pid_exist"]; Dann count = 0 break fi doneoneecho "OK!" echo "pid: $ pids"Startskript für Windows -Umgebung:
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"" == ""debug"" ( set DEBUG_OPTS= -Xloggc: ../ logs/gc.log -verbose: gc -xx:+printgcdetails -xx:+heapdumponoutofMemoryError -xx: heapdumppath = ../logs goto debug) set jmx_opts = if "%1" = "==" JMX "(" ("(" JMX "(" ("(" JMX "(" ("(" JMX "(" ("(" JMX "(" ("(" JMX "(" ("(" JMX "(" ("(" JMX "(" ("(" == "JMX" "(" -Dcom.sun.management.jmxremote -dcom.sun.management.jmxremote.port = 9888 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.Management.jmxremote.Authenticate = false goto jmx) acho "start der %app_name" java- -Xmx512m -server%debug_opts%%JMX_OPTS%%config%-Jar ../lib/%app_name%goto End: debugecho "debugg" java -xms512m -xmx512m -server%debug_opts%%%ig%-Jar. -Xms512m -xmx512m -server%JMX_OPTS%%config%-Jar ../lib/%app_name%Goto End: EndPauseFür verschiedene Springboot -Projekte müssen Sie das Skript nur angemessen ändern. Um Platz zu sparen, werde ich hier keine anderen Skripte auflisten. Sie können sich auf die Demo beziehen, die ich eingereicht habe: https://github.com/shalousun/springboot-vue.git
Hinweis: Das obige Skript wird von Dubbo Official verwiesen. Tatsächlich ähnelt es auch der leichten Konstruktion von Dubbo -Projekten.
4. Log Pfadverarbeitung nach der Verpackung
In der Abbildung im zweiten Abschnitt können Sie feststellen, dass die verpackten Anwendungsprotokolle im Allgemeinen in das Protokollverzeichnis ausgegeben werden. Für verschiedene Systemplattformen, obwohl die konfigurierten Log -Ausgangswege gleich sind, werden sie möglicherweise am Ende möglicherweise nicht unbedingt an die Protokolle ausgegeben. Nach dem Testen ist es kein Problem, relative Protokollpfade in der Windows -Plattform zu verwenden. Daher wird empfohlen, absolute Pfade in der Linux -Plattform zu schreiben. Setzen Sie jedoch im von mir bereitgestellten Skript den Pfad zum Ausgabebodell fest
-Dlogging.Path = ../logs
Wenn Sie die leistungsstarke Parsing -Fähigkeit von log4j2 kombinieren, können Sie den Protokollweg von log42 festlegen:
<Eigenschaft name = "log_home"> $ {sys: logging.path} </property>Das Zugriffsprotokoll für Springboot -Anwendungen scheint jedoch nur absolute Pfade unter Linux zu verwenden.
# Server ConfigServer: Port: 8080 Totow: AccessLog: Aktiviert: TRUE DIR:/usr/xxx/logSlogging: Pfad:/usr/xxx/logs
Natürlich können Schüler, die Konfiguration verwenden, um das Problem später zu lösen, sie daran erinnern, sie zu korrigieren.
Zusammenfassen:
Dieser Plan selbst bringt nichts Neues, und die meisten Skripte werden auf Dubbos offizielle Skripte verwiesen, aber sie haben einige Verbesserungen vorgenommen. Der wichtige Punkt ist jedoch, wie Sie über den Service und die Engineering nachdenken, um diese Technologie auf der Grundlage der tatsächlichen technischen Anwendungsszenarien zu verwenden.
Das oben oben ist die vom Editor eingeführte Springboot Assemble-basierte Serviceverpackungslösung. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!