Implementación de Cliente gRPC en Go para Comunicación con Servidor
Clase 19 de 22 • Curso de Go Avanzado: Protobuffers y gRPC
Contenido del curso
- 6

RPC y gRPC: Protocolos para Comunicación Eficiente entre Servicios
08:36 - 7

Comparativa de JSON y Protobufers en Intercambio de Datos
08:57 - 8

Definición de Servicios gRPC con Protocol Buffers en Go
04:28 - 9

Implementación de Repositorios y gRPC en Go con PostgreSQL
12:00 - 10

Implementación de Servidor gRPC para Gestión de Estudiantes
12:50 - 11

Pruebas de API gRPC con Postman y Docker
04:08 - 12

Definición de Servicios gRPC en Go para Pruebas y Exámenes
03:39 - 13

Implementación de gRPC Server y Métodos en Go
17:45 - 14

Implementación de Streaming del Cliente con gRPC en Go
16:53 - 15

Implementación de Streaming del Servidor con gRPC y Protobufs
16:25 - 16

Implementación de Streaming gRPC del Lado del Servidor en Go
16:24 - 17

Streaming Bidireccional con gRPC: Implementación y Pruebas
16:04 - 18

Pruebas de Streaming Bidireccional con gRPC y Postman
04:55 - 19

Implementación de Cliente gRPC en Go para Comunicación con Servidor
13:11 - 20

Implementación de Streaming en gRPC: Servidor y Bidireccional
12:16
¿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.NewCredentialspara 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
deferpara 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
GetTestRequesty utilizamos el métodoGetTestpara 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
GetTestoSetQuestions, 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!