GraphQL. Dominik Kress
Чтение книги онлайн.
Читать онлайн книгу GraphQL - Dominik Kress страница 10
Vor- und Nachteile von gRPC
Für den Transport von Stub zu Server nutzt gRPC zwingend HTTP/2. Dadurch genießt das Framework die vollen Vorzüge des verbesserten Protokolls, wie die Möglichkeit, mehrere Requests gebündelt über nur eine TCP-Verbindung zu versenden. Die Vorteile von HTTP/2 lassen sich aber beispielsweise bei REST APIs und in anderen API-Spezifikationen und Technologien umsetzen. Es ist daher kein exklusiver Vorteil für gRPC. Der Zwang zu HTTP/2 führt jedoch zu einem strikteren Einsatz des Protokolls und damit zu einer Garantie der Vorteile.
Abseits von HTTP/2 bietet gRPC jedoch einen weiteren klaren Vorteil gegenüber REST APIs: Streaming. Wie im Proto-Buffer-Beispiel in Listing 1–8 zu sehen, ermöglicht gRPC durch die Verbindung zwischen Server und Stub bidirektionales Streaming von Datenpaketen.
Auch der Wechsel zwischen asynchronen und synchronen Verbindungen ist recht einfach umgesetzt. Hinzu kommen Features wie Deadlines und Timeouts oder auch die Möglichkeit, einen Call durch Metadaten zu erweitern. Trotz Streaming bietet gRPC jedoch noch keine Möglichkeit zum Broadcasting von Echtzeit-Kommunikation. Für eine Chat-Applikation ist das API-Framework also nicht geeignet.
Ein klarer Nachteil von gRPC ist zudem, dass es Browser nicht nativ unterstützen. Mit gRPC-Web gibt es zwar bereits einen Wrapper und einen Webclient, um das Framework auch für den Browser zu verwenden, doch der Fokus liegt ganz klar auf der optimalen Kommunikation zwischen Microservices.
1.4.5GraphQL
GraphQL wurde 2015 von Facebook für seine eigene Facebook-API veröffentlicht und ist die Spezifikation einer plattformunabhängigen Query-Sprache für APIs [19]. GraphQL dient als eine Art Übersetzer der Kommunikation zwischen Server und Client. Diese erfolgt wie bei REST über HTTP in einem Request-Response-Schema. Jedoch stellt das API nicht für jedes Objekt einen eigenen Endpunkt, den der Client für die entsprechende Ressource ansprechen kann. Vielmehr stellt ein GraphQL-API nur noch einen Endpunkt, über den der Client mit einem Request lesende Operationen über sogenannte Querys oder schreibende Operationen über Mutationen durchführen kann.
Das Graphenschema
Serverseitig muss hierfür ein graphenbasiertes Schema der Daten genutzt werden. Das kann wie folgt aussehen:
type Query {
hero: Character
}
type Character {
name: String
friends: [Character]
homeworld: Planet
species: Species
}
type Planet {
name: String
position: String
}
type Species {
name: String
lifespan: Int
origin: Planet
}
Listing 1–9 Graphenschema
Wie man an diesem Beispiel erkennen kann, verweist ein GraphQL-Schema von einem Objekttyp – also einer im Schema definierten Art eines Objekts – auf einen anderen Objekttyp, wenn es eine Beziehung der beiden zueinander gibt. Dieses Graphenschema ist sozusagen eine Sammlung aller Fragen, die ein Entwickler stellen könnte.
Die GraphQL-Querys
Requests für lesenden Zugriff stellt der Client über einen Query. Dieser kann wie folgt aussehen:
{
hero (name="Luke Skywalker"){
name
homeworld {
name
position
}
species {
name
origin {
name
}}}}
Listing 1–10 GraphQL Request Query
In diesem Fall wäre die Response vonseiten des Servers folgende:
{
"hero": {
"name": "Luke Skywalker",
"homeworld": {
"name": "Tatooine",
"position"; "R-16"
},
"species": {
"name": "human",
"origin": {
"name": "undefined"
}}}}
Listing 1–11 GraphQL Response
Ein Query ist eine klare Anfrage, welche spezifischen Informationen der Entwickler vom Server benötigt. Die Rückgabe enthält dabei bereits alle Informationen, auch wenn eine Anfrage Felder von mehreren Objekten benötigt. Anders als bei den einzelnen Ressourcen-Endpunkten von REST, können über einen einzigen Endpunkt alle relevanten Informationen abgerufen und modifiziert werden.
Die Querys für die lesenden Zugriffe können unter anderem, wie im oberen Beispiel mit dem Heldenname, (auch mehrfache) Parameter enthalten. Sie bieten Aliases, um mehrfach benötigte Teile der Daten unterschiedlich zu benennen, Fragmente, um Teile von sehr großen Querys in mehrmals aufrufbare Subquerys zu extrahieren, Variablen und auch Direktiven.
Mittlerweile gibt es viele Frameworks, die aus den definierten GraphQL-Schemas sowohl Client- als auch Servercode ableiten und automatisch generieren. Das erleichtert die Arbeit signifikant und unterstützt mit den definierten Schemas als API Contract den Contract-First-Ansatz.
1.4.6Die Technologien im Vergleich
REST