Cloud-native Microservice-Entwicklung mit Helidon - Opitz ...
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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
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