Antes de usar el ensamblaje para empaquetar proyectos de microservicios SpringBoot, me gustaría hablar sobre varios métodos de implementación comunes para proyectos Springboot en la actualidad.
Use Contenedores de Docker para implementar, cree la aplicación de SpringBoot en una imagen de Docker y luego inicie la imagen a través del contenedor. Este método es muy conveniente cuando se necesitan aplicaciones a gran escala y extensiones de aplicaciones. Es una solución actual de implementación de nivel industrial, pero requiere dominar la tecnología del ecosistema Docker.
Use FatJar para implementar y comenzar directamente, que es un método de implementación de aplicaciones simple para muchos principiantes o situaciones de muy pequeña escala.
Este artículo proporciona principalmente una solución de empaque más amigable para el segundo método de implementación, que es facilitar la gestión de la implementación. El primer método se puede escribir en mi blog en el futuro.
1. ¿Por qué se debe empaquetar Springboot en el servicio?
Recientemente vi un equipo de proyecto. Utilizaron SpringBoot para desarrollar el proyecto y construir interacciones con el equipo de operación y mantenimiento, que es un boot de primavera Fatjar. Además, este paquete original es indudablemente muy fatal para el personal de operación y mantenimiento en las empresas tradicionales de desarrollo de proyectos. Después de entregar el proyecto, todo el archivo de configuración está oculto en el JAR, y modificar el archivo de configuración para diferentes entornos se convierte en algo muy difícil. Por lo tanto, cuando presentamos cualquier tecnología nueva en la empresa, debemos considerar cómo estar orientados a servicios e ingeniería. Si solo nos referimos al marco técnico, es posible que solo necesitemos agregar algunas dependencias, y leer la API y escribir algunas líneas de código para ejecutar.
Para abordar los problemas anteriores, debemos estar orientados a los servicios y orientados a la ingeniería, y necesitamos resolver aproximadamente dos problemas:
Habilite SpringBoot para cargar archivos de configuración fuera del jar.
Proporcione un script de inicio basado en servicios, que generalmente es un shell o bate debajo de las ventanas. Con el script de servicio de aplicaciones de SpringBoot, puede iniciar y detener las aplicaciones SpringBoot.
2. Diagrama de estructura de aplicación SpringBoot empaquetado
Aquí primero miramos las representaciones después de usar el ensamblaje para empacar el servicio SpringBoot.
3. Pasos importantes para el embalaje de servicio
A continuación se muestran los pasos detallados para empacar brotingboot.
3.1 Agregar complemento de paquete de ensamblaje
<glugin> <artifactid> maven-assembly-plugin </artifactid> <verSerse> 3.0.0 </versión> <figuration> <Edcriptors> <Scriptor> src/main/main/ensamblajy.xml </scriptor> </descriptores> </fassion> <passion> <secution> <secution> <dembly </id> </id> <base> <OTO> Single </meta> </metas> </secution> </ejecutions> </tugin>
Desde el código anterior, he puesto la configuración de ensamblaje en el directorio principal. Este es un hábito, y no puedes ponerlo aquí. Aquí hay un diagrama de estructura general del ensamblaje en el proyecto:
3.2 ensamblaje.xml Configuración
La configuración del ensamblaje es similar a la siguiente configuración, que no es más que scripts de servicio de empaque, frascos, archivos de configuración, etc. A partir del siguiente código, encontrará que el ensamblaje ha escrito el archivo de configuración en config.
<Samblay> <Did> 1.0 </id> <formats> <format> tar.gz </format> </formats> <silingetset> <silset> <silingset> <sirectory> src/main/ensamblajes/bin </sirectory> <eutenDirectory> bin </outputdirectory> <filemode> 07555 </silemode> </sileset> <seutenSet> <Directory> src/main/ensamblaje/config </sirectory> <OutputDirectory> config </outputDirectory> <filemode> 0644 </filemode> </silreset> <silset> <sirectory> target </sirectory> <utedDirectory> lib </outputdirectory> <incluye> <incluido>*. <Directory> Src/Main/Resources </Directory> <OutputDirectory> Logs </outputDirectory> <SilEmode> 0755 </silemode> <excludes> <exclude> **/*</exclude> </excudes> </silingset> </silingets> </sambley>
3.3 Scripts de servicio de redacción
Ahora escriba scripts para el entorno Linux.
El primero: start.sh startup script
#!/bin/bashserver_name = 'spring-vue'# jar name jar_name = 'springboot-vue.jar'cd `dirname $ 0`bin_dir =` pwd`cd ..deploy_dir = `pwd`conf_dir = $ implement_dir/config# server_port =` sed '/server.port/!d;s/.*=//' config/Application.Properties | tr -d '/r'`# Obtenga el número de puerto de la aplicación servidor_port = `sed -nr'/puerto: [0-9]+/s /.* puerto:+([0-9]+).*// 1/p 'config/application.yml`pids =` ps -f | Grep Java | Grep "$ conf_dir" | awk '{imprimir $ 2}' `if [" $ 1 "=" estado "]; Entonces si [-n "$ pids"]; Entonces se eco "el $ server_name se está ejecutando ...!" echo "pid: $ pids" salga 0 else echo "el $ server_name se detiene" salida 0 fifiif [-n "$ pids"]; Entonces Echo "Error: ¡$ server_name ya se inició!" echo "PID: $ pids" Salir 1fiif [-n "$ server_port"]; Entonces server_port_count = `netstat -tln | GREP $ server_port | wc -l` if [$ server_port_count -gt 0]; luego echo "Error: el puerto $ server_name $ server_port ya utilizado!" Salir 1 Fifilogs_Dir = $ implement_dir/logsif [! -d $ logs_dir]; Entonces mkdir $ logs_dirfistdout_file = $ logs_dir/stdout.logjava_opts = "-djava.awt.headless = true -djava.net.preferipv4stack = true" java_debug_opts = "" if ["$ 1" = "debug"];; Entonces java_debug_opts = "-xdebug -xnoagent -djava.compiler = none -xrunjdwp: transport = dt_socket, dirección = 8000, servidor = y, suspend = n" fiJava_jmx_opts = "if [" $ 1 "=" jmx "]; Entonces java_jmx_opts = "-dcom.sun.management.jmxremote.port = 1099 -dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = false" fiJava_mem_opts = "" "bits =` java -version 2> & 1 | Grep -i 64 bit`if [-n "$ bits"]; then JAVA_MEM_OPTS=" -server -Xmx512m -Xms512m -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -Xx: grandePageSizeInbytes = 128m -xx:+UseFastAccessormethods -xx:+useCmsinitiatingCupancyOnly -xx: cMsinitiatingCupancyFraction = 70 "más java_mem_opts =" -server -xms512m -xmx512m -xx: Permsize = 128M -Xx: superviviveRatio = 2 -xx:+useParallElgc "ficonfig_files =" -dlogging.path = $ logs_dir -dlogging.config = $ conf_dir/log4j2.xml -dspring.config.location = $ conf_dir/application.properties "echo -e" iniciando el $ servidor ... "..." "" $ Java_opts $ java_mem_opts $ java_debug_opts $ java_jmx_opts $ config_files -jar $ implement_dir/lib/$ jar_name> $ sTdout_file 2> & 1 & count = 0while [$ count -lt 1]; hacer echo -e "./c" dormir 1 if [-n "$ server_port"]; entonces count = `netstat -an | GREP $ server_port | wc -l` else count = `ps -f | Grep Java | GREP "$ implement_dir" | Awk '{imprimir $ 2}' | wc -l` fi if [$ count -gt 0]; Luego rompa Fidoneeco "¡OK!" PIDS = `PS -F | Grep Java | GREP "$ implement_dir" | AWK '{imprimir $ 2}' `echo" pid: $ pids "echo" stdout: $ stdout_file "Caso de uso de script:# Iniciar la aplicación $ 0`bin_dir = `pwd`cd ..deploy_dir =` pwd`conf_dir = $ implement_dir/configServer_name = $ implement_dirpids = `ps -ef | Grep Java | Grep "$ conf_dir" | awk '{imprimir $ 2}' `if [-z" $ pids "]; Entonces ECHO "Error: ¡$ server_name no se inicia!" Salir 1fiif ["$ 1"! = "Skip"]; Entonces $ bin_dir/dump.shfiecho -e "deteniendo el $ server_name .../c" para pid en $ pids; do kill $ pid> /dev /null 2> & 1donecount = 0 while [$ count -lt 1]; hacer echo -e "./c" dormir 1 recuento = 1 para pid en $ pids; do pid_exist = `ps -f -p $ pid | Grep Java` if [-n "$ pid_exist"]; Entonces cuenta = 0 Break Fi DoneOneeco "¡Ok!" echo "pid: $ pids"Script de inicio para el entorno de 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 "" == "" (set debug_opts = -Xloggc: ../ logs/gc.log -verbose: gc -xx:+printgcdetails -xx:+hoispDumponouToFMemoryError -xx: hedisppath = ../logs goto debug) set jmx_opts = si ""%1 "" == "" "JMX" (set jmx_opts = -Dcom.sun.management.jmxremote -dcom.sun.management.jmxremote -Xmx512m -server%debug_opts%%jmx_opts%%config%-jar ../lib/%app_name%goto End: debugeCo "debug" java -xms512m -xmx512m -server%debug_opts%config%-JAR ../lib/%app_name%GOTO -Xms512m -xmx512m -server%jmx_opts%%config%-jar ../lib/%app_name%goto End: endpause
Para diferentes proyectos SpringBoot, solo necesita modificar el script de manera adecuada. Para ahorrar espacio, no enumeraré otros scripts aquí. Puede consultar la demostración que envié: https://github.com/shalousun/springboot-vue.git
Nota: El script anterior se hace referencia desde el funcionario de Dubbo. De hecho, también es similar a la construcción ligera de proyectos Dubbo.
4. Procesamiento de ruta de registro después del embalaje
En la figura de la segunda sección, puede ver que los registros de aplicaciones empaquetados generalmente se emiten al directorio de registros. Sin embargo, para diferentes plataformas del sistema, aunque las rutas de salida de registro configuradas son las mismas, es posible que no necesariamente se emitan a los registros al final. Después de las pruebas, no es un problema usar rutas de registro relativas en la plataforma de Windows ./ registros, pero para usar rutas relativas en los sistemas Linux, no se puede emitir a los registros. Por lo tanto, se recomienda escribir rutas absolutas en la plataforma Linux. Sin embargo, en el script que proporcioné, establezca la ruta en el registro de salida
-Dlogging.path = ../logs
Por lo tanto, combinando la poderosa capacidad de análisis de LOG4J2, puede establecer la ruta log de log42:
<propiedad name = "log_home"> $ {sys: logging.path} </Property>Sin embargo, el registro de acceso para aplicaciones SpringBoot parece solo usar rutas absolutas en Linux.
# Servidor ConfigServer: Port: 8080 Untow: AccessLog: Habilitado: verdadero dir:/usr/xxx/logslogging: ruta:/usr/xxx/logs
Por supuesto, los estudiantes que usan la configuración para resolver el problema más tarde pueden recordarles que los corregen.
Resumir:
Este plan en sí no trae nada nuevo, y la mayoría de los guiones se hacen referencia a los guiones oficiales de Dubbo, pero han hecho algunas mejoras en él. Pero el punto importante es cómo pensar en el servicio y la ingeniería necesarios para usar esta tecnología en función de los escenarios de aplicaciones técnicas reales.
Lo anterior es la solución de envasado de servicio basada en el ensamblaje de SpringBoot introducida por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!