Implementación de Servidor gRPC para Gestión de Estudiantes

Clase 10 de 22Curso de Go Avanzado: Protobuffers y gRPC

Resumen

¿Cómo implementar un servidor gRPC en Go?

¡Felicidades por llegar hasta aquí! Estás a punto de aprender cómo implementar tu primer servidor gRPC en Go, un paso crucial para ampliar tus habilidades de desarrollo utilizando Go y gRPC, un marco de trabajo poderoso para crear servicios remotos eficaces. Vamos a recorrer este proceso paso a paso.

¿Cómo empezamos la configuración?

Primero, necesitamos definir la estructura básica del servidor. Para ello, comenzaremos creando una nueva carpeta llamada server y dentro de esta, un archivo denominado server.go. En este archivo, declararemos un paquete de servidor y definiremos nuestro primer servidor como una estructura (struct). Esta estructura recibirá un tipo de repositorio como un valor de entrada. Aquí tienes cómo se vería:

package server

type Server struct {
    repo Repository
}

func NewStudentServer(repo Repository) *Server {
    return &Server{repo: repo}
}

¿Cómo implementamos las funciones de getStudent y setStudent?

A continuación, debemos implementar las funciones que permitirán obtener y establecer información sobre los estudiantes. Empezaremos por getStudent, utilizando el archivo protobuffer que contiene nuestros paquetes generados.

func (s *Server) getStudent(ctx context.Context, req *studentpb.GetStudentRequest) (*studentpb.Student, error) {
    student, err := s.repo.GetStudent(ctx, req.GetId())
    if err != nil {
        return nil, err
    }
    return &studentpb.Student{
        Id:   student.Id,
        Name: student.Name,
        Age:  student.Age,
    }, nil
}

Para setStudent, creamos una función similar que toma un contexto y un request de tipo student:

func (s *Server) setStudent(ctx context.Context, req *studentpb.Student) (*studentpb.SetStudentResponse, error) {
    student := &models.Student{
        Id:   req.GetId(),
        Name: req.GetName(),
        Age:  req.GetAge(),
    }

    err := s.repo.SetStudent(ctx, student)
    if err != nil {
        return nil, err
    }

    return &studentpb.SetStudentResponse{
        Id: student.Id,
    }, nil
}

¿Cómo se crea un servicio que implemente el servidor?

Para desplegar el servidor, necesitamos crear un archivo main.go dentro de una nueva carpeta llamada serverStudent. Aquí es donde se realizará la inicialización del servidor y la conexión a TCP.

package main

import (
    "log"
    "net"
    "google.golang.org/grpc"
)

func main() {
    listener, err := net.Listen("tcp", ":5060")
    if err != nil {
        log.Fatalf("Failed to listen: %v", err)
    }

    repo := NewPostgresRepository("your_database_url")
    server := NewStudentServer(repo)

    s := grpc.NewServer()
    studentpb.RegisterStudentServiceServer(s, server)

    reflection.Register(s)

    if err := s.Serve(listener); err != nil {
        log.Fatalf("Failed to serve: %v", err)
    }
}

Este código crea un servidor TCP que escucha en el puerto 5060, instancia el repositorio para gestionar las interacciones con la base de datos, e inicializa un servidor gRPC que utiliza el paquete studentpb.

Recuerda incorporar la función de reflection antes de iniciar el servidor. Esto es vital para poder usar herramientas como Postman para probar las APIs, ya que ayudará en la transmisión de metadata necesaria.

Con este conocimiento, estás bien equipado para crear un servidor gRPC en Go que maneje métodos para operar con estudiantes. ¡Continúa explorando y desarrollando tus habilidades con entusiasmo y confianza! En la próxima clase, abordaremos cómo probar estos métodos implementados utilizando Postman.