En aquest tema, explorarem dos protocols de comunicació populars en l'arquitectura de microserveis: gRPC i GraphQL. Aquests protocols ofereixen diferents avantatges i característiques que poden ser útils segons les necessitats específiques de la teva aplicació.
- Introducció a gRPC
1.1. Què és gRPC?
gRPC (Google Remote Procedure Call) és un framework de comunicació de codi obert desenvolupat per Google. Utilitza HTTP/2 per al transport, Protocol Buffers (protobuf) per a la serialització de dades i proporciona suport per a múltiples llenguatges de programació.
1.2. Característiques de gRPC
- Alt Rendiment: Utilitza HTTP/2, que permet la multiplexació de múltiples trucades en una sola connexió TCP.
- Contracte Fort: Utilitza Protocol Buffers per definir l'API, assegurant que tant el client com el servidor tinguin un contracte clar.
- Suport Multillenguatge: Compatible amb diversos llenguatges de programació com Java, C++, Python, Go, entre d'altres.
- Streaming: Suporta streaming bidireccional, permetent la transmissió contínua de dades entre client i servidor.
1.3. Exemple de gRPC
Definició del servei amb Protocol Buffers
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}Implementació del servidor en Python
import grpc
from concurrent import futures
import time
import hello_pb2
import hello_pb2_grpc
class Greeter(hello_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return hello_pb2.HelloReply(message='Hello, %s!' % request.name)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(86400)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()Implementació del client en Python
import grpc
import hello_pb2
import hello_pb2_grpc
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = hello_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(hello_pb2.HelloRequest(name='World'))
print("Greeter client received: " + response.message)
if __name__ == '__main__':
run()
- Introducció a GraphQL
2.1. Què és GraphQL?
GraphQL és un llenguatge de consulta per a APIs i un entorn d'execució per a les teves consultes, desenvolupat per Facebook. Permet als clients sol·licitar exactament les dades que necessiten, i res més.
2.2. Característiques de GraphQL
- Flexibilitat en les Consultes: Els clients poden especificar exactament quines dades necessiten.
- Tipat Fort: Utilitza un esquema fortament tipat per definir les dades disponibles.
- Una Sola Endpoint: Totes les operacions es realitzen a través d'una sola endpoint.
- Evolució de l'API: Permet afegir nous camps i tipus a l'API sense afectar les consultes existents.
2.3. Exemple de GraphQL
Definició de l'esquema
Implementació del servidor en Node.js amb Apollo Server
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type Query {
hello(name: String): String
}
`;
const resolvers = {
Query: {
hello: (_, { name }) => `Hello, ${name || 'World'}!`,
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});Consulta des del client
- Comparació entre gRPC i GraphQL
| Característica | gRPC | GraphQL |
|---|---|---|
| Transport | HTTP/2 | HTTP |
| Serialització | Protocol Buffers | JSON |
| Tipat | Fort (Protocol Buffers) | Fort (Esquema GraphQL) |
| Flexibilitat | Contracte rígid | Consultes flexibles |
| Streaming | Sí (bidireccional) | No |
| Suport Multillenguatge | Sí | Sí |
| Evolució de l'API | Difícil (requereix actualització del contracte) | Fàcil (afegir nous camps sense trencar) |
- Exercici Pràctic
4.1. Exercici amb gRPC
- Defineix un nou servei gRPC que permeti obtenir informació d'un usuari per ID.
- Implementa el servidor i el client en el llenguatge de la teva elecció.
- Prova la comunicació entre el client i el servidor.
4.2. Exercici amb GraphQL
- Defineix un esquema GraphQL que permeti obtenir informació d'un usuari per ID.
- Implementa el servidor amb Apollo Server.
- Realitza una consulta des del client per obtenir la informació de l'usuari.
Solucions
Solució gRPC
- Definició del servei:
syntax = "proto3";
service UserService {
rpc GetUser (UserRequest) returns (UserResponse) {}
}
message UserRequest {
int32 id = 1;
}
message UserResponse {
int32 id = 1;
string name = 2;
string email = 3;
}- Implementació del servidor i client (similar a l'exemple anterior).
Solució GraphQL
- Definició de l'esquema:
- Implementació del servidor:
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type Query {
user(id: Int!): User
}
type User {
id: Int
name: String
email: String
}
`;
const resolvers = {
Query: {
user: (_, { id }) => ({ id, name: `User ${id}`, email: `user${id}@example.com` }),
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});- Consulta des del client:
- Conclusió
En aquesta secció, hem explorat dos protocols de comunicació populars en l'arquitectura de microserveis: gRPC i GraphQL. Hem vist les seves característiques, avantatges i desavantatges, i hem proporcionat exemples pràctics per a cada un. Amb aquesta informació, hauràs de ser capaç de decidir quin protocol s'adapta millor a les necessitats de la teva aplicació i implementar-lo de manera efectiva.
Curs de Microserveis
Mòdul 1: Introducció als Microserveis
- Conceptes Bàsics de Microserveis
- Avantatges i Desavantatges dels Microserveis
- Comparació amb Arquitectura Monolítica
Mòdul 2: Disseny de Microserveis
- Principis de Disseny de Microserveis
- Descomposició d'Aplicacions Monolítiques
- Definició de Bounded Contexts
