Applicazione Spring Boot come servizio

1. Panoramica

Questo articolo esplora alcune opzioni per eseguire le applicazioni Spring Boot come servizio.

In primo luogo, spiegheremo le opzioni di pacchettizzazione delle applicazioni web ei servizi di sistema. Nelle sezioni successive, esploriamo le diverse alternative che abbiamo quando configuriamo un servizio sia per Linux che per sistemi basati su Windows.

Infine, concluderemo con alcuni riferimenti a ulteriori fonti di informazione.

2. Installazione del progetto e istruzioni per la generazione

2.1. Confezione

Le applicazioni Web sono tradizionalmente pacchettizzate come archivi di applicazioni Web (WAR) e distribuite su un server Web.

Le applicazioni Spring Boot possono essere pacchettizzate sia come file WAR che come file JAR. Quest'ultimo incorpora un server web all'interno di un file JAR, che consente di eseguire applicazioni senza la necessità di un'installazione e configurazione di un server applicazioni.

2.2. Configurazione Maven

Iniziamo definendo la configurazione del nostro file pom.xml :

jar  org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE   ....     org.springframework.boot spring-boot-maven-plugin  true    

La confezione deve essere impostata su barattolo . Stiamo utilizzando l'ultima versione stabile di Spring Boot al momento della scrittura, ma qualsiasi versione successiva alla 1.3 sarà sufficiente. Puoi trovare ulteriori informazioni sulle versioni disponibili qui.

Si noti che abbiamo impostato l'estensione parametro su true per l' artefatto spring-boot-maven-plugin . Ciò assicura che un file MANIFEST.MF venga aggiunto al pacchetto JAR. Questo manifesto contiene una voce Main-Class che specifica quale classe definisce il metodo principale per l'applicazione.

2.3. Creazione della tua applicazione

Esegui il seguente comando nella directory principale dell'applicazione:

$ mvn clean package

Il file JAR eseguibile è ora disponibile nella directory di destinazione e possiamo avviare l'applicazione eseguendo il seguente comando sulla riga di comando:

$ java -jar your-app.jar

A questo punto, è ancora necessario richiamare l'interprete Java con l' opzione -jar . Ci sono molti motivi per cui sarebbe preferibile avviare la tua app potendola richiamare come servizio.

3. Su Linux

Per eseguire un programma come processo in background, potremmo semplicemente usare il comando nohup Unix, ma neanche questo è il modo preferito per vari motivi. Una buona spiegazione è fornita in questo thread.

Invece, demonizzeremo il nostro processo. Sotto Linux, possiamo scegliere di configurare un demone con uno script di inizializzazione System V tradizionale o con un file di configurazione Systemd . La prima è tradizionalmente l'opzione più conosciuta, ma viene gradualmente sostituita dalla seconda.

Puoi trovare maggiori dettagli su questa differenza qui.

Per una maggiore sicurezza, creiamo prima un utente specifico con cui eseguire il servizio e modifichiamo di conseguenza le autorizzazioni del file JAR eseguibile:

$ sudo useradd baeldung $ sudo passwd baeldung $ sudo chown baeldung:baeldung your-app.jar $ sudo chmod 500 your-app.jar

3.1. System V Init

Un file JAR eseguibile Spring Boot rende il processo di configurazione del servizio molto semplice:

$ sudo ln -s /path/to/your-app.jar /etc/init.d/your-app

Il comando precedente crea un collegamento simbolico al file JAR eseguibile. È necessario utilizzare il percorso completo del file JAR eseguibile, altrimenti il ​​collegamento simbolico non funzionerà correttamente. Questo collegamento consente di avviare l'applicazione come servizio:

$ sudo service your-app start

Lo script supporta i comandi di avvio , arresto , riavvio e stato del servizio standard . Inoltre:

  • avvia i servizi in esecuzione sotto il baeldung utente che abbiamo appena creato
  • tiene traccia dell'ID del processo dell'applicazione in /var/run/your-app/your-app.pid
  • scrive i log della console in /var/log/your-app.log , che potresti voler controllare nel caso in cui l'applicazione non si avvii correttamente

