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