13 Java-Frameworks für felsenfeste Mikrodienste

Es war eine lange Reise für Java, eine Sprache, die als Verkehrssprache für die Box auf dem Fernseher begann, als die Fernseher nicht mit integriertem Roku oder Chromecast ausgestattet waren. Dann würde Java das World Wide Web besitzen, indem es den Browser animierte, bevor JavaScript hinzukam und ihn aus dem Weg räumte.

Java fand schließlich eine Nische in den Serverfarmen, in denen es einmal genug verschiedene Chip-Architekturen und Betriebssysteme gab, um das Versprechen „Schreiben, einmal überall ausgeführt“ überzeugend zu machen. Und in diesen Serverfarmen hat Java weitergelebt, ein Favorit von IT-Shops für Unternehmen, die von Zuverlässigkeit abhängig sind, und von Entwicklern mit einer Vorliebe für starkes Tippen.

In der Zwischenzeit haben JavaScript im Allgemeinen und Node.js im Besonderen Java auf dem Server herausgefordert und mit ihrem hohen Durchsatz und ihrer threadfreien Geschwindigkeit einen großen Teil des Datenverkehrs im Web übernommen. Node hat die Fantasie der neuesten serverseitigen Programmierer erweckt, indem es nicht nur Geschwindigkeit und Ressourceneffizienz bietet, sondern auch die Einfachheit des Codes, der sowohl auf dem Client als auch auf dem Server ausgeführt wird.

Trotz des zunehmenden Wettbewerbs überlebt Java nicht nur, sondern zeichnet sich auch weiterhin aus. Viele der mit der Entwicklung von Microservice-Architekturen beauftragten Teams verwenden weiterhin Java. Ein Hauptgrund muss sein, dass die Technologie seit Jahren an vorderster Front an der Front getestet wird, um HTTP-Anfragen zu analysieren. Sun hat eine solide virtuelle Maschine erstellt, die Oracle weiterhin fördert und unterstützt.

Ein weiterer Grund muss die ständige Weiterentwicklung der Sprache sein. Java 8 bietet solide Unterstützung für funktionale Sprachen wie Scala und Kotlin. Die JVM ist jetzt eine Grundlage für viele der besten Experimente in der Entwicklung von Computersprachen. Dutzende neuer Sprachen können bis zu Java-Bytecode kompiliert und miteinander verknüpft werden, damit komplexe Projekte zusammenarbeiten. Viele der Stapel, die auf einer JVM reibungslos ausgeführt werden, werden möglicherweise von einer Mischung aus Java und einer Reihe anderer Sprachen erstellt.

Der größte Grund muss jedoch die Trägheit sein. Während ich schreibe, sind 371 Jobs für COBOL-Programmierer auf Dice aufgelistet. Es gibt viele, viele weitere Jobs mit dem Wort Java. Ist es nicht verwunderlich, dass intelligente Teams ihre riesigen Stapel alternden Java-Codes betrachten und denken, dass die einfachste Lösung darin besteht, eine Seitentür hinzuzufügen, die die Daten als JSON-Datenstrukturen ausspuckt? Voilà. Der alte Code läuft weiter, wirkt aber an diesen Seitentüren wie ein moderner Microservice.

All diese und weitere Optionen stellen sicher, dass Java weiterhin eine wichtige Rolle bei der Revolution der Mikroservices spielt. Und es ist keine Überraschung, dass die Java Open Source-Community mitgemacht hat und viele neue Optionen für Java-Programmierer geschaffen hat, die ihren Java-Code lehren müssen, wie ein Microservice zu sprechen.

Hier ist eine Liste von 13 Open Source-Optionen, mit denen Java-Entwickler überall Lösungen entwickeln, die die Grundlage für Microservice-Architekturen bilden.

Frühlingsstiefel

Die Java-Welt hat lange Zeit Spring-Anwendungen erstellt. Spring Boot ist eine spezielle Version von Spring, die den Vorgang erheblich vereinfacht, indem viele Konfigurationsdetails für Sie verarbeitet werden. Spring Boot wurde entwickelt, um den Start von Spring-Projekten jeglicher Art zu automatisieren, nicht nur von Microservices. Um die Sache noch einfacher zu machen, mischt Spring Boot nach Abschluss der Anwendung einen Webserver ein und spuckt eine einzelne JAR-Datei aus, die so ziemlich alles ist, was Sie außer der JVM benötigen. Stellen Sie sich das als den ursprünglichen Docker-Container vor.

