Einführung in Micronaut
Lange Zeit war Spring zusammen mit Spring Boot der Defacto-Standard, wenn es um die Entwicklung von Microservices bei hoher Entwicklerproduktivität ging. Nun schicken die Entwickler von Grails ein neues Framework ins Rennen: Micronaut.
Das Versprechen von Micronaut:
Aus den Ansätzen von Grails, Spring Boot und Spring zu lernen und ein Framework bereitzustellen, das den Anforderungen von modernen Cloud- und Microserviceumgebungen gewachsen ist.
Aus technischer Sicht sind einige Punkte, wie minimierter Einsatz von Java-Reflection und Proxies, spannend, die für die Verwendung der Substrate VM und Graal relevant sind.
Werfen wir einen Blick auf Micronaut - eine Einführung.
Setup Micronaut CLI
Micronaut bringt ein eigenes Kommandozeilenwerkzeug (CLI) mit. Damit lassen sich neue Anwendungen erzeugen, bauen und paketieren. Zur Installation wird von Micronaut die Verwendung von SDK Man empfohlen.
$ curl -s "https://get.sdkman.io" | bash
$ sdk update
$ sdk install micronaut 1.0.1
Alternativ kann das Micronaut CLI auch von der Micronaut Download Seite bezogen werden: http://micronaut.io/download.html
Bei Verwendung des Downloads muss das Archiv ausgepackt werden und das mn
Programm aus dem bin
Ordner im PATH
registriert werden.
Micronaut Anwendung
Das mn
Werkzeug unterstützt den Lebenszyklus einer Anwendung.
Entsprechend wird ein Projekt auch mit dem Micronaut CLI erzeugt.
$ mn create-app demo
| Generating Java project...
| Application created at /tmp/demo
Die Anwendung ist sofort lauffähig und kann mittels Gradle gestartet werden.
$ ./gradlew run
> Task :run
21:44:09.715 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 612ms. Server Running: http://localhost:8080
<=<=========----> 75% EXECUTING [16s]
> :run
Wird die Anwendung unter der angegebenen URL aufgerufen, so wird ein Fehler gemeldet, da die angeforderte Resource nicht existiert. Das stimmt natürlich, da bisher nichts konfiguriert wurde. Auffällig ist jedoch, dass die Fehlermeldung als JSON Struktur geliefert wird. Daran zeigt sich bereits, dass Micronaut die Erstellung von Microservices mit API-Fokus als Ziel hat.
http :8080
HTTP/1.1 404 Not Found
Date: Wed, 26 Dec 2018 21:50:56 GMT
connection: close
content-length: 77
content-type: application/json
{
"_links": {
"self": {
"href": "/",
"templated": false
}
},
"message": "Page Not Found"
}
IDE Konfiguration
Damit Micronaut-Anwendungen aus einer IDE heraus direkt gestartet werden können, müssen Java Annotation Processors aktiviert sein. Dann kann aus einer beliebigen IDE heraus die Anwendung direkt gestartet und auch debuggt werden.
Manche IDEs integrieren Gradle als Buildwerkzeug nicht optimal.
Hier kann als Abhilfe das Micronaut Projekt mit --build maven
erzeugt werden.
Micronaut unterstützt neben Java auch weitere Sprachen wie Kotlin oder Groovy.
Controller und Dependency Injection
Micronaut setzt Dependency-Injection mit Java Standard-Annotations um. Dadurch lassen sich sowohl Beans deklarieren, als auch deren Verwendung steuern. Verschiedene Scopes werden dabei ebenfalls unterstützt.
package demo;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.*;
import javax.inject.*;
@Singleton
public class Counter {
private volatile int count;
public int getCount(){
return count;
}
public Counter next() {
count++;
return this;
}
}
Um Daten auszugeben oder entgegen zu nehmen, werden Controller-Klassen verwendet.
package demo;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.*;
import javax.inject.*;
@Controller("/demo")
public class DemoController {
@Get(produces = MediaType.TEXT_PLAIN)
public String index() {
return "Micronaut Demo!";
}
@Inject private Counter counter;
@Get("/counter")
public Counter count() {
return counter.next();
}
}
Serialisierung zu JSON wird mit Jackson automatisch durchgeführt.
Auslieferung
Die Anwendung kann mittels ./gradlew assemble
als JAR paketiert werden.
Micronaut hat als Besonderheit, dass Dependency-Injection und AOP zur Compile-Zeit durch Code-Generierung umgesetzt werden.
Dadurch wird eine kurze Startzeit und geringer Speicherverbrauch im Vergleich zu Beispielsweise dem Spring Framework erzielt.
Das JAR lässt sich anschließend mit java -jar
starten.
$ ./gradlew assemble
> Task :compileJava
Note: Creating bean classes for 2 type elements
BUILD SUCCESSFUL in 6s
10 actionable tasks: 9 executed, 1 up-to-date
$ java -jar build/libs/demo-0.1-all.jar
23:10:01.749 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 1032ms. Server Running: http://localhost:8080
Besonderheiten
In dem Zuge ist auch ein weiteres Feature von Micronaut bemerkenswert: Standardmäßig wird HTTPS unterstützt. Micronaut verwendet dazu selbst signierte Zertifikate
micronaut:
ssl:
enabled: true
buildSelfSigned: true
Alternativ können natürlich auch externe Zertifikate genutzt werden.
micronaut:
ssl:
enabled: true
keyStore:
path: classpath:server.p12
password: mypassword
type: PKCS12
Auch das reaktive Programmiermodell wird nativ von Micronaut unterstützt.
Dazu lassen sich entweder Server-Sent-Events (SSE) oder die standardmäßig genutzte Variante von Transfer-Encoding chunked
verwenden.
Neben serverseitigen Funktionalitäten bringt Micronaut auch Clients samt Service-Discovery mit. Damit lassen sich dann andere Microservices aufrufen, egal in welcher Sprache und mit welchem Framework diese gebaut wurden.
Bei den Zielumgebungen ist Micronaut flexibel, durch hohe Geschwindigkeit, die dank der Code-Generierung zur Compile-Zeit erreicht wird, wird auch FaaS sinnvoll unterstützt. Sogar die Entwicklung von Kommandozeilenwerkzeugen (CLIs) wird durch Micronaut dank Picocli unterstützt.
Fazit
Micronaut fühlt sich erfrischend schlank und gleichzeitig vollwertig an. Auch, wenn es schwer sein dürfte, neben Spring einen prominenten Platz zu erreichen, dürfte Micronaut zumindest als Ansporn dienen und man darf auf die daraus resultierenden spannenden Entwicklungen gespannt sein.
Zu den Themen Spring Boot, Java und Cloud Architektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:
Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.