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

  1. 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".

  1. 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.

  1. 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

  1. Instal·lació de les Dependències

Per començar, necessitem instal·lar les dependències necessàries. Utilitzarem Apollo Federation per a aquest exemple.

npm install @apollo/federation @apollo/gateway graphql

  1. 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}`);
});

  1. 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

  1. 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
    }
    
  2. 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}`);
    });
    
  3. 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

query {
  users {
    id
    name
    email
  }
  products {
    id
    name
    price
  }
}

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.

© Copyright 2024. Tots els drets reservats