All diese Klugheit wird von vielen Leuten geschätzt, die mit dem Aufbau von Microservices beauftragt sind, da die gesamte Konfiguration ärgerlich wird, wenn Sie sie für jedes der rund ein Dutzend Microservices immer wieder ausführen müssen. Wenn Spring Boot dies automatisieren kann, ist es viel einfacher, mehrere Dutzend Microservices zu produzieren.

Die mit Spring entwickelten Microservices folgen der gleichen MVC-Philosophie wie die Makro-Webanwendungen, die wir seit Jahren erstellen. Das Framework verfügt über alle tiefen Verbindungen, die über Jahre der Java-Entwicklung aufgebaut wurden, einschließlich der Integration in alle wichtigen und kleinen Datenspeicher, LDAP-Server und Messaging-Tools wie Apache Kafka. Es gibt auch Dutzende kleiner und weniger kleiner Funktionen zum Verwalten einer laufenden Sammlung von Servern, Funktionen wie Spring Vault, ein Tool zum Verwalten der Geheimnisse, Kennwörter und Anmeldeinformationen, die von den Servern in der Produktion benötigt werden. All diese Vorteile zeigen, warum sich Java-Programmierer seit vielen Jahren dem Zug anschließen.

Eclipse MicroProfile

Im Jahr 2016 haben sich einige Fans der Java Enterprise-Community umgesehen und beschlossen, die gesamte Cruft aus der Java Enterprise Edition zu entfernen, damit die Benutzer einfache Microservices mit den klassischen Teilen erstellen können. Sie warfen eine überraschende Anzahl von Bibliotheken weg, behielten jedoch Code für die Verarbeitung von REST-Anforderungen, das Parsen von JSON und das Verwalten der Abhängigkeitsinjektion bei. Das Ergebnis, Eclipse MicroProfile genannt, war schnell und einfach.

Seitdem hat die MicroProfile-Community einen Pakt geschlossen, um neue Versionen so oft wie vierteljährlich zu veröffentlichen und gleichzeitig neuen Code hinzuzufügen, damit die Microservices reibungslos und sicher funktionieren. Der Entwicklungsprozess und die Codestruktur sind jedem bekannt, der in der Java EE-Welt gelebt hat, aber die endlosen Konfigurationsprobleme wurden beseitigt. Es ist ein Beweis dafür, dass Sie alten Hunden neue Tricks beibringen können.

Dropwizard

Als Dropwizard 2011 erschien, öffnete es den Java Enterprise-Entwicklern die Augen dafür, wie wenig Code wirklich benötigt wurde. Das Dropwizard-Framework lieferte ein sehr einfaches Entwicklungsmodell mit vielen wichtigen Entscheidungen, die für Sie getroffen wurden, und es ist diesem Weg weiter gefolgt. Sie fügen eine Geschäftslogik hinzu und dann wird so ziemlich alles andere gemäß der Konvention für Sie konfiguriert. Das Ergebnis sind schlanke JAR-Dateien, die Benutzer für ihren schnellen Start loben.

Die größte Einschränkung kann das Fehlen einer Abhängigkeitsinjektion sein. Wenn Sie die Abhängigkeitsinjektion verwenden möchten, um Ihren Code sauber und lose gekoppelt zu halten, müssen Sie die Bibliotheken selbst hinzufügen. Anders als in der Frühlingswelt gibt es keine Dropwizard-Methode, um dies zu tun. Die meisten anderen Luxusartikel werden jetzt unterstützt, einschließlich Protokollierung, Integritätsprüfungen und Code, der die Ausfallsicherheit gewährleistet. Sie müssen nicht zu viele Opfer bringen.

WildFly Thorntail

Die Mitarbeiter von Red Hat haben ihre eigene Version von MicroProfile mit einem raffinierten Konfigurationstool erstellt. Das Framework hieß ursprünglich WildFly Swarm, wurde dann aber in Thorntail umbenannt. Auf der Thorntail-Website können Sie Ihre eigene Maven-Build-Datei erstellen, indem Sie die gewünschten Funktionen angeben. Maven kümmert sich dann um die Montage von allem.

