Fokusthema

Client-Directed Queries

Applikationen, die auf SOAP- oder REST-Architekturen setzen, haben sich im letzten Jahrzehnt bewährt. Es gibt jedoch Grenzen dieser Architekturen. Der Ansatz von Client-Directed Query überwindet diese Grenzen und ermöglicht eine generische Anbindung von unterschiedlichen Clients an dasselbe Backend. Die Clients lassen sich so zu einem beliebigen Zeitpunkt definieren, mehrere Datenanfragen zu einer einzigen zusammenfassen und obendrein entscheidet der Client selbst über die Granularität der Daten.

Was sind Client-Directed Queries?

Das Prinzip des Client-Directed Query sieht vor, einem oder mehreren Clients so weit wie möglich die Kontrolle über den Inhalt und die Granularität ihrer vom Backend benötigten und gelieferten Daten zu überantworten. So lässt sich eine Vielzahl von einzelnen REST-, SOAP- oder RPC-Schnittstellen durch eine einzelne, zentrale Schnittstelle für alle Client-Anwendungen ersetzen.

Der Mehrwert: Jede Client-Anwendung kann ihre individuellen Datenabfragen anhand einer DSL-basierten Abfragesprache definieren und stets die im aktuellen Anwendungskontext benötigten Daten abrufen. Starre, vordefinierte Schnittstellen weichen damit einer flexiblen und ausdrucksstarken Abfrageschnittstelle. Diese Datenabfragen fördern das Uniform Access Principle, sodass Lese- und Schreibzugriffe über dieselbe Notation der Attribute ermöglicht wird. Beispiel: Anstatt getSurname zum Lesen und setSurname zum Schreiben zu verwenden, kommt in beiden Fällen schlicht surname zum Einsatz.

Unter anderen GraphQL, Falcor sowie die verschiedenen SQL-Dialekte für relationale Datenbanksysteme basieren auf dem Prinzip der Client-Directed Queries.

DSL (Domain-Specific Language)

DSL ist die Abkürzung für den englischen Fachbegriff Domain-Specific Language, dt. domänenspezifische Sprache. Im Gegensatz zu Universalsprachen sind domänenspezifische Sprachen auf eine bestimmte fachliche Domäne zugeschnitten und nur innerhalb dieser verwendbar. Ihr Fokus liegt auf der Interaktion zwischen Mensch und Maschine.

SQL
Uniform Access Principle

Buzzword-Factor

gering
gering
mittel
mittel
hoch
hoch

Client-Directed Queries versprechen eine konkrete Lösung für die systemimmanenten Probleme des REST-Architekturstils.

Einstiegshürde

gering
gering
mittel
mittel
hoch
hoch

Client-Directed Queries lassen sich problemlos im Zuge kleinerer Projekte erstmalig umsetzen. Die Anlaufphase ist eher gering.

Mehrwert

gering
gering
mittel
mittel
hoch
hoch

Die entstehenden Schnittstellenlösungen sind sehr flexibel, einfach zu warten und mit deutlich geringeren Kosten verbunden.

Was ist GraphQL?

GraphQL ist eine Datenabfrage- und Manipulationssprache, die das Prinzip der Client-Directed Queries umsetzt. Daten lassen sich sowohl lesen, schreiben als auch abonnieren. Dabei entscheidet stets der Client, welche Daten er in welchem Umfang und welcher Struktur abrufen möchte. So vermeidet GraphQL das sonst mit REST auftretende Overfetching, Underfetching sowie Chunking.

Das Prinzip von GraphQL ist dabei sehr einfach. Der Client formuliert die gewünschte Datenstruktur in JSON. Der Server analysiert die Datenstruktur, stellt die Daten zusammen und liefert sie ebenfalls als JSON-Struktur zurück. Dadurch kann der Client sowohl komplexe, hierarchische Struktur definieren, als auch Einschränkungen bei der Feld- und Datenauswahl vornehmen.

Facebook hat GraphQL 2012 zunächst intern für die eigenen Anwendungen entwickelt und 2015 als Open Source bereitgestellt. Neben einer Referenzimplementierung für Javascript existieren weitere für alle wichtigen Sprachen, etwa Java, C# oder Ruby. Mittlerweile hat Facebook das GraphQL-Projekt an die GraphQL Foundation und somit schlussendlich an die Linux Foundation übergeben.

Eine einfache Beispielabfrage:

{
  me {
    givenname
    surname
  }
}

Eine mögliche Beispielantwort:

{
  "me": {
    "givenname": "Luke"
    "surname": "Skywalker"
  }
}

TechDOSSIER: Client-Directed Query

