Spring Boot Production Ready


Externalize Configuration

Die im WAR/JAR verbackene application.properties muß in verschiedenen Deployment-Umgebungen entsprechend angepaßt werden.

Übersteuern mit Aufrufparametern

java -jar myapp.jar --de.cachaca.myapp.host=www.cachaca.de

Übersteuern mit externer application.properties

Bei folgender Organisation

target/
  myapp.jar
    application.properties    # 3
      myprop1=A
      myprop2=D
      myprop3=F
  config/
    application.properties    # 2
      myprop1=B
      myprop2=E
  application.properties      # 1
    myprop1=C

Die Properties werden in der Reihenfolge #1, #2, #3 gezogen, d. h. die Properties haben zur Laufzeit folgende Werte:

myprop1=C
myprop2=E
myprop3=F

Spring Boot as a Service

Spring Boot ermöglich die Installation der Anwendung als Service (unter Linux über init.d, systemd und unter Windows). Die Installation als Service hat den Vorteil, daß sich das Betriebssystem um einen evtl. notwendigen Restart kümmert.

Der vordere Teil des Jar/War-Artefakts besteht aus dem sog. Launch-Skript (das scheinbar auch unter Windows funktioniert) - mittendrin beginnt der binäre Teil des Artefakts:

Init-Skript

Will man das Startskript nicht so seltsam vermischt haben1, so muß man es beim Build entsprechend konfigurieren ... unter Maven folgendermaßen (executable) - per Default steht diese Option auf true:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>false</executable>
    </configuration>
</plugin>

1 ACHTUNG: Nicht alle ZIP-Clients kommen mit dieser Art klar und werfen evtl. einen Fehler.

Unter CentOS und Ubuntu funktioniert das Default-Launch-Sktipt bei der Einbindung als systemd-Service. Bei anderen Distributionen hingegen muß evtl. ein eigenes Launch-Skript geschrieben werden2. Entweder bindet man es bereits im spring-boot-maven-plugin über embeddedLaunchScript (und evtl. embeddedLaunchScriptProperties) ein oder man konfiguriert es in der systemd-Service Datei (liegt unter /etc/systemd/system/myapp.service). Dort wird das Launcher-Script referenziert und die Variable JARFILE gesetzt:

[Service]
Environment="JARFILE=/opt/myapp.war"
ExecStart=/opt/myapp-launcher.sh

2 Hier findet man ein Skeleton für das Launch-Skript: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-tools/spring-boot-loader-tools/src/main/resources/org/springframework/boot/loader/tools/launch.script

Will man die JRE-Einstellungen der Anwendung konfigurieren, so sollte man eine conf-Datei verwenden (http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/deployment-install.html#deployment-script-customization-conf-file), die neben das war/jar-Artefakt gelegt wird. Alternativ könnte man das Launch-Skript anpassen.

Linux: systemd

Systemd benötigt eine Service-Datei in /etc/systemd/system/myapp.service mit den Permissions 0644:

[Unit]
Description=MyApp
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=pfh
Group=users
ExecStart=/opt/myapp.jar
Restart=always

In diesem Beispiel gehe ich davon aus, daß die Anwendnung in /opt/myapp.jar liegt.

Danach muß der systemd seine Konfiguration neu einlesen

sudo systemctl daemon-reload

und dann kann der Service gestartet werden:

sudo systemctl start myapp.service

Linux: init.d

OS/X: launchd

... hab ich keine Ahnung

Windows Dienst

Ein Doppelclick auf der Spring-Boot-jar/war-Artefakt reicht für die Installation als Dienst ... also ACHTUNG!!!


Actuator

Die sog. Production-Ready Features werden über die Dependency

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
</dependencies>

aktiviert. Dadurch werden einige nützliche Webservice-Endpunkte exponiert.

Wenn man den Management-Port konfiguriert

management:
  server:
    port: 8081
    ssl:
      enabled: false
  endpoints:
    web:
      exposure:
        include: info,health,metrics

dann sind die Actuator-Endpunkte nicht mehr über die normale Web-UI der Anwendung erreichbar, sondern nur noch über den Management-Port. Dies ist sehr praktisch, denn den Health-Status möchte man gerne in den Monitoring-Tools einer Landschaft abrufen. Dort will man aber evtl keine Truststore-Konfiguration vornehmen und man möchte ohne Login zugreifen können.

Optional kann der /docs Endpunkt (http://IP_ADDRESS:PORT/docs) aktiviet werden:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-actuator-docs</artifactId>
  </dependency>
</dependencies>

Custom application info

Features:

  • Monitoring/Health-Checks

Startup-Banner

Beim Start der Applikation wird standardmäßig ein Banner angezeigt ... das ist konfigurierbar. Einfach eine banner.txt in den Classpath legen.

Solche Banner macht niemand selber ... http://patorjk.com/software/taag (die Fonts Ogre, Doom, Standard, ANSI Shadow, CalvinS sind meine Favoriten):

        _                    
  _ __ (_) ___ _ __ _ __ ___ 
 | '_ \| |/ _ \ '__| '__/ _ \
 | |_) | |  __/ |  | | |  __/
 | .__/|_|\___|_|  |_|  \___|
 |_|                         

results matching ""

    No results matching ""