Thorntail erkennt auch die wichtigsten Komponenten, die Sie benötigen, indem Sie Ihren Code scannen. Sie können dies jedoch mit einer Stücklistendatei (Stückliste) überschreiben. Wenn alles läuft, entfernt Thorntail die Teile der Java Enterprise Edition, die nicht verwendet werden, und erstellt eine JAR-Datei, die klein und bereit ist, mit einem Befehl bereitgestellt zu werden - eine raffinierte Funktion, mit der das Thorntail-Projekt sie als Uber bezeichnen kann -KRUG. Dies ist ein weiterer Ansatz, um der Tradition der Java Enterprise Edition zu folgen, ohne das gesamte schwere Gepäck aufzubewahren.

Helidon

Helidon ist seit den Pressemitteilungen und dem ersten Commit für das GitHub-Repository erst seit einigen Monaten nicht mehr verfügbar, aber das Framework zieht bereits die Aufmerksamkeit auf sich, die der Support von Oracle garantiert. Obwohl das Java-Universum riesig ist, dreht sich immer noch viel um Oracle. 

Helidons Architekten folgten vielen der gleichen Themen, die in den anderen Projekten hier wiederholt werden. Rippen Sie die Java Enterprise Edition-Cruft heraus und behalten Sie den leichten, servletbasierten Kern, der das Vertrauen der Welt verdient hat. In Helidons Fall begannen die Entwickler mit Netty und fügten gerade genug Code hinzu, um Routing und Fehlerbehandlung durchzuführen. Um die Sache interessant zu machen, umfassten sie zwei Grundmodelle für den Code, die sogenannten SE- und MP-Versionen.

Helidon SE wird den Programmierern von Node.j mit den langen Ketten von Funktionsaufrufen, die durch Punkte verbunden sind, sehr vertraut erscheinen. Helidon MP wird den Java-Programmierern, die JAX-RS verwenden, vertrauter erscheinen. Es gibt auch einige nützliche und geschätzte Tools zum Überprüfen des Zustands von Servern oder zum Verfolgen des Datenflusses durch eine Gesamtstruktur von Mikrodiensten. Dies sind zwingende Gründe, das Potenzial auch ohne die Unterstützung von Oracle zu erkunden.  

Kricket

Ein weiteres Framework für eine schnelle API-Entwicklung ist Cricket. Cricket ist klein, obwohl es einige Extras wie einen Schlüsselwert-Datenspeicher enthält, um zu verhindern, dass Sie eine Datenbank und einen Scheduler verbinden, um die sich wiederholende Hintergrundverarbeitung zu steuern. Es gibt keine anderen Abhängigkeiten, die Komplikationen oder Lock-In verursachen. Daher ist es ziemlich einfach, Ihren Code zu Cricket hinzuzufügen und einen unabhängigen Microservice zu starten.

Jersey

Einer der Standardansätze für die Entwicklung eines Webdienstes ist die Java-API für RESTful Web Services (auch bekannt als JAX-RS), eine allgemeine Spezifikation, die im Jersey-Framework implementiert wurde. Der Ansatz hängt stark von der Verwendung der Anmerkungen ab, um die Pfadzuordnung und die Rückgabedetails anzugeben. Alles andere aus dem Parsen der Parameter und dem Packen des JSON wird von Jersey übernommen.

Der Hauptvorteil von Jersey besteht darin, dass es den JAX-RS-Standard implementiert, eine Funktion, die wünschenswert genug ist, dass einige Entwickler Jersey mit Spring Boot kombinieren, um beide gemeinsam zu genießen. 

abspielen

Eine der besten Möglichkeiten, die sprachübergreifende Leistungsfähigkeit der JVM zu erleben, ist das Play-Framework, ein Stapel Scala-Code, der mit Java oder einer der anderen JVM-Sprachen verknüpft ist. Die Grundlage ist sehr modern, mit einem asynchronen, zustandslosen Modell, das den Server nicht mit endlosen Threads überlastet, die versuchen, die Benutzer und ihre Sitzungsdaten zu verfolgen. Es gibt auch eine Reihe zusätzlicher Funktionen, mit denen eine Website wie OpenID, Validierung und Unterstützung für das Hochladen von Dateien erweitert werden kann.

Die Play-Codebasis hat sich seit mehr als einem Jahrzehnt weiterentwickelt, sodass Sie auch Echos längst vergessener Zeiten wie die Unterstützung von XML finden. Das Spiel ist sowohl ausgereift als auch geschmeidig, eine Kombination, die in freier Wildbahn selten sein kann.

