Anthony Giniers
@antogyn
@aginiers
Construire une architecture GraphQL distribuée avec Apollo Federation (todo)
https://slides.com/antogyn/apollo-federation
Principes de base de GraphQL
Implémentations habituelles de GraphQL dans une architecture distribuée
Live Coding d'Apollo Federation
GraphQL est un langage de requête pour des données de type graphe
Alternative à REST
Une requête GraphQL est une liste hiérarchique de champs
{
user(id: "123") {
id
name
company {
name
website
}
}
}
{
"user" : {
"id": "123",
"name": "Anthony Giniers",
"company": {
"name": "Swan",
"website": "https://www.swan.io"
}
}
}
→ Les données ont la même forme que la requête
→ Elles sont accessibles en une seule requête
type Query {
user(id: String!): User
}
type User {
id: String!
name: String
company: Company
}
type Company {
name: String!
website: String
}
{
user(id: "123") {
id
name
company {
name
website
}
}
}
Les spécifications sont encodées dans le client
{
user(id: "123") {
id
name
}
}
type User {
id: String!
name: String @deprecated
identity: Identity
}
type Identity {
name: String
}
{
user(id: "123") {
id
identity {
name
}
}
}
type User {
id: String!
name: String
}
{
"__schema": {
"types": [
{
"name": "User",
"fields": [
{
"name": "id",
"type": {
"name": "String"
}
},
{
"name": "name",
"type": {
"name": "String"
}
}
]
}
...
]
}
}
type User {
id: String
name: String
}
{
__schema {
types {
name
fields {
name
type {
name
}
}
}
}
}
Par exemple :
IAM
Payment
Gateway
REST, gRPC, ...
REST, gRPC, ...
Les +
Les -
type User {
id: String!
name: String
}
IAM
Payment
Gateway
Les +
Les -
type User {
id: String!
name: String
payments: [Payment]
}
type Payment {
value: String
user: User
}
Comment lier Payment et User ??
{
user("123") { <=== récupéré depuis IAM
payments { <=== récupéré depuis Payment
user { <=== récupéré depuis IAM
name
}
}
}
}
IAM
Payment
Gateway
type User {
id: String!
name: String
payments: [Payment]
}
type Payment {
value: String
user: User
}
Comment lier Payment et User ??
type User {
id: String!
name: String
payments: [Payment] <== que vient faire payment ici ?
}
type Payment {
value: String
user: User
}
IAM
Payment
type User {
id: String!
name: String
}
type Payment {
value: String
user: User
}
extend type User {
payments: [Payment]
}
type Payment {
value: String
user: User
}
extend type User @key(fields: "id") {
id: String! @external
payments: [Payment]
}
type User @key(fields: "id") {
id: String!
name: String
}
Questions ?