Spring Boot

Was ist Spring Boot?

Mit Spring Boot hat die Spring Community eine echte Vereinfachung bei der Erstellung Spring-basierter Anwendung erreicht. Damit können mit wenigen Programmzeilen Prototypen selbst komplexer Anwendungen erstellt werden, die anschließend zum fertigen Produkt konfiguriert werden können. Der Funktionsumfang von Spring Boot umfasst:

  • Build-Management
    • Ein Spring Boot-Projekt kann mit einer simplen Build-Definition gebaut werden.
  • Projekt-Generator
    • Zur Neuanlage eines Projektes kann die Build-Konfiguration mit einem Online-Dienst der Spring-Community erstellt werden.
  • Convention over Configuration und Autoconfiguration
    • Für Rapid Prototyping sind keine Konfigurationsdateien oder Ähnliches vonnöten. Die Anwendung ist nach der Erstellung sofort lauffähig. Dies gilt auch dann, wenn beispielsweise für eine Web-Anwendung ein Server benötigt wird: Die Autoconfiguration startet einfach einen Tomcat auf Port 8080.
  • Externe Konfiguration
    • Für die ausgelieferte Programmversion muss selbstverständlich eine explizite Konfiguration erfolgen, die Autoconfiguration ist hierfür bestenfalls bedingt geeignet. Dazu bietet Spring Boot einen einfachen Mechanismus über Properties- oder YAML-Dateien. Eine Annotation-basierte Konfiguration ist natürlich auch möglich.
  • Monitoring der Runtime
    • Die in Produktion laufende Anwendung wird prnzipiell wie alle Java-Anwendungen über JMX überwacht. Mit dem Spring Actuator werden zusätzliche Metriken hinzugefügt, die via REST-Schnittstelle abgegriffen werden können.

Die einzelnen Funktionen werden im Folgenden detaillierter beschrieben.

Features

 Build Management

Der Build-Prozess einer Spring Boot-Anwendung wird über Gradle oder über Maven definiert. Die Grundideen sind in beiden Systemen die selben und werden hier an einem Maven-Projekt beschrieben:

Als erstes stellt Spring Boot eine Parent-POM zur Verfügung, in der alle (!) möglichen Spring-Dependencies einer Applikation abstrakt deklariert sind:

Ein konkretes POM eines Projekts definiert als Dependencies die Teile des Frameworks, die benutzt werden sollen durch „Starter“. So wird im folgenden Beispiel ein Projekt mit der Spring Core-Komponente sowie der Test-Umgebung definiert:

 

Projekt Generator Spring Initializr

Mit Hilfe des online verfügbaren Projekt-Generators Spring Initializr wird ein POM für ein Projekt sowie eine simple Rahmenanwendung generiert. Die notwendigen Starter können durch eine einfache Oberfläche hinzugefügt werden. Das fertige Projekt wird als Archiv geladen werden.

Convention over Configuration und Autoconfiguration

Eine Spring Boot-Anwendung wird über eine zentrale Einstiegsklasse definiert, die mit @SpringBootApplication annotiert ist.  Damit sind die folgenden Features automatisch aktiviert:

  • Diese Klasse ist automatisch eine @Configuration
  • ComponentScan für alle Unterpakete, so dass automatisch alle @Components gefunden werden
  • Automatisches Laden der application.properties oder alternativ einer application.yaml zur Anwendungs-Konfiguration. Hierin werden Anwendungs-spezifische Konfigurationen definiert, aber auch die restliche Konfiguration (Logging, Ports, URLs…) werden hier zentral gepflegt.
  • Spring-Profile werden unterstützt. So werden Profile-abhängige Konfigurationen wie application-<profile>.properties automatisch erkannt und gemerged.

 

Zusätzlich wird eine Autokonfiguration angeboten, die einiges an Hintergrund-„Magie“ durchführt. Dies sei an einem konkreten Beispiel demonstriert:

  • Die Anwendung benötigt eine Datenbank und deklariert somit in seinem POM den Starter für JDBC.
  • Zusätzlich wird ein Datenbanktreiber angegeben.
  • Jetzt startet die Autokonfiguration und erzeugt automatisch eine DataSource. Dazu wird untersucht, ob der angegebene  Datenbank-Treiber eine Embedded-Konfiguration ermöglicht. Hier sind aktuell H2, Derby und die HSQLDB unterstützt.

Diese Autokonfiguration kann aber beispielsweise auch einen kompletten Jetty-Server konfigurieren und starten. Dazu ist nur der Web-Starter zu inkludieren.

Externe Konfiguration

Die eben besprochene Autoconfiguration ist für Prototyping sehr praktisch. Für reale Anwendungen muss diese jedoch durch explizite Konfiguration ersetzt werden, also beispielsweise den Port des Jetty-Servers oder eine DataSource. Dazu bietet Spring Boot

  • die application.properties
    • spring.datasource.user=Hugo
  • Aufruf-Parameter der Anwendung
    • -Dspring.datasource.user=Hugo
  • Falls zumindest eine DataSource definiert ist wird die Autokonfiguration nicht durchgeführt.

Monitoring

Der Spring-Actuator stellt umfangreiche Informationen via JMX oder über eine REST-Schnittstelle zur Verfügung. Darin werden nicht nur die aktuellen Metriken des Java-Prozesses angezeigt sondern auch beispielsweise das Geflecht der Spring-Beans.

Das Hinzufügen des Actuators erfolgt wie bei Spring Boot üblich durch das Hinzufügen des Starters zum POM. Welche Endpoints aktiviert werden wird in der application.properties definiert.

Ebenso einfach können die Metriken über Jolokia abgegriffen werden.