Stolzieren

Das Erstellen einer API mag so einfach erscheinen wie das Schreiben von Code, der einen Port überwacht und Antworten liefert, aber die Entwickler von Swagger sind sich einig. Sie haben eine komplette API-Spezifikationssprache namens OpenAPI erstellt, mit der Sie darlegen können, was Ihre API tun wird. Dies scheint ein zusätzlicher Schritt zu sein, aber das Swagger-Team hat auch Code bereitgestellt, der diese Spezifikation in automatisierte Tests, Dokumentationen und mehr umwandelt.

Die einfache, fast spartanische Beschreibung einer API in der Swagger-Konfigurationsdatei wird in Java-Code umgewandelt, um die Schnittstelle zu implementieren, ihr Verhalten zu dokumentieren und eine Reihe von Tools zum Testen des darunter erstellten Codes bereitzustellen. Es gibt sogar einen Mechanismus für die API-Governance, mit dem Sie mit den ungewaschenen Massen arbeiten können, die bald an die Tür Ihrer API klopfen und Antworten erwarten.

Swagger ist ein Ökosystem für APIs und nicht auf Java beschränkt. Wenn Ihr Team zu Node.js oder einer von mehreren Dutzend anderen Sprachen wechselt, wartet ein Swagger Codegen-Modul darauf, Ihre OpenAPI-Spezifikation in eine Implementierung in dieser Sprache zu konvertieren.

Restlet

Einer der größeren Unterschiede zwischen den verschiedenen Frameworks ist die Anzahl der Verbindungen zu anderen Diensten und Bibliotheken. Das Restlet-Projekt bietet eine der größeren Sammlungen von Funktionen und Verbindungen. Es ist bereits in Bibliotheken wie JavaMail integriert, falls Ihr Microservice POP, IMAP oder SMTP mit einem Mailserver sprechen muss, und Lucene / Solr, falls Sie durchsuchbare Indizes für große Textblöcke und die umhüllten Metadaten erstellen möchten es.

Die Möglichkeiten in Restlet bleiben einfach bestehen, da dieser Stapel im Allgemeinen mehrere verschiedene Optionen für jedes Teil unterstützt. Sie müssen beispielsweise kein JSON verwenden, da der Code XML, CSV, YAML und einige weitere Dateiformate verarbeitet. Sie erhalten verschiedene Optionen für die Vorlagen zur Strukturierung Ihrer Antwort. Eine der besseren zusätzlichen Funktionen ist der Restlet-Client, mit dem Sie Ihre APIs über den Chrome-Browser testen können.

Quetschen

Das Debuggen von Microservices ist oft eine echte Herausforderung, da die Teile so lose miteinander verbunden sind und es schwierig ist, den Datenfluss durch alle Ebenen des Systems zu verfolgen. Mit Squash können Sie Haltepunkte in Ihrem Code einrichten, der auf einem Kubernetes-Cluster ausgeführt wird, und dann alle Daten in Ihrer IDE zurückerhalten, als wäre es Code, der lokal ausgeführt wird. Squash lässt sich auch in die Laufzeiten von Node.js und Python integrieren, falls Ihre Sammlung von Microservices nicht nur Java ist.

Telepräsenz

Eine weitere Option zum Debuggen ist die Verwendung von Telepresence, um einen lokalen Proxy für einen Mikrodienst in einem entfernten Kubernetes-Cluster zu erstellen. Ihre Anrufe für diesen Dienst werden an die lokale Version weitergeleitet, in der Sie Haltepunkte einrichten oder alles andere tun können, was Sie sich auf Ihrem lokalen Computer vorstellen können.

Zipkin

Zipkin ist ein Mechanismus zum Protokollieren von Ereignissen auf verschiedenen Mikrodiensten und zum anschließenden Korrelieren der Ereignisse, sodass Probleme isoliert und untersucht werden können, wenn sie sich durch die Sammlung von Maschinen ziehen. Es gibt eine Zipkin-Implementierung für Java sowie mindestens sechs weitere Sprachen, sodass mehrsprachige Systeme in Angriff genommen werden können. Einige der anspruchsvollsten Frameworks wie Spring haben Zipkin bereits in irgendeiner Form integriert.