Neuigkeiten von trion.
Immer gut informiert.

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.

Installation von SDK Man und Micronaut
$ 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.

Erzeugung einer Micronaut Anwendung
$ mn create-app demo
| Generating Java project...
| Application created at /tmp/demo

Die Anwendung ist sofort lauffähig und kann mittels Gradle gestartet werden.

Start der Micronaut Anwendung
$ ./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.

Fehlermeldung im JSON Format
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.

Bean Definition mit Java Annotation
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.

Micronaut Controller mit JSON und Text Ausgabe und Java Inject Annotation
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.

Paketierung der Micronaut Anwendung
$ ./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

Konfiguration von HTTPS in Micronaut
micronaut:
    ssl:
        enabled: true
        buildSelfSigned: true

Alternativ können natürlich auch externe Zertifikate genutzt werden.

Konfiguration von PKCS12 Zertifikaten in Micronaut
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.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Zur Desktop Version des Artikels