Antes de usar a montagem para empacotar projetos de microsserviços de troca de troca, gostaria de falar sobre vários métodos de implantação comuns para projetos de troca no momento.
Use os contêineres do Docker para implantar, crie o aplicativo do Springboot em uma imagem do Docker e inicie a imagem através do contêiner. Esse método é muito conveniente quando são necessárias aplicações em larga escala e extensões de aplicativos. É uma solução atual de implantação em nível industrial, mas requer dominar a tecnologia do ecossistema do docker.
Use o Fatjar para implantar e iniciar diretamente, que é um método simples de implantação de aplicativos para muitos iniciantes ou situações de pequena escala.
Este artigo fornece principalmente uma solução de embalagem mais amigável para o segundo método de implantação, que é facilitar o gerenciamento de implantação. O primeiro método pode ser escrito no meu blog no futuro.
1. Por que o trampolim deve ser empacotado em serviço?
Recentemente, vi uma equipe de projeto. Eles usaram o Springboot para desenvolver o projeto e construir interações com a equipe de operação e manutenção, que é um fatjar de inicialização da primavera. Além disso, este pacote original é, sem dúvida, muito fatal para o pessoal de operação e manutenção em empresas tradicionais de desenvolvimento de projetos. Após a entrega do projeto, todo o arquivo de configuração está oculto no frasco e a modificação do arquivo de configuração para diferentes ambientes se torna uma coisa muito difícil. Portanto, quando introduzimos qualquer nova tecnologia na empresa, devemos considerar como ser orientado a serviços e engenharia. Se nos referirmos apenas à estrutura técnica, podemos apenas adicionar algumas dependências e ler a API e escrever algumas linhas de código para ser executadas.
Para resolver os problemas acima, precisamos ser orientados para o serviço e orientados a engenharia, e precisamos resolver aproximadamente dois problemas:
Ative o Springboot para carregar arquivos de configuração fora do frasco.
Forneça um script de inicialização baseado em serviço, que geralmente é uma concha ou morcego sob o Windows. Com o script de serviço do aplicativo do Springboot, você pode iniciar e interromper os aplicativos de troca de springboot.
2. Diagrama de estrutura de aplicação de trampolim embalado
Aqui, examinamos as renderizações depois de usar o Assembly para empacotar o serviço de trampolim.
3. Etapas importantes para a embalagem de serviço
Abaixo estão as etapas detalhadas para embalar Springboot.
3.1 Adicionar plug -in de pacote de montagem
<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> <Cetes> <Goal> Único </ac Goal> </metas> </secution> </conformions> </flugin>
A partir do código acima, coloquei a configuração de montagem no diretório principal. Este é um hábito, e você não pode colocá -lo aqui. Aqui está um diagrama de estrutura geral da montagem no projeto:
3.2 Configuração do Assembly.xml
A configuração da montagem é semelhante à configuração a seguir, o que nada mais é do que scripts de serviço de embalagem, frascos, arquivos de configuração etc. No código a seguir, você descobrirá que a montagem digitou o arquivo de configuração em Config.
<SuSecly> <id> 1.0 </id> <formats> <Format> Tar.gz </format> </formats> <FileTets> <FileSet> <FileSet> <Directory> src/main/assembly/bin </diretório> <putputDirectory> bin </outputory> <tomemode> </files> 075 </filmes> files </filmes> </files> <Directory> <putory> <outputDirectory> Config </itputDirectory> <FileMode> 0644 </FILEMODE> </Fileset> </fileSet> </INCLUDETION> Target </Directory> <sictDirectory> LibeTy> <///Outption> <Bregs> <bstery> jart*. <Directory> src/main/recursos </diretório> <outputDirectory> logs </outputDirectory> <filemode> 0755 </filemode> <cludes> <cclude> **/*</exclui> </exclui> </fileset> </fileslets> </Assembly>
3.3 Escrevendo scripts de serviço
Agora escreva scripts para o ambiente Linux.
O primeiro script de inicialização inicial: start.sh
#!/bin/bashserver_name = 'spring-vue'# jar nome jar_name = 'springboot-vue.jar'cd `dirname $ 0`bin_dir =` pwd`cd ..deploy_dir = `pwd`c_dir = $ deplet_dir/slim '/server.port/!d; tr -d '/r'`# Obtenha o número da porta do aplicativo server_port = `sed -nr'/porta: [0-9]+/s /.* porta:+([0-9]+). grep java | grep "$ conf_dir" | awk '{print $ 2}' `if [" $ 1 "=" status "]; então se [-n "$ pids"]; Então eco "o $ server_name está em execução ...!" eco "pid: $ pids" saída 0 else eco "o $ server_name é parado" saia 0 fifiif [-n "$ pids"]; Então eco "Erro: o $ server_name já começou!" eco "pid: $ pids" saia 1fiif [-n "$ server_port"]; então server_port_count = `netstat -tln | grep $ server_port | wc -l` se [$ server_port_count -gt 0]; Então eco "Erro: a porta $ server_name $ server_port já usada!" Saia 1 fifilogs_dir = $ implant_dir/logsif [! -d $ logs_dir]; Então mkdir $ logs_dirfistdout_file = $ logs_dir/stdout.logjava_opts = "-djava.awt.headless = true -djava.net.preferipv4stack = true" java_debug_opts = "" se ["$ 1" 1 "1" 1 "=" ingress ""; Então Java_Debug_Opts = "-xdebug -xnoagent -djava.compiler = None -xrunjdwp: transport = dt_socket, endereço = 8000, servidor = y, suspender = n" fijava_jmx_opts = "" se ["$ 1" = "JMX"]; then 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 de 64 bits`if [-n "$ bits"]; Então Java_Mem_Opts = "-server -xmx512m -xms512m -xmn256m -xx: PermSize = 128m -xss256k -xx:+desablexplicticgc -xx:+useConcmarkmarkeepGC -xx:+CMSOLLABLELY -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "else JAVA_MEM_OPTS=" -server -Xms512m -Xmx512m -XX:PermSize=128m -XX:SurvivorRatio=2 -Xx:+useparallelgc "ficonfig_files =" -dlogging.path = $ logs_dir -dlogging.config = $ conf_dir/log4j2.xml -dspring.config.Location = $ conf_dir/application.properties "eco -e" iniciando o servidor. $ Java_mem_opts $ java_debug_opts $ java_jmx_opts $ config_files -jar $ implant_dir/lib/$ jar_name> $ stdout_file 2> & 1 & count = 0while [$ contagem -lt 1]; ECHO -E "./C" Sleep 1 se [-n "$ server_port"]; então count = `netstat -an | grep $ server_port | wc -l 'else count = `ps -f | grep java | grep "$ implant_dir" | awk '{print $ 2}' | wc -l` fi se [$ count -gt 0]; Então quebre fidoneecho "OK!" PIDS = `ps -f | grep java | grep "$ implant_dir" | Awk '{print $ 2}' `echo" pid: $ pids "echo" stdout: $ stdout_file "Script Caso:# Inicie o aplicativo./start.sh# Iniciar no modo de depuração. `Dirname $ 0`bin_dir =` pwd`cd ..deploy_dir = `pwd`conf_dir = $ implant_dir/configserver_name = $ implant_dirpids =` ps -ef | grep java | grep "$ conf_dir" | awk '{print $ 2}' `if [-z" $ pids "]; Então eco "Erro: o $ server_name não começou!" saída 1fiif ["$ 1"! = "Skip"]; então $ bin_dir/dump.shfiecho -e "interrompendo o $ server_name .../c" para pid em $ pids; mate $ pid> /dev /null 2> & 1DoneCount = 0while [$ count -lt 1]; ECHO -E "./C" Sleep 1 contagem = 1 para PID em $ pids; do pid_exist = `ps -f -p $ pid | grep java` se [-n "$ pid_exist"]; Então conte = 0 quebre fi doneoneecho "OK!" eco "pid: $ pids"Script de inicialização para o ambiente do 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 = se "" "1" 1 "=location = .. "DEBUG" "= DEBUG" "= ... -Xloggc: ../ logs/gc.log -verbose: gc -xx:+printgcdetails -xx:+heapdumtonoutOfMemoryError -xx: heapdumppath = ../logs goto depur) set jmx_opts = se ""%1 "" == "" jmx "" " -Dcom.sun.management.jmxRemote -dcom.sun.management.jmxremote.port = 9888 -dcom.sun.management.jmxRemote.ssl = false -dcom.sun.management.jmxremote.authename = Falso jmx) io " -Xmx512m -server%debug_opts%JMX_OPTS%Config%-jar ../lib/Lib/App_Name%goto End: DebugeCho "DEBUG" JAVA -XMS512M -XMX512M -SERVERVERVERVERVAPUPT_OPTS%SPIG -JARLOJAR ..lmx512m -Serverver DeBup_Opts %pig -jar -Xms512m -xmx512m -Server%jmx_opts%config%-jar ../lib/%app_name%goto end: endPause
Para diferentes projetos de trampolim, você só precisa modificar o script adequadamente. Para economizar espaço, não listarei outros scripts aqui. Você pode consultar a demonstração que enviei: https://github.com/shalousun/springboot-vue.git
NOTA: O script acima é referenciado pelo oficial de Dubbo. De fato, também é semelhante à construção leve de projetos de Dubbo.
4. Processamento do caminho do log após a embalagem
Na figura na segunda seção, você pode ver que os logs de aplicativos embalados geralmente são emitidos no diretório de logs. No entanto, para diferentes plataformas do sistema, embora os caminhos de saída de log configurados sejam iguais, eles podem não ser necessariamente emitidos para os logs no final. Após o teste, não há problema em usar os caminhos de log relativos na plataforma Windows ../ logs, mas, para usar caminhos relativos nos sistemas Linux, ele não pode ser emitido para logs. Portanto, é recomendável escrever caminhos absolutos na plataforma Linux. No entanto, no script que eu forneci, defina o caminho para o log de saída
-Dlogging.path = ../logs
Portanto, combinando a poderosa capacidade de análise do log4j2, você pode definir o caminho de log do log42:
<Propriedade name = "log_home"> $ {sys: logging.path} </propriedade>No entanto, o log de acesso para aplicativos de troca parece usar apenas caminhos absolutos no Linux.
# servidor ConfigServer: Porta: 8080 Underlow: AccessLog: Habiled: true dir:/usr/xxx/logslogging: caminho:/usr/xxx/logs
Obviamente, os alunos que usam a configuração para resolver o problema mais tarde podem lembrá -los para corrigi -los.
Resumir:
Esse plano em si não traz nada de novo, e a maioria dos scripts é referenciada aos scripts oficiais de Dubbo, mas eles fizeram algumas melhorias nele. Mas o ponto importante é como pensar sobre o serviço e a engenharia necessários para usar essa tecnologia com base em cenários reais de aplicação técnica.
O acima é que a solução de embalagem de serviço baseada em montagem de trampolim é introduzida pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!