Fazit

Spring Boot wird zwar als Ergänzung zum Spring-Framework angeboten, ist nach meiner Auffassung aber so überzeugend, dass selbst simple Projekte damit realisiert werden sollten. Selbst wenn „nur“ der Build-Prozess mit Parent Startern benutzt wird, ist der Mehrwert den Aufwand der Einarbeitung in jedem Falle wert. Dies beschreibt ein anderer Artikel zu Spring Boot, darin wird ein RESTful Web Service mit Datenbank-Anbindung programmiert. Die Datenbank-Anbindung mit Spring Data ist Thema eines weiteren Artikels.


Seminar zum Thema

Weiterlesen

Java-Performance

Java-Performance

Leistung zielgerichtet und passgenau optimieren

Zeit ist in unserer modernen Welt zu einem Faktor geworden, der über den Erfolg oder Misserfolg ganzer Geschäftsmodelle entscheiden kann. Wer das Tempo der Konkurrenz nicht mitgehen beziehungsweise übertreffen kann, ist schnell aus dem Rennen. Folgerichtig spielt Geschwindigkeit auch in der IT-Landschaft eine wichtige Rolle, aber nicht nur.

Neben der eigentlichen Performance-Steigerung zählen die Analyse von Code und das Monitoring von Anwendungen zu den Aufgaben, die mit leichtgewichtigen Anwendungen einhergehen.

  • Welche Performance- und Monitoring-Möglichkeiten bestehen?
  • Stresstools wie z.B. Apache-Benchmark, Apache-JMeter, LOIC oder HOIC helfen, die Anwendungen und Server verschiedenen Szenarien auszusetzen.
  • Für das Monitoring stehen uns neben Werkzeugen wie jps, jstat, jconsole, jvisualvm und jmc auch Access-Logfile, Error-Logfile und HEAP-Dump- Analysen zur Verfügung.
  • Darüber hinaus müssen Entwickler die Arbeitsweise der Java Virtuellen Maschine verstehen. Sie müssen wissen, mit welchen Parametern sich diese konfigurieren lässt und wie beispielsweise das Zusammenspiel mit den unterschiedlichen Prozessorfeatures aussieht.
  • Des Weiteren ist die richtige Wahl der verwendeten Objekte aus den zahlreichen Bibliotheken und Frameworks von entscheidender Bedeutung.
  • Außerdem spielt die richtige und ausgewogene Konfiguration der Frameworks sowie der Serverlandschaft eine große Rolle.

Durch Java Performance limitierende Faktoren optimieren

Der Aufgabenstellung Java-Performance zu verbessern kann man sich, wie sich zeigt, sowohl von architektonischer, administrativer, konfiguratorischer wie auch programmatischer Seite her nähern. All diese Maßnahmen tragen dazu bei, die drei limitierenden Faktoren CPU, Speicher und IO-Zugriffe zu optimieren.

Integrata-Seminare zum Thema:

Verfügbarkeit, Performance und Betrieb von Java-Anwendungen und Applikationsservern
Optimierung und Tuning von Java-Programmen
Enterprise Architekturen mit Java und der Java Enterprise Edition

Weiterlesen

Lambda Ausdrücke

Web Development – Ein Java-Klassiker bleibt aktuell

Web Development bleibt auch in den Zeiten der App-Programmierung ein aktuelles Thema. Ursprünglich wurden Browser-Anwendungen nach dem MVC2-Pattern unter Benutzung einer serverseitigen View konzipiert. Heutzutage überwiegen jedoch Single Page-Applikationen. Diese nutzen asynchrone AJAX-Aufrufe unter konsequenter Verwendung einer RESTful Architektur. Das führte zu einer Vielzahl an neuen Frameworks und Sprachen. Doch trotz des grundsätzlichen Wandels sind beide Herangehensweisen weiterhin im Spiel.

MVC2 versus REST

MVC2-Anwendungen werden mit JavaServer Faces, einem Bestandteil der Java Enterprise Edition implementiert. Aber auch das proprietären Spring MVC-Framework ist immer noch sehr beliebt. Beide Frameworks sind ausgereift und bieten ein einfaches Programmiermodell mit mächtigem Funktionsumfang.

RESTful Server werden mit JAX-RS programmiert. Diese Bibliothek ist zwar deutlich jünger als JSF, aber auch wesentlich schlanker, da REST bereits durch den http-Standard umgesetzt ist.

Synergien zwischen Java und JavaScript

In Konkurrenz zu JavaScript-Frameworks wie jQuery, Angular, Backbone und React, um nur einige der Neuentwicklungen zu nennen, verlor Java seine Führungsposition im Web Development. Mit Hilfe eines Tricks können Browser-Anwendungen dennoch auch weiterhin mit Java programmiert werden: Ein Source-to-Source-Compiler transcompiliert bzw. transpiliert Java-Logik nach JavaScript. JavaServer Faces definiert AJAX-Aufrufe deklarativ als Bestandteil der Seitendefinition − eine direkte Browser-Programmierung ist unnötig.

Frameworks wie Google Web Toolkit (GWT) oder Vaadin definieren die Client-Oberfläche und den RESTful Server mit Java-Programmen. Der Client-Code wird direkt nach JavaScript transpiliert. Eclipse RCP- und JavaFX-Anwendungen können nach moderaten Anpassungen im Browser ausgeführt werden. Mit ECMA2016 und Java 8 ähneln sich die beiden Programmiersprachen immer mehr. Eine standardisierte Übersetzung von Java direkt nach JavaScript rückt damit in greifbare Nähe.

 

Bildnachweis: pixabay.com, CCO License @unsplash

Weiterlesen