microservices-schnitt jetzt mit graphql! · graphql-java interessant wegen migration von java...

Post on 20-Jul-2020

5 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related