Cloud-native Microservice-Entwicklung mit Helidon - Opitz ...

Die Seite wird erstellt Merlin Bender
 
WEITER LESEN
Cloud-native Microservice-Entwicklung mit Helidon - Opitz ...
Cloud-native Microservice-
Entwicklung mit Helidon
                                                                  Sven Bernhardt, Opitz Consulting Deutschland

Schneller, besser und innovativer – das sind Kernattribute, die Unternehmen heute befähigen, langfris-
tig rentabel und konkurrenzfähig zu bleiben. Cloud-Plattformen bilden hierfür eine wichtige Basis, denn
die Cloud ist ein wichtiges Vehikel, um innovative Ideen schnell und effizient voranzubringen. Dafür
braucht es allerdings zwingend Applikationen, die in der Lage sind, die Cloud richtig zu nutzen und ein
Umdenken in der Art und Weise, wie Applikationen implementiert und betrieben werden: Das Zauber-
wort heißt Cloud-native.

                                                                                Red Stack Magazin 03/2020        31
Cloud-native Microservice-Entwicklung mit Helidon - Opitz ...
Development

                    Traditional app development approach                           Cloud-native app development approach

                                                                                                                        Single
                                                                                           UI            UI
                                                                                                         UI             Deployment
                                                    UI                                                                  Unit
                   Single
                   Deployment                     Logic                                   API            API
                                                                                                                        Single
                   Unit                                                                   Logic         Logic           Deployment
                                              Data Access
                                                                                                                        Unit

                                                  Data                                    Data          Data

     Abbildung 1: Traditionelle vs. Cloud-native Applikationen (Quelle: Sven Bernhardt)

     Cloud-native Applikationen sind Applika-            rung konkret bedeutet. Technologisch          zu bieten hat und kann somit eine Vielzahl
     tionen, die von Anfang an mit speziellem            setzt Cloud-native massiv auf Containe-       verschiedenster Anwendungsszenarien
     Fokus auf die Cloud entwickelt werden.              risierung. Architektonisch stehen vor al-     abdecken. Das bedeutet leider Segen und
     Im Gegensatz zu klassischen On-Premi-               lem Konzepte wie Microservices, APIs und      Fluch zugleich: Entwickler, die das Spring-
     ses-Applikationen, die mit „Lift and Shift“         DevOps im Vordergrund.                        Framework nur wenig kennen, verlieren
     ohne jegliche architektonische Verände-                 Die Implementierung von Cloud-nati-       ob des Umfangs und der Komplexität des
     rungen in die Cloud gebracht werden,                ven Applikationen erfolgt unter Berück-       Ökosystems schnell den Überblick. Die
     sind Cloud-native Applikationen in der              sichtigung der sogenannten Twelve-Fac-        Lernkurve für Spring-Neulinge ist dem-
     Lage, die besonderen Möglichkeiten der              tor-App-Prinzipien. Hierbei handelt es        entsprechend hoch. Das Schreiben einfa-
     Cloud-Technologie optimal auszuschöp-               sich nicht etwa um neue, bahnbrechen-         cher CRUD-Services kann so zu einer gro-
     fen, wie zum Beispiel die quasi unbe-               de Entwicklungsprinzipien, sondern eher       ßen Herausforderung werden.
     grenzte Skalierbarkeit. Dafür braucht es            um eine Sammlung von bereits etablier-            Da aber die Java-Community stets ak-
     eine neue Form der Applikationsarchitek-            ten Entwicklungspraktiken, wie beispiels-     tiv und kreativ ist, hat sich im Bereich der
     tur und -implementierung.                           weise die Verwaltung des Sourcecodes in       Microservice-Entwicklung in den letzten
                                                         einem Versionsmanagementsystem oder           Jahren einiges getan. Neben Springboot
                                                         die Externalisierung von Konfigurationen      existieren daher mittlerweile eine Vielzahl
     Cloud-native Applikationen                          in Umgebungsvariablen. [2]                    leichtgewichtiger Frameworks, die die
                                                                                                       Entwicklung von Microservices einfach
     Cloud-native Applikationen sind speziell                                                          und effizient machen. Abbildung 2 zeigt
     für die Cloud konzipiert. Aber was bedeu-           Cloud-native Java                             eine Übersicht der aktuell prominentes-
     tet das eigentlich konkret?                                                                       ten Frameworks in diesem Bereich. Dabei
        Die Cloud Native Computing Foundati-             Wie bereits erwähnt, werden Cloud-na-         handelt es sich bei der Übersicht um eine
     on (CNCF) beschreibt Cloud-native Appli-            tive Applikationen containerisiert be-        Momentaufnahme, die keinen Anspruch
     kationen als                                        trieben. Dies sollte bereits bei der Ent-     auf Vollständigkeit hat.
                                                         wicklung beachtet werden. Bei einer               Neben den sogenannten Full Stack
     •   lose gekoppelt,                                 Java-basierten Anwendung bedeutet das         Frameworks zeigt die Abbildung auch Mi-
     •   belastbar („resilient“),                        beispielsweise, dass diese „standalone“ in    croProfile-Frameworks sowie Microframe-
     •   handhabbar („manageable“)                       der JVM gestartet und betrieben werden        works.
     •   und beobachtbar („observable“).                 kann (zum Beispiel mittels Kommando-              MicroProfile ist eine Community-ge-
                                                         zeilen-Befehls java -jar app.jar). Das        triebene Spezifikation zur Entwicklung
     Zudem müssen Änderungen an solchen                  verwendete Frameworks sollte also ent-        von Java-Enterprise-basierten Microser-
     Applikationen schnell und zuverlässig               sprechende Mechanismen bereitstellen.         vices. Diese Spezifikation wird von der
     durchgeführt werden können, was durch                   Ein prominentes Beispiel hierfür ist      Eclipse Foundation [4] gehostet und um-
     eine robuste und durchgängige Automa-               Springboot [3], das im Umfeld der Cloud-      fasst eine Sammlung von Einzelspezifika-
     tisierungsstrategie zu untermauern ist. [1]         native Entwicklung bei Java-Entwicklern       tionen. Dabei bedient sie sich aus existie-
         Abbildung 1 zeigt, was die CNCF-Defi-           sehr beliebt ist. Springboot kann auf alles   renden Spezifikationen des klassischen
     nition in Bezug auf eine Operationalisie-           zurückgreifen, was das Spring-Ökosystem       Java EE beziehungsweise Jakarta EE-

32       www.aoug.at • www.doag.org • www.soug.ch
Dropwizard

Abbildung 2: Cloud-native Java Frameworks, eine Übersicht (Quelle: Sven Bernhardt)

Umfelds. Anders als bei Java Enterprise           Abläufe, wie beispielsweise die korrek-     Varianten unterstützt: Helidon MP und
existiert bei MicroProfile keine Referen-         te Initialisierung von Klassen- und Ob-     Helidon SE. Basis für beide Framework-
zimplementierung. Das macht den Spe-              jektnetzen oder die Freigabe bestimmter     Varianten ist Netty [5], ein asynchrones,
zifikationsprozess leichtgewichtig und er-        Ressourcen. Abhängig vom Anwendungs-        Event-getriebenes Framework.
möglicht kurze Release-Zyklen.                    szenario erhöhen sich damit einerseits          Bei Helidon SE handelt es sich um ein
    Umfang und Ökosystem sind bei den             die Menge des Boilerplate Code und der      leichtgewichtiges, reaktives Microframe-
MicroProfile-Frameworks bei Weitem                Testaufwand. Auf der anderen Seite sind     work, das ein funktionales Programmier-
nicht so ausgeprägt wie bei Springboot.           diese Frameworks durch wenige externe       modell unterstützt. Wie in Abbildung 3
Dieser Umstand kann für bestimmte An-             Abhängigkeiten jedoch extrem leichtge-      dargestellt beinhaltet das Framework ei-
wendungsfälle Einschränkungen bedeu-              wichtig und flexibel.                       nen reaktiven Webserver sowie Features
ten, macht sie aber intuitiver und erleich-                                                   für ein flexibles Konfigurationsmanage-
tert Neulingen den Einstieg.                                                                  ment und Security.
    Neben den MicroProfile-Frameworks             Helidon Framework-                              Der reaktive Webserver zeichnet sich