Unsere TechDOSSIERs fassen wichtige Themen und Trends produktneutral und kompakt zusammen. Dabei bereiten wir komplexe Technologie-Aspekte entsprechend den Informationsbedürfnissen von Führungskräften und Managern auf, indem wir explizit bestimmte Eigenschaften der Themen und Trends beleuchten. Unter anderem liefern wir Definitionen, beschreiben das Potenzial, nennen äußere Einflussfaktoren, legen ein Anwendungsszenario auf und erläutern die Einstiegshürden.

Welche Vorteile bietet GraphQL gegenüber RPC, SOAP oder REST?

SOAP und REST lassen sich grundsätzlich als auf Webtechnologien basierende Varianten des klassischen RPCs verstehen lassen. Das Basiskonzept ist also ein Funktionsaufruf. SOAP fokussiert sich dabei auf die Bereitstellung von Services, REST hingegen auf Ressourcen. Während REST kein bestimmtes Format für die Repräsentation der Daten vorgibt, setzt SOAP zwingend den Einsatz von XML voraus. Das liegt daran, dass SOAP schlussendlich eine Weiterentwicklung von XMLRPC ist. Die per SOAP übermittelten Daten sind deshalb oft unnötig aufgebläht. Bei REST hat sich das grundsätzlich schlankere JSON zur Datenrepräsentation durchgesetzt.

Hinter GraphQL steckt ein Query-Konzept. Wie bei SOAP und REST kommt als Transportweg ebenfalls HTTP zum Einsatz, die Abfragen und Antwort sind in JSON respräsentiert. Dadurch fällt immer noch ein spürbarer Overhead an, der sich durch geschickte Formulierung der Abfragen allerdings kompensieren lässt.

Einen Schritt weiter geht das Echtzeit-Kommunikations-Framework GraphQL IO. Als Transportweg nutzt es Websocket und für die Datenrepräsentation wahlweise JSON oder CBOR. Der Overhead bleibt deshalb stets gering. Ein weiterer Vorteil: GraphQL IO ist echtzeitfähig. Clients können bestimmte Daten abonnieren und werden vom Server informiert, sobald sich die Daten ändern. Die Benachrichtigung über die Änderung sowie der nachfolgende Abruf der Daten übernimmt das GraphQL-IO-Framework selbständig. Der Aufwand bei der Entwicklung eines Echtzeit-Clients bleibt somit gering.

Echtzeit-Kommunikation mit GraphQL IO

Weitere Einblicke in die Unterschiede zwischen RPC, SOAP, REST und GraphQL sowie für die Vorteile von GraphQL IO für die Echtzeit- und Omnichannel-Kommunikation bietet der Artikel Echtzeit-Kommunikation mit GraphQL I/O bei heise Developer.

Artikel lesen!

Working Draft Podcast 382: GraphQL

In Revision 382 des Working Draft Podcasts beleuchtet Ralf Engelschall, Leiter von msg Applied Technology Research, detailliert die Unterschiede zwischen REST und GraphQL. Gleichzeitig benennt er die jeweiligen Vor- und Nachteile, erklärt es technisch sowie funktional und schilder ein Beispiel aus seiner täglichen Arbeit.

Podcast anhören!

Vergleich zwischen RPC, SOAP, REST, GraphQL und GraphQL IO

GraphQL und GraphQL IO basieren auf dem Prinzip der Client-Directed Queries. Damit unterscheiden sie sich deutlich von den etablierten Varianten SOAP und REST, sowohl hinsichtlich des Fokusses als auch des Overheads. Nur GraphQL IO ist vollständig echtzeitfähig.

EigenschaftRPCSOAPRESTGraphQLGraphQL I/O
BasiskonzeptFunktionsaufrufFunktionsaufrufFunktionsaufrufQueryQuery
FokusFunktionServiceRessourceClientClient
TransportTCPHTTPHTTPHTTPWebsocket
AggregationClientServerServerClientClient
RepräsentationBinärXMLbeliebigJSONJSON, CBOR
Overheadgeringgroßmittelmittelgering
Echtzeitneinneinneinneinja
AnsatzContract firstContract firstCode first oder Contract firstContract firstCode first & Contract first

Was genau ist GraphQL IO?

GraphQL-IO basiert auf GraphQL und ist ein Framework zur Echtzeit-Netzwerkkommunikations in JavaScript. Die Clientseite läuft entweder unter Node.js oder im Browser, die Serverseite nur unter Node.js. Das Framework steht unter der MIT-Lizenz.

Während GraphQL nur eine formale Sprachspezifikation ist und GraphQL.js eine Referenzimplementierung einer entsprechenden Runtime, ist GraphQL-IO eine auf GraphQL basierende, All-In-One-Netzwerkkommunikationslösung für Client und Server.

