En aquest tema, explorarem com integrar GraphQL en una arquitectura de microserveis. Els microserveis són una manera de dissenyar aplicacions com una col·lecció de serveis petits i independents que es comuniquen entre ells. GraphQL pot ser una eina poderosa per unificar aquestes comunicacions i proporcionar una interfície coherent per als clients.
Objectius d'aprenentatge
- Comprendre els avantatges d'utilitzar GraphQL en una arquitectura de microserveis.
- Aprendre a dissenyar esquemes de GraphQL per a microserveis.
- Implementar un servidor GraphQL que agregui dades de diversos microserveis.
- Gestionar la comunicació i la seguretat entre microserveis amb GraphQL.
Avantatges de GraphQL en microserveis
- Unificació de dades: GraphQL permet als clients obtenir dades de múltiples microserveis amb una sola consulta.
- Flexibilitat: Els clients poden sol·licitar exactament les dades que necessiten, reduint la sobrecàrrega de dades.
- Evolució de l'API: Les APIs de GraphQL poden evolucionar sense trencar les aplicacions clients, ja que les noves funcionalitats es poden afegir sense afectar les existents.
Disseny d'esquemes de GraphQL per a microserveis
Quan dissenyem esquemes de GraphQL per a microserveis, és important tenir en compte com es distribuiran les dades i com es gestionaran les dependències entre serveis.
Exemples de disseny d'esquemes
Suposem que tenim una aplicació de comerç electrònic amb els següents microserveis:
- Servei d'Usuaris: Gestiona la informació dels usuaris.
- Servei de Productes: Gestiona la informació dels productes.
- Servei de Comandes: Gestiona les comandes dels usuaris.
Podem dissenyar un esquema de GraphQL que agregui dades d'aquests serveis:
type User {
id: ID!
name: String!
email: String!
orders: [Order]
}
type Product {
id: ID!
name: String!
price: Float!
}
type Order {
id: ID!
user: User!
products: [Product]!
total: Float!
}
type Query {
user(id: ID!): User
product(id: ID!): Product
order(id: ID!): Order
}Implementació de resolvers
Els resolvers són responsables de recuperar les dades dels microserveis corresponents. A continuació, es mostra un exemple de resolvers per a l'esquema anterior:
const resolvers = {
Query: {
user: async (_, { id }) => {
// Crida al Servei d'Usuaris
return fetchUserById(id);
},
product: async (_, { id }) => {
// Crida al Servei de Productes
return fetchProductById(id);
},
order: async (_, { id }) => {
// Crida al Servei de Comandes
return fetchOrderById(id);
},
},
User: {
orders: async (user) => {
// Crida al Servei de Comandes per obtenir les comandes de l'usuari
return fetchOrdersByUserId(user.id);
},
},
Order: {
user: async (order) => {
// Crida al Servei d'Usuaris per obtenir la informació de l'usuari
return fetchUserById(order.userId);
},
products: async (order) => {
// Crida al Servei de Productes per obtenir la informació dels productes
return fetchProductsByIds(order.productIds);
},
},
};Comunicació entre microserveis
La comunicació entre microserveis pot ser gestionada mitjançant crides HTTP, RPC (Remote Procedure Call) o altres protocols de comunicació. És important assegurar-se que aquestes comunicacions siguin segures i eficients.
Exemple de crida HTTP
const fetchUserById = async (id) => {
const response = await fetch(`http://user-service/users/${id}`);
return response.json();
};
const fetchProductById = async (id) => {
const response = await fetch(`http://product-service/products/${id}`);
return response.json();
};
const fetchOrderById = async (id) => {
const response = await fetch(`http://order-service/orders/${id}`);
return response.json();
};Seguretat en GraphQL per a microserveis
La seguretat és un aspecte crític en qualsevol arquitectura de microserveis. Algunes pràctiques recomanades inclouen:
- Autenticació i autorització: Assegurar-se que només els usuaris autoritzats puguin accedir a les dades.
- Limitació de velocitat: Prevenir abusos limitant el nombre de consultes que un client pot fer en un període de temps determinat.
- Validació de dades: Assegurar-se que les dades enviades i rebudes compleixin amb els requisits esperats.
Exemple d'autenticació
const { ApolloServer } = require('apollo-server');
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
// Obtenir el token d'autenticació de les capçaleres de la sol·licitud
const token = req.headers.authorization || '';
// Validar el token i obtenir la informació de l'usuari
const user = validateToken(token);
// Afegir l'usuari al context
return { user };
},
});Exercici pràctic
Exercici
Implementa un servidor GraphQL que agregui dades de dos microserveis: un servei d'usuaris i un servei de productes. El servidor ha de permetre obtenir la informació d'un usuari i els productes que ha comprat.
Solució
const { ApolloServer, gql } = require('apollo-server');
const fetch = require('node-fetch');
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
products: [Product]
}
type Product {
id: ID!
name: String!
price: Float!
}
type Query {
user(id: ID!): User
}
`;
const resolvers = {
Query: {
user: async (_, { id }) => {
const response = await fetch(`http://user-service/users/${id}`);
return response.json();
},
},
User: {
products: async (user) => {
const response = await fetch(`http://product-service/products?userId=${user.id}`);
return response.json();
},
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});Conclusió
Integrar GraphQL en una arquitectura de microserveis pot proporcionar una interfície unificada i flexible per als clients, permetent una millor gestió de les dades i una evolució més fàcil de l'API. En aquest tema, hem après a dissenyar esquemes de GraphQL per a microserveis, implementar resolvers per agregar dades de diversos serveis i gestionar la comunicació i la seguretat entre microserveis. Amb aquests coneixements, estàs preparat per aplicar GraphQL en una arquitectura de microserveis en projectes del món real.
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