3.2. Systemd

Anche la configurazione del servizio systemd è molto semplice. Per prima cosa, creiamo uno script denominato your-app.service utilizzando il seguente esempio e lo inseriamo nella directory / etc / systemd / system :

[Unit] Description=A Spring Boot application After=syslog.target [Service] User=baeldung ExecStart=/path/to/your-app.jar SuccessExitStatus=143 [Install] WantedBy=multi-user.target

Ricordarsi di modificare i campi Descrizione , Utente ed ExecStart per adattarli alla propria applicazione. A questo punto dovresti essere in grado di eseguire anche i suddetti comandi di servizio standard.

A differenza dell'approccio di System V init descritto nella sezione precedente, il file dell'ID di processo e il file di registro della console devono essere configurati esplicitamente utilizzando i campi appropriati nello script del servizio. Un elenco esaustivo di opzioni può essere trovato qui.

3.3. Upstart

Upstart è un gestore di servizi basato su eventi, un potenziale sostituto per System V init che offre un maggiore controllo sul comportamento dei diversi daemon.

Il sito ha buone istruzioni di configurazione che dovrebbero funzionare per quasi tutte le distribuzioni Linux. Quando usi Ubuntu, probabilmente lo hai già installato e configurato (controlla se ci sono lavori con un nome che inizia con "upstart" in / etc / init ).

Creiamo un job your-app.conf per avviare la nostra applicazione 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 

Now run “start your-app” and your service will start.

Upstart offers many job configuration options, you can find most of them here.

4. On Windows

In this section, we present a couple of options that may be used to run a Java JAR as a Windows service.

4.1. Windows Service Wrapper

Due to difficulties with the GPL license of the Java Service Wrapper (see next subsection) in combination with e.g. the MIT license of Jenkins, the Windows Service Wrapper project, also known as winsw, was conceived.

Winsw provides programmatic means to install/uninstall/start/stop a service. In addition, it may be used to run any kind of executable as a service under Windows, whereas Java Service Wrapper, as implied by its name, only supports Java applications.

First, you download the binaries here. Next, the configuration file that defines our Windows service, MyApp.xml, should look like this:

 MyApp MyApp This runs Spring Boot as a Service.  java -Xmx256m -jar "%BASE%\MyApp.jar" rotate  

Finally, you have to rename the winsw.exe to MyApp.exe so that its name matches with the MyApp.xml configuration file. Thereafter you can install the service like so:

$ MyApp.exe install

Similarly, you may use uninstall, start, stop, etc.

4.2. Java Service Wrapper

In case you don't mind the GPL licensing of the Java Service Wrapper project, this alternative may address your needs to configure your JAR file as a Windows service equally well. Basically, the Java Service Wrapper also requires you to specify in a configuration file which specifies how to run your process as a service under Windows.

This article explains in a very detailed way how to set up such an execution of a JAR file as a service under Windows, so we there's no need to repeat the info.

5. Additional References

Spring Boot applications may also be started as Windows service using Procrun of the Apache Commons Daemon project. Procrun is a set of applications that allow Windows users to wrap Java applications as Windows services. Such a service may be set to start automatically when the machine boots and will continue to run without any user being logged on.

More details on starting Spring Boot applications under Unix may be found here. There are also detailed instructions on how to modify Systemd unit files for Redhat based systems. Finally

Finally, this quick howto describes how to incorporate a Bash script into your JAR file, so that it becomes an executable itself!

6. Conclusion

Services allow you to manage your application state very efficiently and, as we have seen, service setup for Spring Boot applications is now easier than ever.

Ricorda solo di seguire le importanti e semplici misure di sicurezza sulle autorizzazioni degli utenti per eseguire il tuo servizio.