Es integriert die notwendigen Bibliotheken von Drittanbietern, bietet eine komfortable und flexible API und unterstützt insbesondere Echtzeit-Updates von GraphQL-Abfragen (auch bekannt als GraphQL-Abonnements) über einen leistungsstarken, gerahmten und optional komprimierten Websocket-Kanal.

Die Architektur von GraphQL IO

Wie kann man sich die Echtzeit-Aktualisierung mit GraphQL vorstellen?

Das Video zeigt die Echtzeit-Netzwerkkommunikation mit GraphQL IO am Beispiel der Abstimmungsapp Vote.

Der Multi-User-Test zeigt, wie die Aktion eines Anwenders direkt eine Rückmeldung bei den anderen Anwendern auslöst.

"REST is bad, REST is dead." Auch wenn überall REST zum Einsatz kommt, bedeutet es nicht, dass es sich dabei um die stets beste Technologie zur Verbindung von Frontend und Backend handelt. Häufig werden die Möglichkeiten, die REST bietet, gar nicht richtig ausgeschöpft. Oder REST verursacht unnötige Komplexität. Welche Probleme REST mit sich bringt und wie sich diese mit GraphQL besser adressieren lassen, erklärt dieser Vortrag.

Dies ist eine deutschsprachige Aufnahme der Präsentation "Realtime Applications with GraphQL" von Ralf S. Engelschall, Direktor der msg Applied Technology Research, die erstmalig auf der EnterJS 2018 gehalten wurde.

Was brauche ich, um GraphQL in Java-Projekten zu nutzen?

Obwohl die Referenzimplementierung von GraphQL für Javascript vorliegt, lässt sich GraphQL mit jeder beliebigen Sprache nutzen. Java, das im Umfeld betrieblicher Informationssysteme noch immer stark verbreitet ist, stellt dabei keine Ausnahme dar.

Insbesondere in Verbindung mit Spring Boot lassen sich somit in kürzester Zeit Anwendungen um GraphQL erweitern. Zudem stehen relevante Open-Source-Bibliotheken für Spring Boot bereit, so dass die Entwicklungszeit nochmals sinkt.

Die Grundlagen der Umsetzung und eine Beispielanwendung finden sie im Artikel Spring Boot in den Stiefeln von GraphQL von Michael Schäfer, veröffentlicht im Java Magazin.

GraphQL Java

Die GraphQL Java Bibliothek steht unter der MIT-Lizenz auf Github bereit. Dessen Implementierung orientiert sich an der bestehenden Javascript-Referenzimplementierung.

GraphQL Java Tools

Die GraphQL Java Tools Bibliothek unterstützt bei der Implementierung des APIs den Entwicklungsansatz Contract First. Das API wird nicht programmatisch definiert, sondern mittels der GraphQL Schema Language beschrieben.

GraphQL Java Servlet

Die GraphQL Java Servlet Bibliothek ermöglicht den Zugriff auf die GraphQL-APIs per HTTP. Queries lassen sich per GET mit URL-Parametern oder über einen POST im Body übergeben. Das Servlet funktioniert zudem als Standalone-Servlet oder auch als Servlet Listener.

Welche Schulungs- und Weiterbildungsmöglichkeiten für GraphQL bestehen?

Wir bieten Ihnen sowohl bereits geplante und erprobte Schulungen zu Webservices, Client-Directed Queries und GraphQL an, als auch individuelle Coachings und Workshops zugeschnitten auf Ihre Bedürfnisse. Kontaktieren Sie uns!

Webservices-Schulung

  • Eintägige Schulung auf Deutsch
  • Webservices-Grundlagen
  • REST-Standards
  • REST-Einsatz
  • SOAP-Standards
  • SOAP-Einsatz
  • Enterprise Service Bus

GraphQL-Schulung

  • Eintägige Schulung auf Deutsch
  • Grundlagen von GraphQL
  • Queries, Mutations, Resolver
  • Schema Discription Language
  • Subscriptions
  • Echtzeit-Kommunikation
  • Java- & Javascript-Implementierung

Individual-Training

  • ein- oder mehrtägiges Training auf Deutsch
  • RPC- und querybasierte Webservices
  • Methoden, Techniken, Tools
  • Pattern, Architektur, Best Practices
  • Implementierung und Betrieb
  • Anforderungs- und Bedarfsanalyse
  • Wissensmultiplikation

REST is bad,
REST is dead.

- Ralf S. Engelschall

Wer sind die Ansprechpartner für dieses Thema?

Nehmen Sie Kontakt zu unseren Themenexperten auf. Sie beraten sie hinsichtlich Architektur, Methodik und Schulungen.

Ralf S. Engelschall

Leiter msg Applied Technology Research
Executive IT Consultant

Michael Schäfer

Principal IT Consultant

Achim Müller

Lead IT Consultant