Aplicativo de inicialização Spring como um serviço

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.