Avant d'utiliser l'assemblage pour emballer les projets de microservices Springboot, je voudrais parler de plusieurs méthodes de déploiement courantes pour les projets Springboot à l'heure actuelle.
Utilisez des conteneurs Docker pour déployer, créez l'application de Springboot dans une image Docker, puis démarrez l'image via le conteneur. Cette méthode est très pratique lorsque des applications à grande échelle et des extensions d'application sont nécessaires. Il s'agit d'une solution de déploiement actuelle de niveau industriel, mais elle nécessite de maîtriser la technologie de l'écosystème Docker.
Utilisez Fatjar pour déployer et démarrer directement, ce qui est une méthode de déploiement d'application simple pour de nombreux débutants ou des situations à très petite échelle.
Cet article fournit principalement une solution d'emballage plus conviviale pour la deuxième méthode de déploiement, qui consiste à faciliter la gestion du déploiement. La première méthode peut être écrite dans mon blog à l'avenir.
1. Pourquoi Springboot devrait-il être emballé en service?
Récemment, j'ai vu une équipe de projet. Ils ont utilisé Springboot pour développer le projet et construire des interactions à l'équipe de fonctionnement et de maintenance, qui est un Spring Boot Fatjar. De plus, ce package original est sans aucun doute très mortel pour le personnel de fonctionnement et de maintenance dans les sociétés de développement de projets traditionnelles. Une fois le projet livré, l'ensemble du fichier de configuration est masqué dans le pot et modifier le fichier de configuration pour différents environnements devient une chose très difficile. Par conséquent, lorsque nous introduisons toute nouvelle technologie dans l'entreprise, nous devons considérer comment être axé sur le service et l'ingénierie. Si nous nous référons uniquement au cadre technique, nous n'aurons peut-être besoin que d'ajouter quelques dépendances, et de lire l'API et d'écrire quelques lignes de code à exécuter.
Pour résoudre les problèmes ci-dessus, nous devons être orientés vers le service et axé sur l'ingénierie, et nous devons résoudre à peu près deux problèmes:
Activez le Springboot de charger des fichiers de configuration à l'extérieur du pot.
Fournissez un script de démarrage basé sur le service, qui est généralement un shell ou une batte sous Windows. Avec le script de service d'application de Springboot, vous pouvez démarrer et arrêter les applications Springboot.
2. Diagramme de structure d'application Springboot emballée
Ici, nous examinons d'abord les rendus après avoir utilisé l'assemblage pour emballer le service Springboot.
3. Étapes importantes pour l'emballage de service
Vous trouverez ci-dessous les étapes détaillées pour l'emballage Springboot.
3.1 Ajouter un plugin de package d'assemblage
<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> <tobjectif> Single </ but> </ buts> </ exécution> </Executions> </gingin>
À partir du code ci-dessus, j'ai mis la configuration d'assemblage dans le répertoire principal. C'est une habitude, et vous ne pouvez pas le mettre ici. Voici un schéma de structure générale de l'assemblage dans le projet:
3.2 Configuration Assembly.xml
La configuration de l'assemblage est similaire à la configuration suivante, qui n'est rien de plus que des scripts de service, des pots, des fichiers de configuration, etc. À partir du code suivant, vous constaterez que l'assemblage a tapé le fichier de configuration sous configuration.
<sembly> <id> 1.0 </ id> <formats> <format> tar.gz </format> </ Formats> <FigeSets> <Ficeset> <pichageSed> <Affecter> SRC / Main / Assembly / bin </ Directory> <OutputDirectory> Bin </ outputDirectory> <FileMode> 0755 </deleMode> <Arylowing> Src / Main / Assembly / Config </ Directory> <OutputDirectory> Config </utputDirectory> <FileMode> 0644 </ FileMode> </FichierSed> <FigeSeT> <Ar répertoire> Target </ Directory> <OutputDirectory> lib </putputdirectory> <clustred> <clut> *. <Arnutory> SRC / Main / Resources </ Directory> <OutputDirectory> Logs </utputDirectory> <FileMode> 0755 </ FileMode> <cluses> <cusclude> ** / * </ exclure> </cluses> </ fileset> </ Fileset> </sembly>
3.3 Scripts de service d'écriture
Écrivez maintenant des scripts pour l'environnement Linux.
Le premier: Script de démarrage de démarrage.sh
#! / bin / bashServer_name = 'spring-vue' # name jar jar_name = 'springboot-vue.jar'cd `dirname $ 0`bin_dir =` pwd`cd ..deploy_dir = `pwd`conf_dir = $ deploy_dir / config # server_port =` sed_dir '/server.port/!d ;s/.*=//' config / application.properties | tr -d '/ r'` # Obtenez le numéro de port de l'application 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 "]; alors si [-n "$ pids"]; Puis écho "Le nom $ server_name est en cours d'exécution ...!" echo "pid: $ pids" exit 0 else echo "le $ server_name est arrêté" exit 0 fiFiif [-n "$ pids"]; Ensuite, ECHO "ERREUR: Le nom $ server a déjà commencé!" echo "pid: $ pids" exit 1fiif [-n "$ server_port"]; alors server_port_count = `netstat -tln | grep $ server_port | wc -l` if [$ server_port_count -gt 0]; puis écho "Erreur: le port $ server_name $ server_port déjà utilisé!" Exit 1 fibiloGS_DIR = $ DEPLOY_DIR / LOGSIF [! -d $ logs_dir]; puis mkdir $ logs_dirfistdout_file = $ logs_dir / stdout.logjava_opts = "-djava.awt.headless = true -djava.net.preferipv4stack = true" java_debug_opts = "" if ["1" = "debug"]; puis java_debug_opts = "-xdebug -xnoagent -djava ....nom -xrunjdwp: transport = dt_socket, adresse = 8000, server = y, suspendre = n" fijava_jmx_opts = "" if ["1" = "jmx"]; puis java_jmx_opts = "-dcom.sun.management.jmxremote.port = 1099 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxRemote.Authenticiate = false" fijava_mem_opts = "" bits = `java -version 2> & 1 | grep -i 64 bits`if [-n "$ bits"]; puis java_mem_opts = "-server -xmx512m -xms512m -xmn256m -xx: permsize = 128m -xss256k -xx: + disablexplicitgc -xx: + usecConcMarksweepgc -xx: + cmsparalleMarkenabled -xx: + usecmorpatricelcolleg -Xx: GrandPageSizeInBytes = 128m -xx: + usefastAccessorMethods -xx: + usecmsInitiatingoCcupancyOnly -xx: cmsInitiatingoccupancyFraction = 70 "else java_mem_opts =" -server -xms512m -xmx512m -xx: permsize = 128m -Xx: SurvivorRatio = 2 -xx: + useParallegc "fciconfig_files =" -dlogging.path = $ logs_dir -dlogging.config = $ conf_dir / log4j2.xml -dspring.config.location = $ conf_dir / application.properties "echo -e" Démarrage du $ serveur ... "noHup Java" Echo -e " $ Java_opts $ java_mem_opts $ java_debug_opts $ java_jmx_opts $ config_files -jar $ deploy_dir / lib / $ jar_name> $ stdout_file 2> & 1 & count = 0 whel [$ count -lt 1]; faire echo -e "./c" sleep 1 if [-n "$ server_port"]; puis compter = `netstat -an | grep $ server_port | wc -l` else count = `ps -f | grep java | grep "$ deploy_dir" | awk '{print $ 2}' | wc -l` fi if [$ count -gt 0]; puis brisez FidOneecho "OK!" Pids = `ps -f | grep java | grep "$ deploy_dir" | awk '{imprimer $ 2}' `echo" pid: $ pids "echo" stdout: $ stdout_file "Case d'utilisation du script: # start the application./start.sh# Démarrer en mode de débogage./Start Debug # Démarrer la tâche et démarrer JMX Monitoring./start jmx # Obtenez l'état de la course actuel. $ 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 "]; Ensuite, ECHO "ERREUR: le $ Server_name ne démarre pas!" exit 1fiif ["1 $"! = "skip"]; puis $ bin_dir / vidage.shfiecho -e "Arrêter le $ server_name ... / c" pour pid in $ pids; Do Kill $ pid> / dev / null 2> & 1DONECOUNT = 0 WHED [$ COUNT -LT 1]; faire echo -e "./c" sommeil 1 Count = 1 pour PID dans $ pids; do pid_exist = `ps -f -p $ pid | grep java` if [-n "$ pid_exist"]; puis compter = 0 Break fi DoneOneecho "OK!" Echo "Pid: $ pids"Script de démarrage pour l'environnement 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 ""% "" "" debug "" (set debug_opts = -Xloggc: ../ logs / gc.log -verbose: gc -xx: + printgcdetails -xx: + heapdumponoutofMemoryError -xx: heapDumpPath = .. -Dcom.sun.management.jmxremote -dcom.sun.management.jmxRemote.port = 9888 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.autenticiate = false goto jmx) echo "démarrant le% app_name%" -Xmx512m -server% debug_opts% jmx_opts%% config% -jar ../lib/%App_name%goto end: debugecho "debug" java -xms512m -xmx512m -server% debug_opts% config% -jar ../lib/%App_name%goto end: jmxjar ../lib/%App_ -XMS512M -XMX512M -SERVER% JMX_OPTS%% Config% -jar ../lib/%App_name%goto end: endpause
Pour différents projets Springboot, il vous suffit de modifier le script de manière appropriée. Afin d'économiser de l'espace, je ne répertorierai pas d'autres scripts ici. Vous pouvez vous référer à la démo que j'ai soumise: https://github.com/shalousun/springboot-vue.git
Remarque: Le script ci-dessus est référencé par le fonctionnaire de Dubbo. En fait, il est également similaire à la construction légère des projets de Dubbo.
4. Traitement du chemin du journal après emballage
Dans la figure de la deuxième section, vous pouvez voir que les journaux d'application emballés sont généralement sortis dans le répertoire des journaux. Cependant, pour différentes plates-formes système, bien que les chemins de sortie du journal configurés soient les mêmes, ils ne peuvent pas nécessairement être sortis dans les journaux à la fin. Après les tests, il n'est pas possible d'utiliser des chemins de journal relatifs dans la plate-forme Windows ../ journaux, mais pour utiliser des chemins relatifs dans les systèmes Linux, il ne peut pas être sorti en journaux. Par conséquent, il est recommandé d'écrire des chemins absolus dans la plate-forme Linux. Cependant, dans le script que j'ai fourni, définissez le chemin d'accès au journal de sortie
-Dlogging.path = .. / journaux
Par conséquent, combinant la puissante capacité d'analyse de Log4j2, vous pouvez définir le chemin de journal de Log42:
<propriété name = "log_home"> $ {sys: logging.path} </ propriété>Cependant, le journal d'accès pour les applications Springboot ne semble utiliser que des chemins absolus sous Linux.
# Server configServer: Port: 8080 UnderTow: AccessLog: Activé: true dir: / usr / xxx / logslogging: path: / usr / xxx / logs
Bien sûr, les étudiants qui utilisent la configuration pour résoudre le problème plus tard peuvent leur rappeler de les corriger.
Résumer:
Ce plan lui-même n'apporte rien de nouveau, et la plupart des scripts sont référencés aux scripts officiels de Dubbo, mais ils ont apporté quelques améliorations à ce sujet. Mais le point important est de savoir comment réfléchir au service et à l'ingénierie nécessaire pour utiliser cette technologie en fonction des scénarios d'application technique réels.
Ce qui précède est la solution d'emballage de service basée sur l'assemblage Springboot introduit par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!