Spring Boot-Anwendung als Dienst

Spring Boot-Anwendung als Dienst

1. Überblick

In diesem Artikel werden einige Optionen zum Ausführen von Spring Boot-Anwendungen als Dienst erläutert.

Zunächst werden die Paketierungsoptionen und Systemdienste von Webanwendungen erläutert. In den folgenden Abschnitten werden verschiedene Alternativen untersucht, die wir zum Einrichten eines Dienstes für Linux- und Windows-basierte Systeme haben.

Schließlich werden wir mit einigen Verweisen auf zusätzliche Informationsquellen schließen.

2. Anweisungen zum Einrichten und Erstellen von Projekten

2.1. Verpackung

Webanwendungen werden traditionell als Web Application Archive (WAR) gepackt und auf einem Webserver bereitgestellt.

Spring Boot-Anwendungen können sowohl als WAR- als auch als JAR-Dateien gepackt werden. Letzterer bettet einen Webserver in eine JAR-Datei ein, mit der Sie Anwendungen ausführen können, ohne dass ein Anwendungsserver installiert und konfiguriert werden muss.

2.2. Maven-Konfiguration

Beginnen wir mit der Definition der Konfiguration unsererpom.xml-Datei:

jar


    org.springframework.boot
    spring-boot-starter-parent
    1.4.0.RELEASE



    ....



    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                true
            
        
    

Die Verpackung muss aufjar eingestellt sein. Wir verwenden zum Zeitpunkt des Schreibens die neueste stabile Version von Spring Boot, aber jede Version nach 1.3 wird ausreichen. Weitere Informationen zu den verfügbaren Versionenhere finden Sie hier.

Beachten Sie, dass wir den Parameter<executable> für das Artefaktspring-boot-maven-plugin auftrue gesetzt haben. Dadurch wird sichergestellt, dass dem JAR-Paket eineMANIFEST.MF-Datei hinzugefügt wird. Dieses Manifest enthält einenMain-Class-Eintrag, der angibt, welche Klasse die Hauptmethode für Ihre Anwendung definiert.

2.3. Erstellen Ihrer Anwendung

Führen Sie den folgenden Befehl im Stammverzeichnis Ihrer Anwendung aus:

$ mvn clean package

Die ausführbare JAR-Datei ist jetzt im Verzeichnistargetverfügbar. Sie können die Anwendung starten, indem Sie den folgenden Befehl in der Befehlszeile ausführen:

$ java -jar your-app.jar

Zu diesem Zeitpunkt müssen Sie den Java-Interpreter noch mit der Option-jaraufrufen. Es gibt viele Gründe, warum es vorzuziehen ist, Ihre App zu starten, indem Sie sie als Service aufrufen können.

3. Unter Linux

Um ein Programm als Hintergrundprozess auszuführen, können Sie einfach den Unix-Befehlnohupverwenden. Dies ist jedoch aus verschiedenen Gründen auch nicht der bevorzugte Weg. Eine gute Erklärung finden Sie inthread.

Stattdessen gehen wir zudaemonize unseres Prozesses. Unter Linux können wir einen Daemon entweder mit einem herkömmlichenSystem V init-Skript oder mit einerSystemd-Konfigurationsdatei konfigurieren. Ersteres ist traditionell die bekannteste Option, wird jedoch schrittweise durch die letztere ersetzt.

Möglicherweise finden Sie weitere Details zu dieser Differenzhere.

Zur Erhöhung der Sicherheit erstellen wir zunächst einen bestimmten Benutzer, mit dem der Dienst ausgeführt werden soll, und ändern die Berechtigungen für die ausführbare JAR-Datei entsprechend:

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

3.1. System V Init

Eine ausführbare Spring Boot-JAR-Datei erleichtert den Service-Setup-Vorgang erheblich:

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

Der obige Befehl erstellt eine symbolische Verknüpfung zu Ihrer ausführbaren JAR-Datei. Sie müssen den vollständigen Pfad zu Ihrer ausführbaren JAR-Datei verwenden. Andernfalls funktioniert die symbolische Verknüpfung nicht ordnungsgemäß. Über diesen Link können Sie die Anwendung als Dienst starten:

$ sudo service your-app start

Das Skript unterstützt die Standardbefehlestart,stop,restart undstatus. Außerdem:

  • Es startet die Dienste, die unter dem Benutzerexampleausgeführt werden, den wir gerade erstellt haben

  • Es verfolgt die Prozess-ID der Anwendung in/var/run/your-app/your-app.pid

  • Es schreibt Konsolenprotokolle in/var/log/your-app.log, die Sie möglicherweise überprüfen möchten, falls Ihre Anwendung nicht ordnungsgemäß gestartet werden kann

3.2. Systemd

Das Service-Setup vonsystemdist ebenfalls sehr einfach. Zunächst erstellen wir anhand des folgenden Beispiels ein Skript mit dem Namenyour-app.service und legen es im Verzeichnis/etc/systemd/systemab:

[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

Denken Sie daran, die FelderDescription,User undExecStart entsprechend Ihrer Anwendung zu ändern. Sie sollten auch an dieser Stelle in der Lage sein, die oben genannten Standarddienstbefehle auszuführen.

Im Gegensatz zum im vorherigen Abschnitt beschriebenen Ansatz vonSystem V initollten die Prozess-ID-Datei und die Konsolenprotokolldatei explizit mithilfe der entsprechenden Felder im Dienstskript konfiguriert werden. Eine vollständige Liste der Optionen finden Sie unterhere.

3.3. Emporkömmling

Upstart ist ein ereignisbasierter Service Manager, ein potenzieller Ersatz fürSystem V init, der mehr Kontrolle über das Verhalten der verschiedenen Daemons bietet.

Die Site hat gutesetup instructions, die für fast jede Linux-Distribution funktionieren sollten. Wenn Sie Ubuntu verwenden, haben Sie es wahrscheinlich bereits installiert und konfiguriert (prüfen Sie, ob es Jobs gibt, deren Name mit "upstart" in/etc/init beginnt).

Wir erstellen einen Jobyour-app.conf, um unsere Spring Boot-Anwendung zu starten:

# 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

Führen Sie nun "start your-app" aus und Ihr Dienst wird gestartet.

Upstart bietet viele Optionen für die Jobkonfiguration. Die meisten davon finden Sie inhere.

4. Unter Windows

In diesem Abschnitt werden einige Optionen vorgestellt, die zum Ausführen einer Java-JAR als Windows-Dienst verwendet werden können.

4.1. Windows Service Wrapper

Aufgrund von Schwierigkeiten mit der GPL-Lizenz vonJava Service Wrapper (siehe nächster Unterabschnitt) in Kombination mit z. Die MIT-Lizenz von Jenkins, dem ProjektWindows Service Wrapper, auch alswinswbekannt, wurde konzipiert.

Winsw bietet programmatische Mittel zum Installieren / Deinstallieren / Starten / Stoppen eines Dienstes. Darüber hinaus kann es zum Ausführen von ausführbaren Dateien aller Art als Dienst unter Windows verwendet werden, wohingegen Java Service Wrapper, wie der Name andeutet, nur Java-Anwendungen unterstützt.

Zuerst laden Sie die Binärdateienhere herunter. Als Nächstes sollte die Konfigurationsdatei, die unseren Windows-DienstMyApp.xml definiert, folgendermaßen aussehen:


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

Schließlich müssen Siewinsw.exe inMyApp.exe umbenennen, damit der Name mit der Konfigurationsdatei vonMyApp.xmlübereinstimmt. Danach können Sie den Dienst wie folgt installieren:

$ MyApp.exe install

In ähnlicher Weise können Sieuninstall,start,stop usw. verwenden.

4.2. Java Service Wrapper

Falls Ihnen die GPL-Lizenzierung desJava Service Wrapper-Projekts nichts ausmacht, kann diese Alternative Ihre Anforderungen erfüllen, um Ihre JAR-Datei ebenso gut als Windows-Dienst zu konfigurieren. Grundsätzlich müssen Sie für den Java Service Wrapper auch in einer Konfigurationsdatei angeben, wie Ihr Prozess als Dienst unter Windows ausgeführt werden soll.

This article erklärt sehr detailliert, wie eine solche Ausführung einer JAR-Datei als Dienst unter Windows eingerichtet wird, sodass die Informationen nicht wiederholt werden müssen.

5. Zusätzliche Referenzen

Spring Boot-Anwendungen können auch als Windows-Dienst mitProcrun desApache Commons Daemon-Projekts gestartet werden. Procrun ist eine Reihe von Anwendungen, mit denen Windows-Benutzer Java-Anwendungen als Windows-Dienste einbinden können. Ein solcher Dienst wird möglicherweise automatisch gestartet, wenn der Computer gestartet wird, und wird weiterhin ausgeführt, ohne dass ein Benutzer angemeldet ist.

Weitere Informationen zum Starten von Spring Boot-Anwendungen unter Unix finden Sie unterhere. Es gibt auch detaillierte Anweisungen zum Ändern vonSystemd unit files for Redhat-basierten Systemen. Endlich

Schließlich beschreibtthis quick howto, wie Sie ein Bash-Skript in Ihre JAR-Datei integrieren, damit es selbst zu einer ausführbaren Datei wird!

6. Fazit

Mithilfe von Diensten können Sie den Anwendungsstatus sehr effizient verwalten. Wie wir gesehen haben, ist das Einrichten von Diensten für Spring Boot-Anwendungen jetzt einfacher als je zuvor.

Denken Sie daran, die wichtigen und einfachen Sicherheitsmaßnahmen für die Benutzerberechtigungen zu befolgen, um Ihren Dienst auszuführen.