Aplicativo de inicialização Spring como um serviço
1. Visão geral
Este artigo explora algumas opções de execução de aplicativos Spring Boot como um serviço.
Em primeiro lugar, explicaremos as opções de empacotamento e os serviços do sistema de aplicativos da web. Nas seções subseqüentes, exploraremos diferentes alternativas que temos ao configurar um serviço para sistemas baseados em Linux e Windows.
Por fim, concluiremos com algumas referências a fontes adicionais de informação.
2. Configuração do projeto e instruções de construção
2.1. Embalagem
Os aplicativos da Web são tradicionalmente empacotados como um arquivo de aplicativo da Web (WAR) e implantados em um servidor da web.
Os aplicativos Spring Boot podem ser empacotados como arquivos WAR e JAR. O último incorpora um servidor da web em um arquivo JAR, que permite executar aplicativos sem a necessidade de instalação e configuração de um servidor de aplicativos.
2.2. Configuração do Maven
Vamos começar definindo a configuração do nosso arquivopom.xml:
jar
org.springframework.boot
spring-boot-starter-parent
1.4.0.RELEASE
....
org.springframework.boot
spring-boot-maven-plugin
true
A embalagem deve ser definida comojar. Estamos usando a versão estável mais recente do Spring Boot no momento da redação, mas qualquer versão após a 1.3 será suficiente. Você pode encontrar mais informações sobre as versões disponíveishere.
Observe que definimos o parâmetro<executable> paratrue para o artefatospring-boot-maven-plugin. Isso garante que um arquivoMANIFEST.MF seja adicionado ao pacote JAR. Este manifesto contém uma entradaMain-Class que especifica qual classe define o método principal para seu aplicativo.
2.3. Construindo Seu Aplicativo
Execute o seguinte comando dentro do diretório raiz do seu aplicativo:
$ mvn clean package
O arquivo JAR executável agora está disponível no diretóriotarget e podemos iniciar o aplicativo executando o seguinte comando na linha de comando:
$ java -jar your-app.jar
Neste ponto, você ainda precisa chamar o interpretador Java com a opção-jar. Há muitos motivos pelos quais seria preferível iniciar o aplicativo ao invocá-lo como um serviço.
3. No Linux
Para executar um programa como um processo em segundo plano, poderíamos simplesmente usar o comandonohup Unix, mas também não é a forma preferida por vários motivos. Uma boa explicação é fornecida nestethread.
Em vez disso, vamosdaemonize nosso processo. No Linux, podemos escolher configurar um daemon com um scriptSystem V init tradicional ou com um arquivo de configuraçãoSystemd. O primeiro é tradicionalmente a opção mais conhecida, mas está sendo gradualmente substituído pelo segundo.
Você pode encontrar mais detalhes sobre essa diferençahere.
Para maior segurança, primeiro criamos um usuário específico para executar o serviço e alteramos as permissões de arquivo JAR executável de acordo:
$ sudo useradd example
$ sudo passwd example
$ sudo chown example:example your-app.jar
$ sudo chmod 500 your-app.jar
3.1. System V Init
Um arquivo JAR executável do Spring Boot facilita o processo de configuração do serviço:
$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app
O comando acima cria um link simbólico para o seu arquivo JAR executável. Você deve usar o caminho completo para o arquivo JAR executável, caso contrário, o link simbólico não funcionará corretamente. Este link permite iniciar o aplicativo como um serviço:
$ sudo service your-app start
O script suporta os comandos de serviço padrãostart,stop,restartestatus. Além disso:
-
ele inicia os serviços em execução no usuárioexample que acabamos de criar
-
ele rastreia o ID do processo do aplicativo em/var/run/your-app/your-app.pid
-
ele grava logs de console em/var/log/your-app.log, que você pode querer verificar caso seu aplicativo falhe ao iniciar corretamente
3.2. Systemd
A configuração do serviçosystemd também é muito simples. Em primeiro lugar, criamos um script chamadoyour-app.service usando o exemplo a seguir e o colocamos no diretório/etc/systemd/system:
[Unit]
Description=A Spring Boot application
After=syslog.target
[Service]
User=example
ExecStart=/path/to/your-app.jar SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Lembre-se de modificar os camposDescription,UsereExecStart para corresponder ao seu aplicativo. Você também deve executar os comandos de serviço padrão mencionados anteriormente.
Ao contrário da abordagemSystem V init descrita na seção anterior, o arquivo de ID do processo e o arquivo de log do console devem ser configurados explicitamente usando campos apropriados no script de serviço. Uma lista exaustiva de opções pode ser encontradahere.
3.3. Subir na vida
Upstart é um gerenciador de serviços baseado em eventos, uma possível substituição paraSystem V init que oferece mais controle sobre o comportamento dos diferentes daemons.
O site tem bonssetup instructions que devem funcionar com quase todas as distribuições Linux. Ao usar o Ubuntu, provavelmente você já o tem instalado e configurado (verifique se há algum trabalho com um nome começando com “upstart” em/etc/init).
Criamos um jobyour-app.conf para iniciar nosso aplicativo Spring Boot:
# Place in /home/{user}/.config/upstart
description "Some Spring Boot application"
respawn # attempt service restart if stops abruptly
exec java -jar /path/to/your-app.jar
Agora execute "start your-app" e seu serviço será iniciado.
O Upstart oferece muitas opções de configuração de trabalho, você pode encontrar a maioria delashere.
4. No Windows
Nesta seção, apresentamos algumas opções que podem ser usadas para executar um Java JAR como um serviço do Windows.
4.1. Wrapper de Serviço do Windows
Devido a dificuldades com a licença GPL deJava Service Wrapper (consulte a próxima subseção) em combinação com, por exemplo, a licença MIT do Jenkins, o projetoWindows Service Wrapper, também conhecido comowinsw, foi concebido.
Winsw fornece meios programáticos para instalar / desinstalar / iniciar / parar um serviço. Além disso, ele pode ser usado para executar qualquer tipo de executável como serviço no Windows, enquanto o Java Service Wrapper, como está implícito no nome, suporta apenas aplicativos Java.
Primeiro, você baixa os binárioshere. Em seguida, o arquivo de configuração que define nosso serviço do Windows,MyApp.xml, deve ter a seguinte aparência:
MyApp
MyApp
This runs Spring Boot as a Service.
java
-Xmx256m -jar "%BASE%\MyApp.jar"
rotate
Finalmente, você deve renomearwinsw.exe paraMyApp.exe para que seu nome corresponda ao arquivo de configuraçãoMyApp.xml. Depois disso, você pode instalar o serviço da seguinte maneira:
$ MyApp.exe install
Da mesma forma, você pode usaruninstall,start,stop, etc.
4.2. Wrapper de serviço Java
Caso você não se importe com o licenciamento GPL do projetoJava Service Wrapper, esta alternativa pode atender às suas necessidades de configurar seu arquivo JAR como um serviço do Windows da mesma forma. Basicamente, o Java Service Wrapper também requer que você especifique em um arquivo de configuração que especifique como executar seu processo como um serviço no Windows.
This article explica de forma muito detalhada como configurar a execução de um arquivo JAR como um serviço no Windows, para que não haja necessidade de repetir as informações.
5. Referências adicionais
Os aplicativos Spring Boot também podem ser iniciados como serviço do Windows usandoProcrun do projetoApache Commons Daemon. Procrun é um conjunto de aplicativos que permite aos usuários do Windows agrupar aplicativos Java como serviços do Windows. Esse serviço pode ser configurado para iniciar automaticamente quando a máquina inicializar e continuará sendo executado sem que nenhum usuário esteja conectado.
Mais detalhes sobre como iniciar aplicativos Spring Boot no Unix podem ser encontradoshere. Também existem instruções detalhadas sobre como modificar sistemas baseados emSystemd unit files for Redhat. Finalmente
Finalmente,this quick howto descreve como incorporar um script Bash em seu arquivo JAR, para que ele se torne um executável!
6. Conclusão
Os serviços permitem que você gerencie o estado do seu aplicativo com muita eficiência e, como vimos, a configuração do serviço para aplicativos Spring Boot agora está mais fácil do que nunca.
Lembre-se de seguir as medidas de segurança simples e importantes sobre as permissões de usuário para executar seu serviço.