© Evgeny Atamanenko/Shutterstock.com
Entwicklung eines GraphQL-API-Servers mit Spring Boot

In den Stiefeln von GraphQL


Bei GraphQL handelt es sich um eine Abfrage- und Manipulationssprache für APIs, mit der Clients individuell strukturierte Daten vom Server abrufen können. Bislang sind entsprechende GraphQL-Server vornehmlich in Node.js implementiert. Dabei gibt es von Spring Boot auch eine hervorragend integrierte Implementierung für Java. Dieser Artikel zeigt anhand eines Flugplanungssystems, wie einfach sich mit Spring Boot ein GraphQL-API-Server entwickeln lässt.

Spring Boot vereinfacht und beschleunigt die Entwicklung moderner Webanwendungen auf Java-Basis. Daher findet es gerade in den letzten Jahren immer mehr Anklang in der Java- und Spring-Entwicklergemeinde. Beispielsweise setzt das JHipster-Projekt auf Spring Boot für das Java Backend. Gleichzeitig lassen sich mit Spring Boot auch sehr gut neue Technologien in Spring integrieren und verwenden, etwa Streamingplattformen wie Apache Kafka oder In-Memory-Datenbanken wie Redis.

Dieser Artikel zeigt anhand eines Flugplanungssystems, wie einfach sich mit Spring Boot ein GraphQL-API-Server erstellen lässt. Das Datenmodell des Flugplanungssystems besteht aus einer Flugverbindung (Route) und den konkreten Flügen (Flight) auf dieser Flugverbindung (Abb. 1). Über das GraphQL API soll ein Client alle Flugverbindungen abrufen und neue Flugverbindungen erstellen sowie bestehende löschen und ändern können. Das API soll über OAuth2/JWT geschützt werden und Exception Handling unterstützen. Zusätzlich soll das API Benachrichtigungen an andere Clients schicken, sobald eine neue Flugverbindung erstellt wurde. Vor Auslieferung sollen Integrationstests das GraphQL API des Flugplanungssystems testen. Eine vollständige Implementierung des Beispiels ist unter GitHub [1] zu finden.

schaefer_graphql_1.tif_fmt1.jpgAbb. 1: Datenmodell des Flugplanungssystems

Was ist GraphQL?

GraphQL ist eine neue Technologie, die unter anderem für APIs eingesetzt werden kann – in etwa vergleichbar mit RPC, SOAP oder REST. GraphQL wurde 2012 von Facebook initiiert, um die bestehende RESTful API FQL abzulösen. 2016 gab Facebook GraphQL dann für die Öffentlichkeit frei. Dass Facebook so viel Zeit und Geld in ein neues API investiert hat, zeigt, dass REST nicht nur Vorteile, sondern auch einige Nachteile wie Overfetching, Underfetching oder auch die Endpoint Hell mit sich bringt. GraphQL unterstützt mit Client-directed Queries (CDQ) und Reactive Clients (RC) zwei Konzepte, die für moderne Webanwendungen besonders wichtig sind und einige Nachteile von REST ausräumen.

Unternehmen wie GitHub, Netflix oder XING setzen GraphQL bereits ein. APIs sind aber nicht nur für Start-ups oder Internetgiganten wichtig, sondern auch für Enterprises. Mit der Digitalisierung liefern diese immer mehr Webanwendungen an ihre Endkunden aus, und die Anforderungen an die User Experience steigen. Es ist daher auch für Enterprises wichtig, APIs im Backend zu entwickeln, die eine bessere User Experience im Frontend ermöglichen. Die von GraphQL unterstützten Konzepte CDQ und RC helfen ihnen dabei.

schaefer_graphql_2.tif_fmt1.jpgAbb. 2: GraphQL-Architektur

Abbildung 2 zeigt die GraphQL-Architektur mit den Komponenten Query Language, Schema Language, Engine und Resolver. GraphQL besteht aus einer Spezifikation der Komponenten, die über die Open Web Foundation [2] veröffentlicht wird. Eine Referenzimplementierung in JavaScript wird von Facebook über GitHub bereitgestellt [3]. Allerdings ist GraphQL nicht auf JavaScript beschränkt. Auch für alle anderen wichtigen Programmiersprachen wie C#, Go oder eben Java existieren GraphQL-Implementierungen für Client und Server.

GraphQL im Java-Universum

Es gibt verschiedene Java-Bibliotheken zum Thema GraphQL. Die drei wichtigsten sind GraphQL Java von Andreas Marek sowie GraphQL Java Tools und GraphQL Java Servlet von Michiel Oliemans. Die GraphQL-Java-Bibliothek wird unter der MIT-Lizenz auf GitHub bereitgestellt [4]. Die Implementierung orientiert sich an der bestehenden JavaScript-Referenzimplementierung, die Dokumentation ist unter [5] zu finden.

Die unter der MIT-Lizenz bereitgestellte GraphQL-Java-Tools-Bibliothek [6] setzt auf GraphQL Java auf. Sie unterstützt bei der Implementierung des API den Entwicklungsansatz Contract First. Das API muss also nicht programmatisch definiert, sondern kann mit Hilfe der GraphQL Schema Language beschrieben werden. Das Schema kann in einer Datei abgelegt, editiert, versioniert und verteilt werden. Ein weiterer wichtiger Punkt ist das Mapping des Schemas auf Resolver in Java. Vorlage der Implementierung war die JavaScript-Implementierung von Apollo. Die Dokumentation ist unter [7] zu finden.

Sollen GraphQL APIs über HTTP aufgerufen werden, wird die GraphQL-Java-Servlet-Bibliothek benötigt. Die GraphQL-Query kann vom Client über GET mit Queryparametern oder über einen POST im Body übergeben werden. Das Servlet kann als Standalone Servlet in eine Java-EE-Servlet-Anwendung eingebaut oder – sofern bereits ein Servlet existiert – als Servlet Listener eingebunden werden. GraphQL Java Servlet kann mit GraphQL Express in der Node.js-Welt verglichen werden und wird wie GraphQL Tools unter der MIT-Lizenz bereitgestellt.

Starter in Spring Boot

Eine herausragende Eigenschaft von Spring Boot ist, dass Entwickler neue Technologien sehr einfach und schnell in das Spring-Boot-Ökosystem integrieren können. Dabei müssen sie nicht auf die Releasezyklen von Spring Boot warten, für die Pivotal verantwortlich ist, sondern können die Integration selbst implementieren oder bereits existierende Implementierungen verwenden.

Spring Boot ist damit ein offenes Ökosystem. Die Konzepte hinter diesem Ökosystem sind Spring Boot Starter und Autoconfiguration. Ein Starter definiert für den Build-Prozess in einem Maven POM alle Bibliotheken, die für die Integration einer Technologie benötigt werden. Maven oder Gradle binden den Starter dann in die Anwendung ein. Autoconfiguration liefert zur Laufzeit die Spring-Konfiguration dazu, um automatisch die erforderlichen Spring Beans zu erzeugen, damit die Technologie in Spring Boot funktioniert. Die Autoconfiguration wird mit dem Starter im POM referenziert.

GraphQL Starter für Spring Boot

Auch GraphQL wird über Starter in Spring Boot integr...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang