Die Beschaffungsplattform fur Geschaftskunden
GraphQL, das bessere REST?Jorg Adler, Benjamin Otto, 29.9.2017
Wir @ Mercateo
Mercateo ist Europas fuhrende Beschaffungsplattform.
> 1 Mio. Geschaftskunden
21 Mio. Artikel
mehr als 10.000 Hersteller
Entwicklung von der Beschaffungsplattform zur Transaktionsplattform
Massive Veranderungen in der IT-Landschaft
Jorg [email protected]@joerg adler
Benjamin [email protected]
@ otbe
Die Beschaffungsplattform fur Geschaftskunden 2
Wir @ Mercateo
Mercateo ist Europas fuhrende Beschaffungsplattform.
> 1 Mio. Geschaftskunden
21 Mio. Artikel
mehr als 10.000 Hersteller
Entwicklung von der Beschaffungsplattform zur Transaktionsplattform
Massive Veranderungen in der IT-Landschaft
Jorg [email protected]@joerg adler
Benjamin [email protected]
@ otbe
Die Beschaffungsplattform fur Geschaftskunden 2
Beispiel
Beispiel
Nachfolgend beziehen sich alle Folien auf das folgende Beispiel
Order API
Order mit id, state und articles
Order mit States”processing“,
”canceled“,
”shipped“,
”returned“
Ubergang processing → canceled (optional)
Ubergang processing → shipped → returned (optional)
Implementiertes Java-Beispiel:https://github.com/Mercateo/rest-demo-feature/
Die Beschaffungsplattform fur Geschaftskunden 3
Beispiel
Beispiel
Nachfolgend beziehen sich alle Folien auf das folgende Beispiel
Order API
Order mit id, state und articles
Order mit States”processing“,
”canceled“,
”shipped“,
”returned“
Ubergang processing → canceled (optional)
Ubergang processing → shipped → returned (optional)
Implementiertes Java-Beispiel:https://github.com/Mercateo/rest-demo-feature/
Die Beschaffungsplattform fur Geschaftskunden 3
Beispiel
Beispiel
Nachfolgend beziehen sich alle Folien auf das folgende Beispiel
Order API
Order mit id, state und articles
Order mit States”processing“,
”canceled“,
”shipped“,
”returned“
Ubergang processing → canceled (optional)
Ubergang processing → shipped → returned (optional)
Implementiertes Java-Beispiel:https://github.com/Mercateo/rest-demo-feature/
Die Beschaffungsplattform fur Geschaftskunden 3
Beispiel
Beispiel
Nachfolgend beziehen sich alle Folien auf das folgende Beispiel
Order API
Order mit id, state und articles
Order mit States”processing“,
”canceled“,
”shipped“,
”returned“
Ubergang processing → canceled (optional)
Ubergang processing → shipped → returned (optional)
Implementiertes Java-Beispiel:https://github.com/Mercateo/rest-demo-feature/
Die Beschaffungsplattform fur Geschaftskunden 3
Beispiel
Beispiel
Nachfolgend beziehen sich alle Folien auf das folgende Beispiel
Order API
Order mit id, state und articles
Order mit States”processing“,
”canceled“,
”shipped“,
”returned“
Ubergang processing → canceled (optional)
Ubergang processing → shipped → returned (optional)
Implementiertes Java-Beispiel:https://github.com/Mercateo/rest-demo-feature/
Die Beschaffungsplattform fur Geschaftskunden 3
Beispiel
Beispiel
Nachfolgend beziehen sich alle Folien auf das folgende Beispiel
Order API
Order mit id, state und articles
Order mit States”processing“,
”canceled“,
”shipped“,
”returned“
Ubergang processing → canceled (optional)
Ubergang processing → shipped → returned (optional)
Implementiertes Java-Beispiel:https://github.com/Mercateo/rest-demo-feature/
Die Beschaffungsplattform fur Geschaftskunden 3
GraphQL
?
Was ist GraphQL?
Die Beschaffungsplattform fur Geschaftskunden 4
GraphQL
?
”GraphQL is a query language for APIs and a runtime for fulfilling thosequeries with your existing data.”
gedacht als dunner API Layer zwischen Client und Backend
initialer Draft von 2015 von Facebook
Spec (OWFA 1.0) + Referenzimplementierung (MIT) auf Github verfugbar
wird seither als Community Draft weiterentwickelt
GraphQL Schema als Contract zwischen Client und Server
Die Beschaffungsplattform fur Geschaftskunden 5
GraphQL
?
”GraphQL is a query language for APIs and a runtime for fulfilling thosequeries with your existing data.”
gedacht als dunner API Layer zwischen Client und Backend
initialer Draft von 2015 von Facebook
Spec (OWFA 1.0) + Referenzimplementierung (MIT) auf Github verfugbar
wird seither als Community Draft weiterentwickelt
GraphQL Schema als Contract zwischen Client und Server
Die Beschaffungsplattform fur Geschaftskunden 5
GraphQL
?
”GraphQL is a query language for APIs and a runtime for fulfilling thosequeries with your existing data.”
gedacht als dunner API Layer zwischen Client und Backend
initialer Draft von 2015 von Facebook
Spec (OWFA 1.0) + Referenzimplementierung (MIT) auf Github verfugbar
wird seither als Community Draft weiterentwickelt
GraphQL Schema als Contract zwischen Client und Server
Die Beschaffungsplattform fur Geschaftskunden 5
GraphQL
?
”GraphQL is a query language for APIs and a runtime for fulfilling thosequeries with your existing data.”
gedacht als dunner API Layer zwischen Client und Backend
initialer Draft von 2015 von Facebook
Spec (OWFA 1.0) + Referenzimplementierung (MIT) auf Github verfugbar
wird seither als Community Draft weiterentwickelt
GraphQL Schema als Contract zwischen Client und Server
Die Beschaffungsplattform fur Geschaftskunden 5
GraphQL
?
”GraphQL is a query language for APIs and a runtime for fulfilling thosequeries with your existing data.”
gedacht als dunner API Layer zwischen Client und Backend
initialer Draft von 2015 von Facebook
Spec (OWFA 1.0) + Referenzimplementierung (MIT) auf Github verfugbar
wird seither als Community Draft weiterentwickelt
GraphQL Schema als Contract zwischen Client und Server
Die Beschaffungsplattform fur Geschaftskunden 5
GraphQL
?
”GraphQL is a query language for APIs and a runtime for fulfilling thosequeries with your existing data.”
gedacht als dunner API Layer zwischen Client und Backend
initialer Draft von 2015 von Facebook
Spec (OWFA 1.0) + Referenzimplementierung (MIT) auf Github verfugbar
wird seither als Community Draft weiterentwickelt
GraphQL Schema als Contract zwischen Client und Server
Die Beschaffungsplattform fur Geschaftskunden 5
GraphQL
Schema
Schema besteht aus Query, Mutation und Subscription
Primitive Datentypen: Int, Float, String, Boolean, ID
Neue Datentypen konnen mit scalar, type, interface, union, enum oder inputdefiniert werden
Cheat Sheet https://github.com/sogko/graphql-schema-language-cheat-sheet
Die Beschaffungsplattform fur Geschaftskunden 6
GraphQL
Schema
Schema besteht aus Query, Mutation und Subscription
Primitive Datentypen: Int, Float, String, Boolean, ID
Neue Datentypen konnen mit scalar, type, interface, union, enum oder inputdefiniert werden
Cheat Sheet https://github.com/sogko/graphql-schema-language-cheat-sheet
Die Beschaffungsplattform fur Geschaftskunden 6
GraphQL
Schema
Schema besteht aus Query, Mutation und Subscription
Primitive Datentypen: Int, Float, String, Boolean, ID
Neue Datentypen konnen mit scalar, type, interface, union, enum oder inputdefiniert werden
Cheat Sheet https://github.com/sogko/graphql-schema-language-cheat-sheet
Die Beschaffungsplattform fur Geschaftskunden 6
GraphQL
Schema
Schema besteht aus Query, Mutation und Subscription
Primitive Datentypen: Int, Float, String, Boolean, ID
Neue Datentypen konnen mit scalar, type, interface, union, enum oder inputdefiniert werden
Cheat Sheet https://github.com/sogko/graphql-schema-language-cheat-sheet
Die Beschaffungsplattform fur Geschaftskunden 6
Die Beschaffungsplattform fur Geschaftskunden 7
GraphQL
Status Quo
Status Quo
Die Beschaffungsplattform fur Geschaftskunden 8
GraphQL
Status Quo
Transport: HTTP POST* auf /graphql Endpoint mit Query im Body
* dadurch ist Caching schwierig; allerdings kann auch GET mit QueryParameter verwendet werden oder Persisted Queries
”one query to rule them all“- beliebig tief geschachtelte Queries konnen
geschrieben werden
Tooling
Die Beschaffungsplattform fur Geschaftskunden 9
GraphQL
Status Quo
Transport: HTTP POST* auf /graphql Endpoint mit Query im Body
* dadurch ist Caching schwierig; allerdings kann auch GET mit QueryParameter verwendet werden oder Persisted Queries
”one query to rule them all“- beliebig tief geschachtelte Queries konnen
geschrieben werden
Tooling
Die Beschaffungsplattform fur Geschaftskunden 9
GraphQL
Status Quo
Transport: HTTP POST* auf /graphql Endpoint mit Query im Body
* dadurch ist Caching schwierig; allerdings kann auch GET mit QueryParameter verwendet werden oder Persisted Queries
”one query to rule them all“- beliebig tief geschachtelte Queries konnen
geschrieben werden
Tooling
Die Beschaffungsplattform fur Geschaftskunden 9
GraphQL
Status Quo
Transport: HTTP POST* auf /graphql Endpoint mit Query im Body
* dadurch ist Caching schwierig; allerdings kann auch GET mit QueryParameter verwendet werden oder Persisted Queries
”one query to rule them all“- beliebig tief geschachtelte Queries konnen
geschrieben werden
Tooling
Die Beschaffungsplattform fur Geschaftskunden 9
GraphQL
Tooling - GraphiQL
Die Beschaffungsplattform fur Geschaftskunden 10
GraphQL
Tooling - Launchpad
Die Beschaffungsplattform fur Geschaftskunden 11
GraphQL
Tooling - Apollo Dev
Die Beschaffungsplattform fur Geschaftskunden 12
GraphQL
Tooling - graphql-faker
Die Beschaffungsplattform fur Geschaftskunden 13
GraphQL
Status Quo
Transport: HTTP POST* auf /graphql Endpoint mit Query im Body
* dadurch ist Caching schwierig; allerdings kann auch GET mit QueryParameter verwendet werden oder Persisted Queries
”one query to rule them all“- beliebig tief geschachtelte Queries konnen
geschrieben werden
Tooling
Wer nutzt GraphQL?
Die Beschaffungsplattform fur Geschaftskunden 14
Die Beschaffungsplattform fur Geschaftskunden 15
GraphQL
Beispiel
https://launchpad.graphql.com/x45n51lwl
Die Beschaffungsplattform fur Geschaftskunden 16
GraphQL
Beispiel
Datenbeschreibung
1 enum STATE {2 SHIPPED
3 PROCESSING
4 CANCELED
5 RETURNED
6 }7
8 type Order {9 id: ID!
10 state: STATE
11 articles: [Article]!
12 }13
14 type Query {15 orders(limit: Int, offset: Int): [Order]!
16 }
Die Beschaffungsplattform fur Geschaftskunden 17
GraphQL
Beispiel
Datenbeschreibung
1 enum STATE {2 SHIPPED
3 PROCESSING
4 CANCELED
5 RETURNED
6 }7
8 type Order {9 id: ID!
10 state: STATE
11 articles: [Article]!
12 }13
14 type Query {15 orders(limit: Int, offset: Int): [Order]!
16 }
Anfrage
1 {2 orders {3 id
4 state
5 }6 }
Die Beschaffungsplattform fur Geschaftskunden 17
GraphQL
Beispiel
Datenbeschreibung
1 enum STATE {2 SHIPPED
3 PROCESSING
4 CANCELED
5 RETURNED
6 }7
8 type Order {9 id: ID!
10 state: STATE
11 articles: [Article]!
12 }13
14 type Query {15 orders(limit: Int, offset: Int): [Order]!
16 }
Anfrage
1 {2 orders {3 id
4 state
5 }6 }
Ergebnis
1 {2 "orders": [ {3 "id": "1234567",
4 "state": "PROCESSING"
5 } ]
6 }
Die Beschaffungsplattform fur Geschaftskunden 17
REST
Die Beschaffungsplattform fur Geschaftskunden 18
REST
Einfuhrung
REST ist eine Architektur
es gibt keinen (Implementierungs-)Standard, nur Constraints (Client-Server,Stateless, Cache, Uniform Interface, Layered System, Code on Demand)
speziell die Forderung nach einem uniformen Interface macht REST langsam
”The trade-off, though, is that a uniform interface degrades efficiency, since
information is transferred in a standardized form rather than one which isspecific to an application’s needs.“
Fielding, Roy T., Dissertation
”Software design on the scale of decades: every detail is intended to promote
software longevity and independent evolution. Many of the constraints aredirectly opposed to short-term efficiency.“
Fielding, Roy T. “REST APIs must be hypertext-driven“
Die Beschaffungsplattform fur Geschaftskunden 19
REST
Einfuhrung
REST ist eine Architektur
es gibt keinen (Implementierungs-)Standard, nur Constraints (Client-Server,Stateless, Cache, Uniform Interface, Layered System, Code on Demand)
speziell die Forderung nach einem uniformen Interface macht REST langsam
”The trade-off, though, is that a uniform interface degrades efficiency, since
information is transferred in a standardized form rather than one which isspecific to an application’s needs.“
Fielding, Roy T., Dissertation
”Software design on the scale of decades: every detail is intended to promote
software longevity and independent evolution. Many of the constraints aredirectly opposed to short-term efficiency.“
Fielding, Roy T. “REST APIs must be hypertext-driven“
Die Beschaffungsplattform fur Geschaftskunden 19
REST
Einfuhrung
REST ist eine Architektur
es gibt keinen (Implementierungs-)Standard, nur Constraints (Client-Server,Stateless, Cache, Uniform Interface, Layered System, Code on Demand)
speziell die Forderung nach einem uniformen Interface macht REST langsam
”The trade-off, though, is that a uniform interface degrades efficiency, since
information is transferred in a standardized form rather than one which isspecific to an application’s needs.“
Fielding, Roy T., Dissertation
”Software design on the scale of decades: every detail is intended to promote
software longevity and independent evolution. Many of the constraints aredirectly opposed to short-term efficiency.“
Fielding, Roy T. “REST APIs must be hypertext-driven“
Die Beschaffungsplattform fur Geschaftskunden 19
REST
Einfuhrung
REST ist eine Architektur
es gibt keinen (Implementierungs-)Standard, nur Constraints (Client-Server,Stateless, Cache, Uniform Interface, Layered System, Code on Demand)
speziell die Forderung nach einem uniformen Interface macht REST langsam
”The trade-off, though, is that a uniform interface degrades efficiency, since
information is transferred in a standardized form rather than one which isspecific to an application’s needs.“
Fielding, Roy T., Dissertation
”Software design on the scale of decades: every detail is intended to promote
software longevity and independent evolution. Many of the constraints aredirectly opposed to short-term efficiency.“
Fielding, Roy T. “REST APIs must be hypertext-driven“
Die Beschaffungsplattform fur Geschaftskunden 19
REST
HATEOAS
Hypermedia as the Engine of Application State
integraler Bestandteil von REST
”REST is defined by four interface constraints: identification of resources;
manipulation of resources through representations; self-descriptive messages;and, hypermedia as the engine of application state“
Fielding, Roy T., Dissertation
Zustandsubergange am Client ausschließlich uber Links vom Server
Links kommen nur dynamisch vom Server
im Client nur eine Einsprungs-URL und das Wissen uber die Linknamen
Die Beschaffungsplattform fur Geschaftskunden 20
REST
HATEOAS
Hypermedia as the Engine of Application State
integraler Bestandteil von REST
”REST is defined by four interface constraints: identification of resources;
manipulation of resources through representations; self-descriptive messages;and, hypermedia as the engine of application state“
Fielding, Roy T., Dissertation
Zustandsubergange am Client ausschließlich uber Links vom Server
Links kommen nur dynamisch vom Server
im Client nur eine Einsprungs-URL und das Wissen uber die Linknamen
Die Beschaffungsplattform fur Geschaftskunden 20
REST
HATEOAS
Hypermedia as the Engine of Application State
integraler Bestandteil von REST
”REST is defined by four interface constraints: identification of resources;
manipulation of resources through representations; self-descriptive messages;and, hypermedia as the engine of application state“
Fielding, Roy T., Dissertation
Zustandsubergange am Client ausschließlich uber Links vom Server
Links kommen nur dynamisch vom Server
im Client nur eine Einsprungs-URL und das Wissen uber die Linknamen
Die Beschaffungsplattform fur Geschaftskunden 20
REST
HATEOAS
Hypermedia as the Engine of Application State
integraler Bestandteil von REST
”REST is defined by four interface constraints: identification of resources;
manipulation of resources through representations; self-descriptive messages;and, hypermedia as the engine of application state“
Fielding, Roy T., Dissertation
Zustandsubergange am Client ausschließlich uber Links vom Server
Links kommen nur dynamisch vom Server
im Client nur eine Einsprungs-URL und das Wissen uber die Linknamen
Die Beschaffungsplattform fur Geschaftskunden 20
REST
HATEOAS
Hypermedia as the Engine of Application State
integraler Bestandteil von REST
”REST is defined by four interface constraints: identification of resources;
manipulation of resources through representations; self-descriptive messages;and, hypermedia as the engine of application state“
Fielding, Roy T., Dissertation
Zustandsubergange am Client ausschließlich uber Links vom Server
Links kommen nur dynamisch vom Server
im Client nur eine Einsprungs-URL und das Wissen uber die Linknamen
Die Beschaffungsplattform fur Geschaftskunden 20
Ist GraphQL nun das bessere REST?
Es ist nicht vergleichbar.
Die Beschaffungsplattform fur Geschaftskunden 21
Ist GraphQL nun das bessere REST?Es ist nicht vergleichbar.
Die Beschaffungsplattform fur Geschaftskunden 21
Vielen Dank fur Ihre Aufmerksamtkeit :)
Die Beschaffungsplattform fur Geschaftskunden 22
DDD
Domain Driven Design
hilft beim Schnitt von Microservices
wir legen hier Wert auf die Abgrenzung von Bounded Contexts
auch fur Monolithen mit Schnittstellen wichtig
Businesslogik am Server kapseln
Die Beschaffungsplattform fur Geschaftskunden 23
DDD
Domain Driven Design
hilft beim Schnitt von Microservices
wir legen hier Wert auf die Abgrenzung von Bounded Contexts
auch fur Monolithen mit Schnittstellen wichtig
Businesslogik am Server kapseln
Die Beschaffungsplattform fur Geschaftskunden 23
DDD
Domain Driven Design
hilft beim Schnitt von Microservices
wir legen hier Wert auf die Abgrenzung von Bounded Contexts
auch fur Monolithen mit Schnittstellen wichtig
Businesslogik am Server kapseln
Die Beschaffungsplattform fur Geschaftskunden 23
DDD
Domain Driven Design
hilft beim Schnitt von Microservices
wir legen hier Wert auf die Abgrenzung von Bounded Contexts
auch fur Monolithen mit Schnittstellen wichtig
Businesslogik am Server kapseln
Die Beschaffungsplattform fur Geschaftskunden 23
DDD
REST-Naiv
reines CRUD
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 }
1 PUT /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "RETURNED",
6 }
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Die Beschaffungsplattform fur Geschaftskunden 24
DDD
REST-Naiv
reines CRUD
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 }
1 PUT /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "RETURNED",
6 }
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Die Beschaffungsplattform fur Geschaftskunden 24
DDD
REST-Naiv
reines CRUD
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 }
1 PUT /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "RETURNED",
6 }
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Die Beschaffungsplattform fur Geschaftskunden 24
DDD
REST-HATEOAS
Entscheidung wann etwas moglich ist kommt vom Server uber Links
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 "_links": {7 "return": { "href": "/ orders/1" }8 }9 }
Es muss dokumentiert werden, welche und wie Statusubergange moglich sind
Clients konnen uniform feststellen, wann Statusubergange moglich sind
Die Beschaffungsplattform fur Geschaftskunden 25
DDD
REST-HATEOAS
Entscheidung wann etwas moglich ist kommt vom Server uber Links
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 "_links": {7 "return": { "href": "/ orders/1" }8 }9 }
Es muss dokumentiert werden, welche und wie Statusubergange moglich sind
Clients konnen uniform feststellen, wann Statusubergange moglich sind
Die Beschaffungsplattform fur Geschaftskunden 25
DDD
REST-HATEOAS
Entscheidung wann etwas moglich ist kommt vom Server uber Links
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 "_links": {7 "return": { "href": "/ orders/1" }8 }9 }
Es muss dokumentiert werden, welche und wie Statusubergange moglich sind
Clients konnen uniform feststellen, wann Statusubergange moglich sind
Die Beschaffungsplattform fur Geschaftskunden 25
DDD
HATEOAS und Schema II
mit Schema: CRUD wird etwas abgemildert
mit Schema: Clients konnen flexibel auf Payloadanderungen reagieren
1 GET /orders/1
2 {3 "id": "1",
4 "articles": ...,
5 "state": "SHIPPED"
6 "_schema": {7 "links": [
8 { "href": "http:// localhost:9090/orders/1",
9 "schema": { "type": "object",
10 "properties": {11 "state": { "type": "string",
12 "enum": ["RETURNED"] }}},13 "rel": "return",
14 "method": "PATCH"}]}}
Die Beschaffungsplattform fur Geschaftskunden 26
DDD
REST-HATEOAS ohne CRUD
zusatzlich sollte ein Update von komplexen Ressourcen nicht moglich sein
Man erstellt eine Art ”Kommando”
Welches Kommando man erstellen darf, wird uber Links kommuniziert
Die Implementierung wird hier sehr viel einfacher, kein ratseln am Server mehr
Zusatzliche Daten konnen erhoben werden
Die Beschaffungsplattform fur Geschaftskunden 27
DDD
REST-HATEOAS ohne CRUD
zusatzlich sollte ein Update von komplexen Ressourcen nicht moglich sein
Man erstellt eine Art ”Kommando”
Welches Kommando man erstellen darf, wird uber Links kommuniziert
Die Implementierung wird hier sehr viel einfacher, kein ratseln am Server mehr
Zusatzliche Daten konnen erhoben werden
Die Beschaffungsplattform fur Geschaftskunden 27
DDD
REST-HATEOAS ohne CRUD
zusatzlich sollte ein Update von komplexen Ressourcen nicht moglich sein
Man erstellt eine Art ”Kommando”
Welches Kommando man erstellen darf, wird uber Links kommuniziert
Die Implementierung wird hier sehr viel einfacher, kein ratseln am Server mehr
Zusatzliche Daten konnen erhoben werden
Die Beschaffungsplattform fur Geschaftskunden 27
DDD
REST-HATEOAS ohne CRUD
zusatzlich sollte ein Update von komplexen Ressourcen nicht moglich sein
Man erstellt eine Art ”Kommando”
Welches Kommando man erstellen darf, wird uber Links kommuniziert
Die Implementierung wird hier sehr viel einfacher, kein ratseln am Server mehr
Zusatzliche Daten konnen erhoben werden
Die Beschaffungsplattform fur Geschaftskunden 27
DDD
REST-HATEOAS ohne CRUD
zusatzlich sollte ein Update von komplexen Ressourcen nicht moglich sein
Man erstellt eine Art ”Kommando”
Welches Kommando man erstellen darf, wird uber Links kommuniziert
Die Implementierung wird hier sehr viel einfacher, kein ratseln am Server mehr
Zusatzliche Daten konnen erhoben werden
Die Beschaffungsplattform fur Geschaftskunden 27
DDD
HATEOAS und Schema
1 GET /orders/1
2 ...
3 { "href": "http:// localhost:9090/returns",
4 "schema": {"type": "object",
5 "properties": {6 "id": {"type": "uuid"},7 "message": {"type": "string"},8 "orderId": {"type": "string",
9 "enum": ["1"]}},10 "required": ["message","orderId","id"]},11 "method": "PUT",
12 "rel": "return"}...
Die Beschaffungsplattform fur Geschaftskunden 28
DDD
GraphQL-Naiv
reine CRUD Mutations
1 createOrder(order)
2 updateOrder(order)
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Kommt bekannt vor? :)
Die Beschaffungsplattform fur Geschaftskunden 29
DDD
GraphQL-Naiv
reine CRUD Mutations
1 createOrder(order)
2 updateOrder(order)
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Kommt bekannt vor? :)
Die Beschaffungsplattform fur Geschaftskunden 29
DDD
GraphQL-Naiv
reine CRUD Mutations
1 createOrder(order)
2 updateOrder(order)
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Kommt bekannt vor? :)
Die Beschaffungsplattform fur Geschaftskunden 29
DDD
GraphQL-Naiv
reine CRUD Mutations
1 createOrder(order)
2 updateOrder(order)
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Kommt bekannt vor? :)
Die Beschaffungsplattform fur Geschaftskunden 29
DDD
GraphQL-Naiv
reine CRUD Mutations
1 createOrder(order)
2 updateOrder(order)
Es muss dokumentiert werden, wann welche Statusubergange moglich sind
Alle Clients implementieren dafur Code
Businesslogik sehr schwer anderbar
Kommt bekannt vor? :)
Die Beschaffungsplattform fur Geschaftskunden 29
DDD
GraphQL Commands
Kein CRUD mehr
1 cancelOrder(orderId: ID!, message: String)
2 returnOrder(orderId: ID!, message: String)
Es muss immer noch dokumentiert werden, wann welche Statusubergangemoglich sind
Reduziert Komplexitat im Client und Server
Die Beschaffungsplattform fur Geschaftskunden 30
DDD
GraphQL Commands
Kein CRUD mehr
1 cancelOrder(orderId: ID!, message: String)
2 returnOrder(orderId: ID!, message: String)
Es muss immer noch dokumentiert werden, wann welche Statusubergangemoglich sind
Reduziert Komplexitat im Client und Server
Die Beschaffungsplattform fur Geschaftskunden 30
DDD
GraphQL Commands
Kein CRUD mehr
1 cancelOrder(orderId: ID!, message: String)
2 returnOrder(orderId: ID!, message: String)
Es muss immer noch dokumentiert werden, wann welche Statusubergangemoglich sind
Reduziert Komplexitat im Client und Server
Die Beschaffungsplattform fur Geschaftskunden 30
DDD
GraphQL HATEOAS Extensions
Wie konnen wir darstellen, welche Statusubergange im aktuellen Zustandmoglich sind?
Die Beschaffungsplattform fur Geschaftskunden 31
DDD
GraphQL HATEOAS Extensions
Wie konnen wir darstellen, welche Statusubergange im aktuellen Zustandmoglich sind?
→ Relay-Style Pagination
→ Statusinformationen in den Kanten
1 {2 orders {3 edges {4 node {5 id
6 state
7 }8
9
10
11 }12 }13 }
Die Beschaffungsplattform fur Geschaftskunden 31
DDD
GraphQL HATEOAS Extensions
Wie konnen wir darstellen, welche Statusubergange im aktuellen Zustandmoglich sind?
→ Relay-Style Pagination → Statusinformationen in den Kanten
1 {2 orders {3 edges {4 node {5 id
6 state
7 }8
9
10
11 }12 }13 }
1 {2 orders {3 edges {4 node {5 id
6 state
7 }8
9 returnOrder
10 cancelOrder
11 }12 }13 }
Die Beschaffungsplattform fur Geschaftskunden 31
CQRS
Command/Query Responsibility Segregation
Trennung von Kommandos (Schreiben) und Querys (Lesen)
auf Modellierungs- und Deploymentebene
dadurch getrennt entwickelbar, skalierbar, deploybar
Voraussetzung fur Eventsourcing
Bedeutet aber auch Aufwand! Nutzen abwagen.
Die Beschaffungsplattform fur Geschaftskunden 32
CQRS
Command/Query Responsibility Segregation
Trennung von Kommandos (Schreiben) und Querys (Lesen)
auf Modellierungs- und Deploymentebene
dadurch getrennt entwickelbar, skalierbar, deploybar
Voraussetzung fur Eventsourcing
Bedeutet aber auch Aufwand! Nutzen abwagen.
Die Beschaffungsplattform fur Geschaftskunden 32
CQRS
Command/Query Responsibility Segregation
Trennung von Kommandos (Schreiben) und Querys (Lesen)
auf Modellierungs- und Deploymentebene
dadurch getrennt entwickelbar, skalierbar, deploybar
Voraussetzung fur Eventsourcing
Bedeutet aber auch Aufwand! Nutzen abwagen.
Die Beschaffungsplattform fur Geschaftskunden 32
CQRS
Command/Query Responsibility Segregation
Trennung von Kommandos (Schreiben) und Querys (Lesen)
auf Modellierungs- und Deploymentebene
dadurch getrennt entwickelbar, skalierbar, deploybar
Voraussetzung fur Eventsourcing
Bedeutet aber auch Aufwand! Nutzen abwagen.
Die Beschaffungsplattform fur Geschaftskunden 32
CQRS
Command/Query Responsibility Segregation
Trennung von Kommandos (Schreiben) und Querys (Lesen)
auf Modellierungs- und Deploymentebene
dadurch getrennt entwickelbar, skalierbar, deploybar
Voraussetzung fur Eventsourcing
Bedeutet aber auch Aufwand! Nutzen abwagen.
Die Beschaffungsplattform fur Geschaftskunden 32
CQRS
REST
Mit Ressourcen auf Command-Ebene geht dies sehr gut
Aufpassen bei Ruckgabe von PUT/POST
Auf naturliche Weise kann Eventsourcing unterstutzt werden
Die Beschaffungsplattform fur Geschaftskunden 33
CQRS
REST
Mit Ressourcen auf Command-Ebene geht dies sehr gut
Aufpassen bei Ruckgabe von PUT/POST
Auf naturliche Weise kann Eventsourcing unterstutzt werden
Die Beschaffungsplattform fur Geschaftskunden 33
CQRS
Command/Query Responsibility Segregation
Die Beschaffungsplattform fur Geschaftskunden 34
CQRS
REST II
auch spatere Einfuhrung moglich.
1 PUT /returns ...
2 {3 "_links": {4 "canonical": { "href": "/ returns/4?eventSeq=47" }5 }6 }
Die Beschaffungsplattform fur Geschaftskunden 35
CQRS
GraphQL
Mutations (als Commands) sind bereits von Queries getrennt
Grundsatzlich kann bei einer Mutation ein beliebiges Objektgelesen/zuruckgegeben werden
Im Relay Umfeld werden haufig alle abhangigen Anderungen gelesen damit derClient die Caches updaten kann
Alternative: Mutation + Subscription nutzen
Die Beschaffungsplattform fur Geschaftskunden 36
CQRS
GraphQL
Mutations (als Commands) sind bereits von Queries getrennt
Grundsatzlich kann bei einer Mutation ein beliebiges Objektgelesen/zuruckgegeben werden
Im Relay Umfeld werden haufig alle abhangigen Anderungen gelesen damit derClient die Caches updaten kann
Alternative: Mutation + Subscription nutzen
Die Beschaffungsplattform fur Geschaftskunden 36
CQRS
GraphQL
Mutations (als Commands) sind bereits von Queries getrennt
Grundsatzlich kann bei einer Mutation ein beliebiges Objektgelesen/zuruckgegeben werden
Im Relay Umfeld werden haufig alle abhangigen Anderungen gelesen damit derClient die Caches updaten kann
Alternative: Mutation + Subscription nutzen
Die Beschaffungsplattform fur Geschaftskunden 36
CQRS
GraphQL
Mutations (als Commands) sind bereits von Queries getrennt
Grundsatzlich kann bei einer Mutation ein beliebiges Objektgelesen/zuruckgegeben werden
Im Relay Umfeld werden haufig alle abhangigen Anderungen gelesen damit derClient die Caches updaten kann
Alternative: Mutation + Subscription nutzen
Die Beschaffungsplattform fur Geschaftskunden 36
API First
API First
in GraphQL ist das Schema fester Bestandteil des Standards
Entwickler von Server und Client haben dies jederzeit, API first at its best.
API-First Hilfsmittel fur REST prinzipiell vorhanden (Open-API 3.0,Json-Hyperschema, RAML)
native Unterstutzung nur fur statische Links
Bei beiden: HATEOAS mit dynamischen Links erfordert basteln
Die Beschaffungsplattform fur Geschaftskunden 37
API First
API First
in GraphQL ist das Schema fester Bestandteil des Standards
Entwickler von Server und Client haben dies jederzeit, API first at its best.
API-First Hilfsmittel fur REST prinzipiell vorhanden (Open-API 3.0,Json-Hyperschema, RAML)
native Unterstutzung nur fur statische Links
Bei beiden: HATEOAS mit dynamischen Links erfordert basteln
Die Beschaffungsplattform fur Geschaftskunden 37
API First
API First
in GraphQL ist das Schema fester Bestandteil des Standards
Entwickler von Server und Client haben dies jederzeit, API first at its best.
API-First Hilfsmittel fur REST prinzipiell vorhanden (Open-API 3.0,Json-Hyperschema, RAML)
native Unterstutzung nur fur statische Links
Bei beiden: HATEOAS mit dynamischen Links erfordert basteln
Die Beschaffungsplattform fur Geschaftskunden 37
API First
API First
in GraphQL ist das Schema fester Bestandteil des Standards
Entwickler von Server und Client haben dies jederzeit, API first at its best.
API-First Hilfsmittel fur REST prinzipiell vorhanden (Open-API 3.0,Json-Hyperschema, RAML)
native Unterstutzung nur fur statische Links
Bei beiden: HATEOAS mit dynamischen Links erfordert basteln
Die Beschaffungsplattform fur Geschaftskunden 37
API First
API First
in GraphQL ist das Schema fester Bestandteil des Standards
Entwickler von Server und Client haben dies jederzeit, API first at its best.
API-First Hilfsmittel fur REST prinzipiell vorhanden (Open-API 3.0,Json-Hyperschema, RAML)
native Unterstutzung nur fur statische Links
Bei beiden: HATEOAS mit dynamischen Links erfordert basteln
Die Beschaffungsplattform fur Geschaftskunden 37
Fazit
Disclaimer
Man kann auch fur REST auf wenige Requests optimieren
durch Schaffen von sehr großen Read-Only Ressourcendurch eingebettete Ressourcen (siehe zum Beispiel HAL-Format)durch Auflosen von Links bis zu einer gewissen Tiefe (siehe zum BeispielContentful-API)
alles handischer Aufwand
beim Formulieren von Queries haufig kompliziert
Die Beschaffungsplattform fur Geschaftskunden 38
Fazit
Disclaimer
Man kann auch fur REST auf wenige Requests optimieren
durch Schaffen von sehr großen Read-Only Ressourcen
durch eingebettete Ressourcen (siehe zum Beispiel HAL-Format)durch Auflosen von Links bis zu einer gewissen Tiefe (siehe zum BeispielContentful-API)
alles handischer Aufwand
beim Formulieren von Queries haufig kompliziert
Die Beschaffungsplattform fur Geschaftskunden 38
Fazit
Disclaimer
Man kann auch fur REST auf wenige Requests optimieren
durch Schaffen von sehr großen Read-Only Ressourcendurch eingebettete Ressourcen (siehe zum Beispiel HAL-Format)
durch Auflosen von Links bis zu einer gewissen Tiefe (siehe zum BeispielContentful-API)
alles handischer Aufwand
beim Formulieren von Queries haufig kompliziert
Die Beschaffungsplattform fur Geschaftskunden 38
Fazit
Disclaimer
Man kann auch fur REST auf wenige Requests optimieren
durch Schaffen von sehr großen Read-Only Ressourcendurch eingebettete Ressourcen (siehe zum Beispiel HAL-Format)durch Auflosen von Links bis zu einer gewissen Tiefe (siehe zum BeispielContentful-API)
alles handischer Aufwand
beim Formulieren von Queries haufig kompliziert
Die Beschaffungsplattform fur Geschaftskunden 38
Fazit
Disclaimer
Man kann auch fur REST auf wenige Requests optimieren
durch Schaffen von sehr großen Read-Only Ressourcendurch eingebettete Ressourcen (siehe zum Beispiel HAL-Format)durch Auflosen von Links bis zu einer gewissen Tiefe (siehe zum BeispielContentful-API)
alles handischer Aufwand
beim Formulieren von Queries haufig kompliziert
Die Beschaffungsplattform fur Geschaftskunden 38
Fazit
Disclaimer
Man kann auch fur REST auf wenige Requests optimieren
durch Schaffen von sehr großen Read-Only Ressourcendurch eingebettete Ressourcen (siehe zum Beispiel HAL-Format)durch Auflosen von Links bis zu einer gewissen Tiefe (siehe zum BeispielContentful-API)
alles handischer Aufwand
beim Formulieren von Queries haufig kompliziert
Die Beschaffungsplattform fur Geschaftskunden 38
Fazit
Wann REST
Firma/Kunden haben sich schon langere Zeit auf REST commitet
in diesem Fall kann man aber trotzdem beides anbieten (schlankesGraph-QL-Lambda vor den REST-Schnittstellen)
HTTP-Caching ist relevant (interne Schnittstellen, offentliche Schnittstellenohne HTTPS,...)
Die Beschaffungsplattform fur Geschaftskunden 39
Fazit
Wann REST
Firma/Kunden haben sich schon langere Zeit auf REST commitet
in diesem Fall kann man aber trotzdem beides anbieten (schlankesGraph-QL-Lambda vor den REST-Schnittstellen)
HTTP-Caching ist relevant (interne Schnittstellen, offentliche Schnittstellenohne HTTPS,...)
Die Beschaffungsplattform fur Geschaftskunden 39
Fazit
Wann GraphQL
man mochte eine hohe Standardisierung in Schnittstellen-Design und Tooling
Performance spielt wesentliche Rolle (Frontends, ...)
Umfeld akzeptiert neue Herangehensweisen
”If your API is not using hypermedia controls, then GraphQL could be a more
relevant approach, because you weren’t really using REST anyway.“
Phil Sturgeon, Platform Engineer @ WeWork
Empfehlung: unbedingt anschauen! :)
Die Beschaffungsplattform fur Geschaftskunden 40
Fazit
Wann GraphQL
man mochte eine hohe Standardisierung in Schnittstellen-Design und Tooling
Performance spielt wesentliche Rolle (Frontends, ...)
Umfeld akzeptiert neue Herangehensweisen
”If your API is not using hypermedia controls, then GraphQL could be a more
relevant approach, because you weren’t really using REST anyway.“
Phil Sturgeon, Platform Engineer @ WeWork
Empfehlung: unbedingt anschauen! :)
Die Beschaffungsplattform fur Geschaftskunden 40
Fazit
Wann GraphQL
man mochte eine hohe Standardisierung in Schnittstellen-Design und Tooling
Performance spielt wesentliche Rolle (Frontends, ...)
Umfeld akzeptiert neue Herangehensweisen
”If your API is not using hypermedia controls, then GraphQL could be a more
relevant approach, because you weren’t really using REST anyway.“
Phil Sturgeon, Platform Engineer @ WeWork
Empfehlung: unbedingt anschauen! :)
Die Beschaffungsplattform fur Geschaftskunden 40
Fazit
Wann GraphQL
man mochte eine hohe Standardisierung in Schnittstellen-Design und Tooling
Performance spielt wesentliche Rolle (Frontends, ...)
Umfeld akzeptiert neue Herangehensweisen
”If your API is not using hypermedia controls, then GraphQL could be a more
relevant approach, because you weren’t really using REST anyway.“
Phil Sturgeon, Platform Engineer @ WeWork
Empfehlung: unbedingt anschauen! :)
Die Beschaffungsplattform fur Geschaftskunden 40
Fazit
Wann GraphQL
man mochte eine hohe Standardisierung in Schnittstellen-Design und Tooling
Performance spielt wesentliche Rolle (Frontends, ...)
Umfeld akzeptiert neue Herangehensweisen
”If your API is not using hypermedia controls, then GraphQL could be a more
relevant approach, because you weren’t really using REST anyway.“
Phil Sturgeon, Platform Engineer @ WeWork
Empfehlung: unbedingt anschauen! :)
Die Beschaffungsplattform fur Geschaftskunden 40
Vielen Dank fur Ihre Aufmerksamkeit.
Fragen? :)
Die Beschaffungsplattform fur Geschaftskunden 41
Fazit
Verweise
Seite 10: GraphiQL https://github.com/graphql/graphiql
Seite 11: Launchpad https://launchpad.graphql.com
Seite 12: Apollo Developers http://dev.apollodata.com
Seite 13: graphql-faker https://github.com/APIs-guru/graphql-faker
Seite 15: http://graphql.org/users/
Die Beschaffungsplattform fur Geschaftskunden 42