Implementación de Cliente gRPC en Go para Comunicación con Servidor
Clase 19 de 22 • Curso de Go Avanzado: Protobuffers y gRPC
Resumen
¿Cómo implementar un cliente gRPC en Go?
El mundo de gRPC ofrece una estructura poderosa y flexible para la comunicación servidor-cliente. Una pieza fundamental, pero a menudo pasada por alto, es la del cliente gRPC. Ahora, exploraremos cómo implementar un cliente en Go, que se comunique perfectamente con un servidor local. El objetivo es entender cómo se puede replicar el comportamiento que usualmente manejamos con herramientas como Postman, pero directamente en código.
¿Cómo iniciar la conexión con el servidor gRPC?
El primer paso consiste en establecer una conexión con el servidor. Para esto, Go nos ofrece el paquete gRPC
con funcionalidades específicas.
grpc.Dial("localhost:5070", grpc.WithTransportCredentials(insecure.NewCredentials()))
- Especificar dirección: Usamos
localhost:5070
, que es donde nuestro servidor está corriendo. - Credenciales: Utilizamos
insecure.NewCredentials
para evitar complicaciones iniciales con encriptación. Sin embargo, recuerda siempre migrar a conexiones seguras para producción.
¿Cómo manejar errores y cerrar conexiones?
Es crucial gestionar errores y asegurarse de que las conexiones se cierren adecuadamente al finalizar su uso.
if err != nil {
log.Fatalf("No se pudo conectar: %v", err)
}
defer conn.Close()
- Errores de conexión: Al establecer la conexión, es esencial manejar posibles errores.
- Cerrar conexiones: Usamos
defer
para cerrar la conexión automáticamente al finalizar el programa.
¿Cómo crear un cliente gRPC?
Una vez conectados, el siguiente paso es instanciar nuestro cliente utilizando los archivos generados por protocolo buffer (TestPB).
client := TestPB.NewTestServiceClient(conn)
¿Cómo implementar una función cliente unario?
Las llamadas unarias son solicitudes de cliente a servidor con una sola respuesta. Veamos cómo implementarlas.
func doUnary(c TestPB.TestServiceClient) {
request := &TestPB.GetTestRequest{Id: "t1"}
response, err := c.GetTest(context.Background(), request)
if err != nil {
log.Fatalf("Error al obtener test: %v", err)
}
fmt.Printf("Response from server: %v\n", response)
}
- Solicitud y respuesta: Creamos un
GetTestRequest
y utilizamos el métodoGetTest
para enviar la solicitud. - Contexto: Utilizamos
context.Background()
para el manejo de contexto en la solicitud.
¿Cómo implementar el client streaming?
El client streaming permite que el cliente envíe una secuencia de mensajes al servidor, quien responde una vez completa la transmisión.
func doClientStreaming(c TestPB.TestServiceClient) {
stream, err := c.SetQuestions(context.Background())
if err != nil {
log.Fatalf("Error al abrir stream: %v", err)
}
questions := []*TestPB.Question{
{Id: "q8t1", Answer: "azul", Text: "¿Qué color asocias a GoLang?", TestId: "t1"},
// Otras preguntas...
}
for _, question := range questions {
stream.Send(question)
time.Sleep(2 * time.Second)
}
response, err := stream.CloseAndRecv()
if err != nil {
log.Fatalf("Error al recibir respuesta: %v", err)
}
fmt.Printf("Servidor responde: %v\n", response)
}
- Creación de streaming: Con
c.SetQuestions
, iniciamos el streaming. - Enviar datos: Iteramos sobre las preguntas y las enviamos al servidor.
- Recibir respuesta: Cerramos el stream y obtenemos la respuesta con
stream.CloseAndRecv()
.
¿Qué hemos aprendido sobre RPC en la implementación?
Implementar un cliente gRPC implica crear simulaciones de métodos servidor desde el cliente. Aunque las funciones parecen locales, la verdadera comunicación y procesamiento ocurren en el servidor.
- Simplicidad de llamada: gRPC permite que los métodos remotos se vean y se sientan como invocaciones locales.
- Ejemplo práctico: Llamamos a métodos como
GetTest
oSetQuestions
, que ejecutan lógica del servidor previamente definida.
Al culminar estos ejercicios, te animamos a experimentar más con los diferentes tipos de llamadas que gRPC ofrece. La flexibilidad de gRPC en Go te permitirá crear conexiones eficientes y seguras en tus aplicaciones distribuidas. ¡Sigue explorando y aprendiendo!