microservices-schnitt jetzt mit graphql! · graphql-java interessant wegen migration von java...
TRANSCRIPT
Zuhören. Analysieren. Beraten.
MICROSERVICES-SCHNITT – JETZT MIT GRAPHQL!
05.07.2018
Matthias Koch
Zuhören. Analysieren. Beraten.
Agenda
1. Überblick über das Framework
2. GraphQL vs. REST
3. GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!2
Zuhören. Analysieren. Beraten.
Agenda
1. Überblick über das Framework
2. GraphQL vs. REST
3. GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!3
Zuhören. Analysieren. Beraten.
Was ist GraphQL?
Graph Query Language
Ursprünglich von Facebook als proprietäre API-Technologie entwickelt
2015 in Open-Source Projekt umgewandelt
Lizenziert seit 2017 über Open Web Foundation Agreement (OWFa)
Tritt Patentrechte ab
Im Kern eine Spezifikation
Referenzimplementierung in JavaScript
Mittlerweile in vielen Sprachen verfügbar
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!4
Zuhören. Analysieren. Beraten.
Wer benutzt alles GraphQL?
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!5
Quelle: https://www.howtographql.com/basics/0-introduction/
Zuhören. Analysieren. Beraten.
Was sind die Bestandteile von GraphQL?
GraphQL Schema Language
Typisierte Schema Definition Language
Definiert Daten und Methoden
Ermöglicht starke Entkopplung von Client und Endpoint
GraphQL Query Language
Deklarative Abfragesprache
GraphQL Runtime
Generische Implementierung des Basissets der GraphQL API
Transformation einer Query
Schema-Validierung
Transformation der Rückgabedaten
Beliebige Backends
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!6
Zuhören. Analysieren. Beraten.
Graph
Daten einer Applikation können durch einen Graphen beschrieben werden.
Abfrage der Daten durch Navigation in diesem Graphen.
In diesen Graphen können auch Zyklen auftreten.
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!7
Zuhören. Analysieren. Beraten.
Graph - Beispiel
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!8
Actor Film Critic
Queries können beliebig komplex werden.
Objekte können gegebenenfalls mehrfach in der selben Query evaluiert werden.
Zuhören. Analysieren. Beraten.
Root Types
Container für die durchzuführende Funktionen:
Queries
Mutators
Create
Update
Delete
Subscribers
Ohne Long Time Polling
Ohne Webhooks
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!9
Zuhören. Analysieren. Beraten.
GraphQL-Java
Interessant wegen Migration von Java REST-Endpoints
Aktuell noch viele Versionssprünge
Niedrige Downloadzahlen
Noch nicht durchgängige Dokumentation
Subscription erst seit kurzem Bestandteil von GraphQL-Java
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!10
Zuhören. Analysieren. Beraten.
Beispiel: Movieking
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!11
Actor
Film
Critic
Query
Zuhören. Analysieren. Beraten.
Tool: GraphiQL
In-Browser IDE
Queries und Mutations können damit abgesetzt werden.
Schema kann damit untersucht werden.
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!12
Zuhören. Analysieren. Beraten.
Schema
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!13
schema {query: Querymutation: Mutation
}
type Query {actor(name: String!): Actorfilm(title: String): Film
}
type Mutation {setAge(name:String!, age: Int!) : Actor
}
type Actor {id: ID!name: String!age: Intfilms(title: String): [Film]pets: [String]
}
type Film {id: ID!title: String!critics: [Critic]
}
type Critic {id: ID!title: String!lazyBonesSummary: Stringscore: Float
}
Zuhören. Analysieren. Beraten.
Überblick über das Framework
14 Microservices-Schnitt - Jetzt mit GraphQL!
Tool: GraphiQL
Zuhören. Analysieren. Beraten.
Big Picture
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!15
Legacy System / Microservice
3rd Party API
Zuhören. Analysieren. Beraten.
DataLoader
2010 von Facebook entwickelt
Referenzimplementierung wieder JavaScript
Implementierungen in vielen Sprachen auch in Java
Funktionalität für Batching und Caching
Simple, intuitive API
Apache Commons v2.0 Lizenz
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!16
Zuhören. Analysieren. Beraten.
java-dataloader
Alle Felder in GraphQL werden unabhängig evaluiert.
Bei „naiver“ Implementierung wird die selbe Information ggf. mehrfach berechnet.
DataLoader hat per default Caching aktiviert.
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!17
Zuhören. Analysieren. Beraten.
DataLoader - Simples Beispiel@Test
public void test_batch_loads() throws Exception {
BatchLoader<String, String> batchLoader = CompletableFuture::completedFuture;
DataLoader<String, String> loader = new DataLoader<>(BatchLoader);
loader.load("A");
loader.load("B");
loader.loadMany(asList("C", "D"));
loader.dispatch();
Statistics stats = loader.getStatistics();
assertEquals(stats.getLoadCount(), 4L);
assertEquals(stats.getBatchInvokeCount(), 1L);
assertEquals(stats.getBatchLoadCount(), 4L);
assertEquals(stats.getCacheHitCount(), 0L);
loader.load("A");
loader.load("B");
loader.dispatch();
stats = loader.getStatistics();
assertEquals(stats.getLoadCount(), 6L);
assertEquals(stats.getBatchInvokeCount(), 1L);
assertEquals(stats.getBatchLoadCount(), 4L);
assertEquals(stats.getCacheHitCount(), 2L);
}
Überblick über das Framework
Microservices-Schnitt - Jetzt mit GraphQL!18
Zuhören. Analysieren. Beraten.
Agenda
1. Überblick über das Framework
2. GraphQL vs. REST
3. GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!19
Zuhören. Analysieren. Beraten.
Movieking RESTGET /movieking.com/actor/name/Buck%20Borris
{
"id": "123-123-123-888",
"name": "Buck Borris",
"age": 79,
"moreFilms": true,
"films": [
{
"title": "Missing the action",
"links": {
"rel": "film",
"href": "movieking.com/film/id/456-456-456-888„
}
},
{
"title": "Firetruck",
"links": {
"rel": "film",
"href": "movieking.com/film/id/456-456-456-999"
}
}, …
] ,
"pets": [
"stinky“, "winky"
]
}
GraphQL vs. REST
Microservices-Schnitt - Jetzt mit GraphQL!20
GET /movieking.com/film/id//456-456-456-888
{
"id": "456-456-456-888",
"title": "Missing the action",
"iinks": [
{
"rel": "critic",
"href": "movieking.com/critic/id/567-567-567-888"
},
{
"rel": "critic",
"href": "imovieking.com/critic/id/567-567-567-888"
}
]
}
GET /movieking.com/critic/id//567-567-567-888
{
“"id": "567-567-567-888",
"title": "Missing the action",
"lazyBonesSummary": "Masterpiece of pacifist film",
"score": 7.46
}
Zuhören. Analysieren. Beraten.
Overfetching/Underfetching
Overfetching
Daten werden übermittelt, weil die Ressource immer die gleiche Menge an Daten liefert.
Unnütze Daten (z.B. Actor‘s pets) werden immer mit übertragen.
Underfetching / n+1 Problem
Bei großer Menge Daten wird die Zahl der Datensätze begrenzt.
Möglicherweise sind die gesuchten Daten nicht enthalten.
Mehrere Requests werden ggf. benötigt, um an die gewünschten Daten zu kommen.
GraphQL vs. REST
Microservices-Schnitt - Jetzt mit GraphQL!21
Zuhören. Analysieren. Beraten.
Versionierung von GraphQL APIs
Versionierung wird nicht empfohlen.
In der Regel wird das Schema größer.
Macht bei GraphQL nichts, da beim „Declarative Data Fetching“ immer nur die explizit
angefragten Daten übermittelt werden.
GraphQL vs. REST
Microservices-Schnitt - Jetzt mit GraphQL!22
Zuhören. Analysieren. Beraten.
Direkter Vergleich
GraphQL vs. REST
Microservices-Schnitt - Jetzt mit GraphQL!23
Kriterium GraphQL REST
Spezifikation ja nein
Server-Roundtrips wenige viele
Fehlerbehandlung einfacher schwerer
Overfetching nein ja
Underfetching seltener häufiger
Zahl der Endpoints weniger mehr
Versionierung einfacher schwerer
Typisierung stark schwach
Schema ja nein
Service-Discovery nein ja
Query-Komplexität hoch einfach
Zuhören. Analysieren. Beraten.
Alternativen zu REST und GraphQL
GRPC
Falcor von Netflix
GraphQL vs. REST
Microservices-Schnitt - Jetzt mit GraphQL!24
Zuhören. Analysieren. Beraten.
Agenda
1. Überblick über das Framework
2. GraphQL vs. REST
3. GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!25
Zuhören. Analysieren. Beraten.
GraphQL als API-Gateway
Vorteile:
Alle Daten können mit einem Server-Roundtrip ermittelt werden.
einfaches Fehlerhandling
einfaches Transaktionshandling
Nachteil:
Absicherung gegen schadhafte Queries schwieriger/risikoreicher
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!26
Zuhören. Analysieren. Beraten.
Vertikaler Schnitt
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!27
Service
Discovery
Bezahlvorgang
UI Bestellvorgang
Bestellvorgang
UI Bezahlvorgang
Zuhören. Analysieren. Beraten.
Vertikaler Schnitt mit GraphQL
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!28
Bezahlvorgang
UI Bestellvorgang
Bestellvorgang
UI Bezahlvorgang
Zuhören. Analysieren. Beraten.
GraphQL als API-Gateway
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!29
Bezahlvorgang
UI Bestellvorgang
Bestellvorgang
UI Bezahlvorgang
GraphQL
Gateway
Zuhören. Analysieren. Beraten.
API-Gateway mit disjunkten Graphen
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!30
Bezahlvorgang
UI Bestellvorgang
Bestellvorgang
UI Bezahlvorgang
GraphQL Gateway mit 2
disjunkten Graphen
Zuhören. Analysieren. Beraten.
API-Gateway – monolithische UI
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!31
BezahlvorgangBestellvorgang
Monolithische UI
Zuhören. Analysieren. Beraten.
Consumer-Driven Contracts
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!32
Quelle: https://martinfowler.com/articles/consumerDrivenContracts.html
Zuhören. Analysieren. Beraten.
Consumer-Driven Contracts GraphQL
Gibt es auch für GraphQL: GraphQL Contract Test
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!33
Zuhören. Analysieren. Beraten.
Consumer-Driven Contracts vertikaler Schnitt
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!34
Bezahlvorgang
UI Bestellvorgang
Bestellvorgang
UI Bezahlvorgang
Contracts Contracts
Zuhören. Analysieren. Beraten.
Consumer-Driven Contracts API-Gateway
GraphQL als API-Gateway?
Microservices-Schnitt - Jetzt mit GraphQL!35
Bezahlvorgang
UI Bestellvorgang
Bestellvorgang
UI Bezahlvorgang
GraphQL
Gateway
Contracts
Zuhören. Analysieren. Beraten.
Fazit
Microservices-Schnitt - Jetzt mit GraphQL!36
GraphQL ist noch eine vergleichsweise junge Technologie.
Formalisiertes Schema sorgt für starke Entkopplung der Schichten.
Versionierung der API wird wesentlich erleichtert.
GraphQL hat gute Konzepte um die Limitierungen von REST aufzulösen.
Zuhören. Analysieren. Beraten.
FRAGEN?
Microservices-Schnitt - Jetzt mit GraphQL!37
DANKE!
Gerne stehe ich am sidion Stand noch für
Gespräche zur Verfügung.
Zuhören. Analysieren. Beraten.
Referenzen
https://code.facebook.com/posts/121714468491809/relicensing-the-graphql-specification/
https://github.com/facebook/dataloader
https://github.com/graphql-java/java-dataloader
http://graphql.org/
GraphQL API Design (API-University Series Book 5) (English Edition) Kindle Edition
https://github.com/symm/graphql-contract-test
https://grpc.io/
https://github.com/Netflix/falcor
https://dev-blog.apollodata.com/the-graphql-stack-how-everything-fits-together-35f8bf34f841
Microservices-Schnitt - Jetzt mit GraphQL!38
Zuhören. Analysieren. Beraten.
sidion
Heßbrühlstr. 15
70565 Stuttgart
Tel. + 49 711 490 109 – 0
Fax + 49 711 490 109 – 79
www.sidion.de
VIELEN DANK.
Microservices-Schnitt - Jetzt mit GraphQL!39