zeigt Abbildung 2 auch sogenannte Mi-             Architektur                                 durch ein einfaches, funktionales Rou-
croframeworks. Microframeworks sind                                                           ting- Modell aus und bietet unter ande-
charakterisiert durch eine reaktive,              Bei Helidon handelt es sich um eine         rem Support für Open Tracing, Metrics
nicht-blockierende („non-blocking“) Ar-           Sammlung von Bibliotheken für die Im-       sowie Healthchecks. Für die Implementie-
chitektur. Sie sind optimiert auf schnelle        plementierung Java-basierter Microser-      rung von RESTful-Services werden zudem
Startup- und Verarbeitungszeiten. Frame-          vices, deren Entwicklung maßgeblich         JAX-RS (REST-Service Support) und JSON-
works dieser Kategorie verzichten meist           durch Oracle getrieben wird. Das Open       P (JSON Parsing) unterstützt. Da Cloud-
auf jegliche Form impliziter „Framework           Source Framework wurde 2018 in der          native Applikationen dem Mantra: „Build
Magic“ wie Dependency Injection. Damit            Version 1.0 released. Interessant dabei     once, run anywhere“ aus den Twelve-Fac-
übernehmen Entwickler dann allerdings             ist, dass das Framework, wie in Abbil-      tor-App-Prinzipien [1] folgen, wird ein fle-
selbst die Verantwortung für bestimmte            dung 2 dargestellt, zwei unterschiedliche   xibler Konfigurationsmechanismus ange-
                                                                                              boten, der unterschiedliche Formate wie
                                                                                              YAML oder Property-Files und auch dyna-
                                                                                              mische Konfigurationsanpassungen zur
                                                                                              Laufzeit unterstützt. Des Weiteren wer-
                 Helidon MP
                                                                                              den Funktionalitäten für die Umsetzung
                                                              Extension
                     CDI       JAX-RS      JSON-B/P                                           von Security-Anforderungen in den Berei-
                                                                                              chen Inbound- und Outbound-Authentifi-
                 Helidon SE                                                                   zierung, Autorisierung sowie Auditing be-
                                                                                              reitgestellt.
                     WebServer              Config             Security                           Bei Helidon MP handelt es sich um
                                                                                              eine MicroProfile-Implementierung. Wie
                                            Netty                                             Abbildung 3 zeigt, setzt Helidon MP auf die
                                                                                              im vorherigen Abschnitt erläuterten Ba-
                                                                                              sisbausteine von Helidon SE auf, was eine
Abbildung 3: Architektur des Helidon Frameworks (Quelle: Sven Bernhardt)                      effiziente Weiterentwicklung der beiden

                                                                                                      Red Stack Magazin 03/2020              33
