La federació de GraphQL és una tècnica avançada que permet dividir un esquema de GraphQL en múltiples serveis independents, cadascun responsable d'una part de l'esquema. Això facilita la gestió, escalabilitat i manteniment de grans aplicacions. En aquest tema, explorarem els conceptes clau de la federació de GraphQL, com configurar-la i com treballar amb serveis federats.
Conceptes Clau
- Què és la Federació de GraphQL?
La federació de GraphQL permet dividir un esquema monolític en múltiples serveis més petits, cadascun responsable d'una part específica de l'esquema. Això es coneix com a "microserveis de GraphQL".
- Avantatges de la Federació
- Escalabilitat: Permet escalar serveis de manera independent.
- Mantenibilitat: Facilita la gestió i manteniment de l'esquema.
- Modularitat: Cada equip pot treballar en un servei específic sense afectar els altres.
- Components de la Federació
- Gateway: Servei que actua com a punt d'entrada únic per a totes les consultes de GraphQL.
- Subgràfics: Serveis independents que defineixen parts de l'esquema.
Configuració de la Federació de GraphQL
- Instal·lació de les Dependències
Per començar, necessitem instal·lar les dependències necessàries. Utilitzarem Apollo Federation per a aquest exemple.
- Creació de Subgràfics
Cada subgràfic és un servei independent que defineix una part de l'esquema. A continuació, es mostra un exemple de com crear un subgràfic per a un servei d'usuaris.
Esquema del Subgràfic d'Usuaris
# user-schema.graphql type User @key(fields: "id") { id: ID! name: String! email: String! } extend type Query { users: [User] user(id: ID!): User }
Resolver del Subgràfic d'Usuaris
// user-resolvers.js const { ApolloServer, gql } = require('apollo-server'); const { buildFederatedSchema } = require('@apollo/federation'); const typeDefs = gql` type User @key(fields: "id") { id: ID! name: String! email: String! } extend type Query { users: [User] user(id: ID!): User } `; const resolvers = { Query: { users: () => [{ id: '1', name: 'John Doe', email: '[email protected]' }], user: (_, { id }) => ({ id, name: 'John Doe', email: '[email protected]' }), }, User: { __resolveReference: (user) => ({ id: user.id, name: 'John Doe', email: '[email protected]' }), }, }; const server = new ApolloServer({ schema: buildFederatedSchema([{ typeDefs, resolvers }]), }); server.listen({ port: 4001 }).then(({ url }) => { console.log(`User service ready at ${url}`); });
- Configuració del Gateway
El gateway és el punt d'entrada únic per a totes les consultes de GraphQL. Agrega els esquemes dels subgràfics.
// gateway.js const { ApolloServer } = require('apollo-server'); const { ApolloGateway } = require('@apollo/gateway'); const gateway = new ApolloGateway({ serviceList: [ { name: 'users', url: 'http://localhost:4001' }, // Afegiu altres subgràfics aquí ], }); const server = new ApolloServer({ gateway, subscriptions: false, }); server.listen({ port: 4000 }).then(({ url }) => { console.log(`Gateway ready at ${url}`); });
Exercici Pràctic
Objectiu
Crear un subgràfic per a un servei de productes i integrar-lo amb el gateway.
Passos
-
Crear l'esquema del subgràfic de productes:
# product-schema.graphql type Product @key(fields: "id") { id: ID! name: String! price: Float! } extend type Query { products: [Product] product(id: ID!): Product }
-
Crear els resolvers del subgràfic de productes:
// product-resolvers.js const { ApolloServer, gql } = require('apollo-server'); const { buildFederatedSchema } = require('@apollo/federation'); const typeDefs = gql` type Product @key(fields: "id") { id: ID! name: String! price: Float! } extend type Query { products: [Product] product(id: ID!): Product } `; const resolvers = { Query: { products: () => [{ id: '1', name: 'Laptop', price: 999.99 }], product: (_, { id }) => ({ id, name: 'Laptop', price: 999.99 }), }, Product: { __resolveReference: (product) => ({ id: product.id, name: 'Laptop', price: 999.99 }), }, }; const server = new ApolloServer({ schema: buildFederatedSchema([{ typeDefs, resolvers }]), }); server.listen({ port: 4002 }).then(({ url }) => { console.log(`Product service ready at ${url}`); });
-
Afegir el subgràfic de productes al gateway:
// gateway.js const { ApolloServer } = require('apollo-server'); const { ApolloGateway } = require('@apollo/gateway'); const gateway = new ApolloGateway({ serviceList: [ { name: 'users', url: 'http://localhost:4001' }, { name: 'products', url: 'http://localhost:4002' }, ], }); const server = new ApolloServer({ gateway, subscriptions: false, }); server.listen({ port: 4000 }).then(({ url }) => { console.log(`Gateway ready at ${url}`); });
Solució
Després de seguir els passos anteriors, hauríeu de tenir un sistema federat de GraphQL amb dos subgràfics: usuaris i productes. Podeu provar-ho fent consultes al gateway.
Exemple de Consulta
Resum
En aquesta secció, hem après què és la federació de GraphQL, els seus avantatges i com configurar un sistema federat utilitzant Apollo Federation. Hem creat subgràfics per a usuaris i productes i els hem integrat amb un gateway. La federació de GraphQL és una tècnica poderosa per gestionar esquemes grans i complexos, permetent una major escalabilitat i mantenibilitat.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL