REST, GraphQL und gRPC Vergleich Teil 2: Konzepte & Architektur

Von: Thomas Bayer
Datum: 31. Januar 2021

REST, GraphQL und gRPC dienen dem Austausch von Nachrichten über das HTTP bzw. HTTP/2 Protokoll. Abgesehen von dieser Gemeinsamkeit gibt es große Unterschiede im Ansatz und bei den Konzepten der drei Technologien. Dieser Teil des Artikels beschreibt die unterschiedlichen Ansätze.

Die anderen Teile dieses Artikels beschreiben die folgenden Themen:

1. Der Architekturstil REST

Bei REST geht es um die Abfrage und Manipulation von Geschäftsobjekten über Ressourcen. Jede Ressource hat einen Namen, die URI. Beispielsweise könnte ein Produkt eines Shops die folgende URI besitzen:

Der Link ist gleichzeitig die Adresse und der Name eines Geschäftsobjektes. Wenn du auf Link klickst solltest du eine Kopie der Daten, eine Repräsentation angezeigt bekommen. Die Repräsentation ist Teil des Namens: Representational State Transfer.

Die Abfrage und Manipulation von Ressourcen erfolgt über eine begrenzte Anzahl von Methoden, meist sind es nicht mehr als vier oder fünf. Als Ausgleich gibt es einen großen Gestaltungsspielraum bei der Vergabe von Namen für die Ressourcen, also für die URIs bzw. Pfade.

Das Ändern einer Ressource erfolgt über das Senden einer Repräsentation mit neuen Inhalten. Eine Repräsentation ist nichts anderes als eine Kopie der Daten eines Geschäftsobjektes. Das Beispiel unten zeigt einen Aufruf, der ein neues Produkt anlegt. Die URL adressiert die Ressource und das JSON Dokument im HTTP Body ist die Repräsentation.

POST https://api.predic8.de/shop/products/
Content-Type: application/json

{
    "name": "Tollkirsche",
    "preis": 7.99
}
Listing 1: Anlegen einer neuen Ressource mit POST

Die Konzepte von HTTP werden bei REST auch auf der Anwendungsebene verwendet. Beispielsweise werden die HTTP Status Codes als Errorcodes verwendet. Wird bei einer Anfrage ein Geschäftsobjekt nicht gefunden, so antwortet der Server mit dem Status Code:

404 Not Found

Im Web bedeutet dieser Code, dass es die angefragte Seite nicht gibt. Bei REST wird das Netzwerkprotokoll nicht vor der Anwendung verborgen, sondern es wird bewusst als Gestaltungsmittel eingesetzt und ist im Code der Anwendung als Status Code oder HTTP Header sichtbar.

2. GraphQL

GraphQL ist mit der Datenbankabfragesprache SQL vergleichbar. Der Client hat bei der Formulierung seiner Abfragen einen großen Spielraum und der Server interpretiert die Anfrage, um die gewünschte Antwort zu erzeugen. Analog zu den Datenbanken, gibt es bei GraphQL Beziehungen zwischen Objekten, die wie bei einem Join mit einer Abfrage verfolgt werden können.

In der folgenden Abfrage wird neben dem Preis und dem Namen auch nach dem Ort des Herstellers gefragt. Um die Frage beantworten zu können, muss der Server die Beziehung zwischen Produkt und Hersteller kennen und darüber navigieren können.

POST /shop/graphql

{
    produkte {
        name
        preis
        hersteller {
            ort
        }
    }
}
Listing 2: Abfrage einer Relation zwischen Produkt und Hersteller

Mit REST oder gRPC müssten dafür zwei Aufrufe hintereinander ausgeführt werden. Bei GraphQL können die meisten Aufgaben effizient mit nur einem Aufruf erledigt werden. GraphQL eignet sich daher für den Einsatz bei limitieren Netzwerkverbindungen zum Bespiel für mobile Anwendungen und Apps.

Analog zu SQL ist GraphQL nicht auf die Abfrage von Daten beschränkt, das Anlegen und Ändern ist ebenfalls möglich.

3. Google RPC

Wie der Name bereits sagt, geht es bei gRPC um entfernte Funktionsaufrufe. Weitere Verwandte dieser Gattung sind die SOAP basierten Web Services, SAP RFC oder CORBA. Nachdem die Remote Procedure Calls einige Jahre außer Mode waren, kommen Sie mit einer modernisierten Variante von Google zurück.

Was ist ein Remote Procedure Call?

Über Remote Procedure Calls können Anwendungen Funktionen bereitstellen, die über das Netzwerk von anderen Rechnern aufgerufen werden. Für RPC gibt es diverse Standards und herstellerspezifische Lösungen wie z.B. gRPC oder Java RMI.

Ein Funktionsaufruf auf einem entfernten Computer sieht im Programmcode genauso aus, wie der Aufruf einer lokalen Funktion. Beim Aufruf einer lokalen oder einer entfernten Funktion werden Parameter übergeben und ein Rückgabewert erwartet:

Rückgabewert = Funktion( Parameter 1, …, Parameter n)

Das Diagramm unten zeigt einen Service, der Funktionen für Kundenobjekte zur Verfügung stellt.

Diagramm RPC Service

Abbildung : Methoden eines RPC Services, Diagramm wurde mit YUML erstellt.

Um entfernte Funktionsaufrufe einrichten zu können muss bei vielen RPC Technologien wie z.B. gRPC oder Java RMI ein Dokument mit einer Schnittstellenbeschreibungssprache vorhanden sein. Die Verwendung einer Schnittstellenbeschreibung ist typisch für RPC-Technologien.

Aus der Beschreibung können Klassen für alle in der Schnittstellen verwendeten Datentypen generiert werden. Diese Klassen erleichtern dem Entwickler die Erstellung eines Clients oder Servers für die jeweilige Technologie. Mehr zum Thema Schnittstellenbeschreibung findest du im 5 Teil dieser Reihe.

Für die Übertragung von gRPC Aufrufen wird das HTTP/2 Protokoll verwendet. Im Gegensatz zu REST kommt der Entwickler mit HTTP direkt nicht in Verbindung. Das Ansprechen des Netzwerkes ist bei gRPC in den aus der Schnittstellenbeschreibung generierten Klassen verborgen.