Development

     Framework-Varianten ermöglicht. Der Mi-              mvn archetype:generate -DinteractiveMode=false \
     croProfile-Spezifikation folgend werden                  -DarchetypeGroupId=io.helidon.archetypes \
     die Java EE-Spezifikationen für Context                  -DarchetypeArtifactId=helidon-quickstart-mp \
                                                              -DarchetypeVersion=1.4.1 \
     and Dependecy Injection (CDI), JAX-RS,
                                                              -DgroupId=com.opitzconsulting.helidon \
     JSON-B und JSON-P unterstützt.                           -DartifactId=greeting-service-mp \
         Darüber hinaus ist Helidon MP über                   -Dpackage=com.opitzconsulting.helidon
     CDI-Extensions [6] flexibel erweiterbar.
     Derzeit existieren etwa CDI-Extensions             Listing 1: Projekt-Setup für einen Helidon Service (Helidon MP)
     für Java Persistence API (JPA) oder Java
     Transaction API (JTA). Beide Spezifikatio-
     nen sind nicht Bestandteil der MicroPro-           Projekts als Startpunkt für die weitere             HTTP-Ressource an, die einen „Hello
     file- Spezifikation, werden aber bei der           Entwicklung können entsprechend vor-                World“-String zurückzuliefert. Die Imple-
     Entwicklung von datenbankzentrischen               handene Maven-Archetypen für Helidon                mentierung hingegen unterscheidet sich
     Services benötigt; zusätzlich existieren           SE und Helidon MP verwendet werden.                 aufgrund der Programmiermodelle.
     weitere Extensions für den Zugriff auf                 Der Maven-Aufruf in Listing 1 erzeugt
     Oracle Cloud Resources, wie z.B. Storage.          eine Verzeichnisstruktur für einen Heli-
         Aus Entwicklersicht ist der Ansatz von         don MP Service, die neben den üblichen              Unterschiedliche
     Helidon hochspannend: Entwickler kön-              Artefakten wie einer pom.xml und einer              Programmiermodelle
     nen sich je nach Use Case für eine Vari-           initialen Java-Projektstruktur sowie den
     ante entscheiden. Das Grundframework               erforderlichen Konfigurationsdateien (bei-          Helidon SE unterstützt ein funktionales,
     bleibt unverändert, einzig das Program-            spielsweise logging.properties) ein Do-             Helidon MP ein deklaratives Program-
     miermodell ändert sich. Das macht die              ckerfile sowie ein Kubernetes-Deployment-           miermodell. Was dies konkret bedeutet,
     Entwicklung effizienter und bietet mehr            Manifest enthält. Abbildung 4 zeigt dies            wird im Folgenden anhand von Beispie-
     Flexibilität bei der Umsetzung von Busi-           sehr detailliert. Analog zu dem in Listing 1        len erläutert. Der vollständige Code des
     ness-Anforderungen.                                dargestellten Aufruf zur Erzeugung eines            in diesem Artikel verwendeten Beispiels
                                                        Helidon MP-Projekts, wird ein Helidon SE-           findet sich in [7].
                                                        Projekt unter Verwendung des SE-spezifi-               Helidon-Applikationen haben immer
     Quickstart in die Helidon-                         schen Maven-Archetyps durchgeführt.                 eine zentrale Klasse, die sich für das Ap-
     Entwicklung                                            Wie Abbildung 4 zeigt, sind die resultie-       plikations-Bootstrapping verantwortlich
                                                        renden Projekte für Helidon SE und MP               zeichnet. In der Projektstruktur, die in Ab-
     Der initiale Start in die Microservice-Ent-        vom Aufbau her sehr ähnlich. Zur Aus-               bildung 4 gezeigt wird, ist dies die Klasse
     wicklung mit Helidon ist einfach: Für die          führungszeit funktionieren beide Servi-             Main.java. Hier erfolgen unter anderem
     Erzeugung eines initialen „Hello World“-           ces sogar exakt gleich: Sie bieten eine             die Runtime-Konfiguration und der Start

     Abbildung 4: Projektstruktur Helidon MP (links) und Helidon SE (rechts) (Quelle: Sven Bernhardt)

34     www.aoug.at • www.doag.org • www.soug.ch
static WebServer startServer() throws IOException {
         Config config = Config.create();
         ServerConfiguration serverConfig =
                  ServerConfiguration.create(config.get("server"));
         WebServer server = WebServer.create(serverConfig, createRouting(config));
         ...
 }

 private static Routing createRouting(Config config) {

            MetricsSupport metrics = MetricsSupport.create();
            GreetService greetService = new GreetService(config);
            HealthSupport health = HealthSupport.builder()
                    .addLiveness(HealthChecks.healthChecks())
                    .build();

            return Routing.builder()
                    .register(JsonSupport.create())
                    .register(health)
                    .register(metrics)
                    .register("/greet", greetService)
                    .build();
 }

Listing 2: Auszug aus dem Applikations-Bootstrapping einer Helidon SE-Applikation

der Applikation. Für Helidon MP sieht               public class GreetService implements Service {
diese Klasse übersichtlich aus, da große                ...
                                                        @Override
Teile des Bootstrapping implizit durch
                                                        public void update(Routing.Rules rules) {
das Framework erledigt werden. Hier-                        rules
zu zählen unter anderem das Laden der                           .get("/", this::getDefaultMessageHandler);
Server-Konfiguration aus der Datei mi-                  }
croprofile-config.properties sowie
                                                         private void getDefaultMessageHandler(ServerRequest request,
die Registrierung von Healthcheck- und                                                  ServerResponse response) {
Metrics-Endpunkten, über welche das                          sendResponse(response, "World");
Servicemonitoring erfolgt. Da in Helidon                 }
                                                         ...
SE-Applikationen wie erwähnt weitest-
                                                    }
gehend auf Framework-Magic verzich-
tet wird, müssen solche Dinge explizit im
Code deklariert werden.                           Listing 3: Routing-Regeln in Helidon SE
    Listing 2 zeigt, wie eine Helidon SE-Ap-
