build federated graphql schemas in java using osgi and jahia · osgi modules with support for...

Post on 19-Mar-2020

10 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Build federated GraphQL schemas in Java using OSGi and Jahia

About me

Senior Full Stack Developer at Jahia Solutions

Apache Unomi Committer

https://github.com/DameniMilo

2

Context

3

OSGi

https://www.osgi.org

Java framework

Hot deployment of modules

Used in many domains

4

GraphQL

https://graphql.org/

Open Source

Query language for APIs

Flexible

5

Jahia

https://www.jahia.com

Open Source CMS

Modular runtime (OSGi)

GraphQL Gateway

6

How does this work together

GraphQL Gateway

GraphQL Extension 1

GraphQL Extension 2

7

Federation VS Stitching

8

What is schema stitching?

“ Schema stitching is the process of creating a single GraphQL schema

from multiple underlying GraphQL APIs. “

9

So, what’s the problem?● Monolithic

● Multiple requests

● “Glue” code

● Extend query only

10

Maybe better with a little example

type Movie {id: ID!title: Stringoverview: String

}type Query {

movieById(id: ID!): Movie}

11

Let’s extend it

type Actor { id: ID! name: String}type Query { actorById(id: ID!): Actor actorsByMovieId(id: ID!): [Actor]}

12

Result

type Query {movieById(id: ID!): MovieactorById(id: ID!): ActoractorsByMovieId(id: ID!): [Actor]

}

13

What is schema federation?The same… but different!

14

● Build declarative graph

● Code can be split

● Graph are easy to consume

Back to our example

type Movie {id: ID!title: Stringoverview: String

}type Query {

movieById(id: ID!): Movie}

15

With its extension

extend type Movie { actors: [Actor]}type Actor { id: ID! name: String}

16

Federation with Java and OSGi

17

Why?

Because of dynamic federation:

OSGi modules with support for GraphQL federation make it possible to evolve a GraphQL schema at runtime.

18

GraphQL schema evolution rulesNever remove a field

Never change a field’s arguments

Add new fields if new arguments or semantics of a field must change

No need to version GraphQL schemas, unless major rewrites happen

Don’t split schemas, prefer aggregation layers instead

19

Let get cracking!3 modules retrieving movie data from TMDB and IMDB:

20

● Team A provides a new entry tmdb in query and add a new type Movie

● Team B needs to extend the Movie type with an Actor type to get the actors

list of a movie

● Team C needs to enrich the movie data with information coming from

another API

Common partRegistering the extension

21

Common part Declaring the extension

22

Team A

23

Team A

24

Team A

25

Team B

26

Team B

27

Team B

28

Team C

29

Team C

30

Summary

● Extend an existing schema

● Not overload the query type

● Enrich an existing scheme with data from another API

● Split the code

31

With schema federation and OSGi, we are able to:

Resourceshttps://www.jahia.com/jcontent

https://github.com/Jahia/graphql-core

https://github.com/DameniMilo/graphql-tmdb-provider

https://github.com/DameniMilo/graphql-tmdb-extension

https://github.com/DameniMilo/graphql-imdb-extension

32

Useful linkshttps://en.wikipedia.org/wiki/OSGi

https://karaf.apache.org/

https://unomi.apache.org/

https://blog.apollographql.com/apollo-federation-f260cf525d21

https://www.apollographql.com/docs/graphql-tools/schema-stitching/

33

THANK YOU!

top related