graphql, das bessere rest?...graphql? "graphql is a query language for apis and a runtime for...

Post on 23-May-2020

32 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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 Adlerjoerg.adler@mercateo.com@joerg adler

Benjamin Ottobenjamin.otto@mercateo.com

@ 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 Adlerjoerg.adler@mercateo.com@joerg adler

Benjamin Ottobenjamin.otto@mercateo.com

@ 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

top related