plikation konfiguriert wird. Die wichtigste
Komponente in diesem Zusammenhang                 Java EE-Umfeld bekannten JAX-RS-Mecha-        ergänzen und die Applikations-Konfigura-
ist die Routing-Komponente, die im Listing        nismen. Hierbei werden die entsprechen-       tion entsprechend anzupassen.
2 in der Methode createRouting initiali-          den Annotationen (zum Beispiel @GET,             Wie die Beispiele verdeutlichen, stellt
siert wird. In dieser Methode werden der          @ApplicationPath, @Path) verwendet,           Helidon MP viele Funktionen implizit be-
„Hello World“-Endpunkt sowie die Moni-            um HTTP-Methoden-Mappings, Applikati-         reit. Das muss nicht immer von Vorteil
toring-Endpunkte der Applikation initiali-        onspfade und anderes zu definieren.           sein: Die implizite Bereitstellung kann un-
siert und entsprechend registriert. Auch             Und es gibt noch weitere Unterschiede:     ter anderem Fehleranalysen erschweren,
die Definition von Request Routings muss          Sollen beispielsweise zusätzliche Frame-      wenn die Grundannahmen des Frame-
explizit ausimplementiert werden. Zu die-         work Features wie Tracing zur Erhöhung        works nicht erfüllt werden. Das Umbe-
sem Zweck werden in der Routing-Kom-              der Observability aktiviert werden, muss      nennen der Datei microprofile-config.
ponente entsprechende Routing-Regeln              in einer Helidon SE eine entsprechen-         properties ist dafür ein gutes Beispiel.
und zugehörige Request-Handler defi-              de Maven-Dependency hinzugefügt wer-
niert, wie Listing 3 zeigt.                       den. Die Verwendung einer Tracing-Kom-
    Die Registrierung von Routing-Regeln          ponente, wie sie in Listing 4 gezeigt wird,   Helidon und GraalVM
und Request-Handlern erfolgt in der up-           muss dafür explizit im Code implemen-
date-Methode, die jeder Helidon SE REST-          tiert werden.                                 Die Java Virtual Machine (JVM) gilt als
Serviceendpunkt implementieren muss.                 In einer Helidon MP-Applikation ge-        Standard-Laufzeitumgebung für Helidon-
    In Helidon MP erfolgt die Definition          nügt es, die entsprechende Maven-De-          Applikationen. Diese eignet jedoch nicht
von Request Routings über die aus dem             pendency für Tracing in der pom.xml zu        gleichermaßen für alle Einsatzszenari-

                                                                                                        Red Stack Magazin 03/2020             35
Development

      static WebServer startServer() throws IOException {
               ...
          final Tracer appTracer = TracerBuilder.create("helidon-se").build();

                 ServerConfiguration serverConfig = ServerConfiguration.builder(config.get("server"))
                         .tracer(appTracer).build();
                 ...
      }

     Listing 4: Open Tracing in Helidon SE-Applikationen

     en im Cloud-native-Umfeld. Aus diesem                 der beiden unterschiedlichen Frame-                  Über den Autor
     Grund bietet Helidon auch Support für                 work-Varianten macht Helidon interes-
     GraalVM an. [8]                                       sant, eröffnet dies doch mehr Spielraum              Sven Bernhardt arbeitet als Senior Solu-
        Bei GraalVM handelt es sich um eine                bei der Lösungsfindung für spezifische               tion Architect für die Opitz Consulting-
     von Oracle entwickelte hochperforman-                 Anforderungen.                                       Deutschland GmbH. Er konzipiert und im-
     te, flexible Virtual Machine, die als Lauf-              Allerdings existieren derzeit viele               plementiert zukunftsorientierte, robuste
     zeitumgebung für verschiedene Non-                    Open Source Frameworks, die einen spe-               Anwendungen. Sven Bernhardt arbeitet
     JVM-Sprachen (C/C++, JavaScript etc.)                 ziellen Fokus auf die Entwicklung Java-              in verschiedenen Projekten, die in den
     sowie für JVM-Sprachen (Java, Scala etc.)             basierter Microservices haben. Stärks-               Bereichen Cloud, Microservices und API-
     genutzt werden kann. GraalVM bietet                   te Konkurrenten neben Springboot sind                Management angesiedelt sind. In seiner
     einen Native Image Support, über den                  Quarkus und Micronaut. Es darf also mit              Rolle ist er an der Entwicklung und Kon-
     mithilfe des GraalVM Ahead-of-Time                    Spannung beobachtet werden, wie sich                 zeption von Best Practices in Bezug auf
     Compilers ein spezielles, für die Ziel-               Helidon gegen die Konkurrenz behaup-                 moderne Lösungsarchitekturen (http://
     plattform compiliertes Image erzeugt                  tet. Das Framework verfolgt eine groß-               omesa.io) beteiligt. Weiterhin ist Sven
     werden kann. Dieses kann schließlich                  artige Vision, die Releases erfolgen sehr            Bernhardt Oracle ACE Director und als
     nativ auf der Zielplattform ausgeführt                regelmäßig und die Community ist aktiv               Referent auf verschiedenen IT-Konferen-
     werden. Dieses native Image enthält alle              und wachsend. Beste Voraussetzungen                  zen aktiv.
     Abhängigkeiten und macht die Installa-                also, um die ersten Schritte mit Helidon
     tion einer Laufzeitumgebung überflüs-                 zu wagen!
     sig. Im Ergebnis führt dies zu kleineren
     Container-Images. Auch die Startup-Zei-
     ten einer Applikation können so extrem                Quellen / Zusatzmaterialien
     gesenkt werden, da keine Laufzeitumge-                [1] Quentin Hardy (2019): The problem with
     bung gestartet werden muss.                               „Cloud Native“, https://bit.ly/36APh5S,
        GraalVM unterstützt nicht alle JVM Fea-                zuletzt abgerufen am 14.01.2020
                                                           [2] Adam Wiggins (2017): The Twelve-Factor
     tures vollständig. So ergeben sich bei der                App, https://12factor.net/, zuletzt abge-
     Verwendung spezieller JVM-Features, wie                   rufen am 14.01.2020
     zum Beispiel Java Reflection, Einschrän-              [3] Pivotal Software (2020): Spring Boot 2.2.2,
                                                               https://spring.io/projects/spring-boot, zu-
     kungen bei der Benutzung der Virtual                      letzt abgerufen am 14.01.2020
     Machine (für eine vollständige Auflistung             [4] Eclipse Foundation (2020): Eclipse Micro-
     siehe [9]). Aus diesem Grund wird Graal-                  Profile, https://microprofile.io/, zuletzt
                                                               abgerufen am 14.01.2020
     VM aktuell nur für Helidon SE- Applikati-             [5] Netty Project (2019): Netty Project,
     onen supportet. Bei der Erzeugung eines                   https://netty.io/, zuletzt abgerufen am
     Helidon SE-Projekts wird, wie in Abbildung                14.01.2020
                                                           [6] Antoine Sabot-Durand, et al.: JSR 365:
     4 zu sehen ist, auch ein Dockerfile.na-
                                                               Contexts and Dependency Injection for
     tive angelegt, was für den Build eines                    Java 2.0, https://docs.jboss.org/cdi/spec/2.0/
     GraalVM Native-Image-basierten Contai-                    cdi-spec.html#spi, zuletzt abgerufen am
                                                               14.01.2020
     ners verwendet werden kann.
                                                           [7] Sven Bernhardt Github, https://github.
                                                               com/svenbernhardt/helidon-greeting-
                                                               service, zuletzt abgerufen am 14.01.2020
     Fazit                                                 [8] Oracle (2018, 2019): GraalVM, https://
                                                               www.graalvm.org/, zuletzt abgerufen am
                                                               14.01.2020
     Wie der Artikel zeigt, ist Helidon ein span-          [9] Oracle GitHub (2019): Native Image
     nendes Framework und eine ernsthafte                      Java Limitations, https://github.com/
                                                               oracle/graal/blob/master/substratevm/
     Alternative zu Springboot, wenn es um                     LIMITATIONS.md, zuletzt abgerufen am
     die Entwicklung Cloud-nativer Applikati-                  14.01.2020                                                  Sven Bernhardt
     onen geht. Vor allem die Unterstützung                                                                      sven.bernhardt@opitz-consulting.com

36     www.aoug.at • www.doag.org • www.soug.ch
Sie können auch lesen