Contenido del curso
gRPC
- 6

gRPC: qué lo hace más rápido que REST
08:35 min - 7

JSON vs Protobuf: cuándo usar cada uno
08:56 min - 8

Definir un StudentService con proto buffers en Go
04:27 min - 9

Implementación de Repositorios y gRPC en Go con PostgreSQL
Viendo ahora - 10

Criando o primeiro servidor gRPC em Go
12:50 min - 11

Prueba tu servidor gRPC con Postman
04:08 min - 12

Definiendo el servicio de test en gRPC
03:38 min - 13

Implementando servidor gRPC con PostgreSQL en Go
17:45 min - 14

Client streaming en gRPC con Go
16:53 min - 15

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

Streaming del servidor con gRPC en Go
16:23 min - 17

Streaming bidireccional en gRPC con Go
16:04 min - 18

Prueba de streaming bidireccional con gRPC
04:55 min - 19

Implementando un cliente gRPC en Go
13:10 min - 20

Streaming bidireccional en gRPC con Go
12:16 min
Conclusión
Implementación de Repositorios y gRPC en Go con PostgreSQL
Resumen
¿Cómo implementar un servicio de back-end con Go y PostgreSQL?
En este tutorial, exploraremos cómo puedes usar Go y PostgreSQL para construir un servicio de back-end eficiente y escalable. Comenzaremos estructurando nuestro proyecto, definiendo modelos y configurando nuestra base de datos para luego implementar repositorios accesibles mediante gRPC.
¿Qué es un modelo en Go y cómo se define?
Un modelo en Go representa la estructura de los datos que planeamos manipular en nuestra aplicación. En este caso, creamos un modelo para representar a un estudiante.
Primero, debes crear una carpeta llamada models en el directorio raíz del proyecto. Dentro de esa carpeta, crea un archivo models.go donde definirás tus structs. Aquí tienes un ejemplo para un modelo de estudiante:
package models type Student struct { ID string Name string Age int32 }
Nota importante: Es crucial definir correctamente el tipo de dato, como int32, para garantizar la compatibilidad con la base de datos y el lenguaje.
¿Cómo se implementa un repositorio en Go?
En el diseño de patrones, un repositorio actúa como una capa intermedia para el acceso a datos, lo que permite la separación de lógica entre la aplicación y el almacenamiento de los datos.
-
Crear la carpeta
repository: Este será el lugar donde vivirá la lógica de acceso a datos. -
Definir la interfaz del repositorio:
package repository import ( "context" "github.com/tuusuario/proyecto/models" ) type Repository interface { GetStudent(ctx context.Context, id string) (models.Student, error) SetStudent(ctx context.Context, student models.Student) error } -
Crear una implementación para PostgreSQL:
Crea un archivo
postgres.godentro de un paquetedatabase:package database import ( "context" "database/sql" "github.com/tuusuario/proyecto/models" _ "github.com/lib/pq" // PostgreSQL driver ) type PostgresRepository struct { db *sql.DB } func NewPostgresRepository(url string) (*PostgresRepository, error) { db, err := sql.Open("postgres", url) if err != nil { return nil, err } return &PostgresRepository{db: db}, nil }
¿Cómo configurar la base de datos PostgreSQL?
Para configurar y utilizar PostgreSQL, necesitas un script de operaciones SQL que defina tu tabla de estudiantes y un Dockerfile para su contenedor.
-
Crear script SQL:
DROP TABLE IF EXISTS students; CREATE TABLE students ( id VARCHAR(32) PRIMARY KEY, name VARCHAR NOT NULL, age INTEGER ); -
Configurar Dockerfile:
FROM postgres:10.3 COPY op.sql /docker-entrypoint-initdb.d/
¿Cómo usar gRPC para operaciones de cliente-servidor?
El uso de gRPC permite crear servicios escalables y eficientes, esenciales en microservicios y arquitecturas distribuidas.
-
Instalar las dependencias de gRPC:
go get google.golang.org/grpc -
Implementar las funciones
SetStudentyGetStudenten el repositorio:func (r *PostgresRepository) SetStudent(ctx context.Context, student models.Student) error { _, err := r.db.ExecContext(ctx, "INSERT INTO students (id, name, age) VALUES ($1, $2, $3) ON CONFLICT (id) DO UPDATE SET name = $2, age = $3", student.ID, student.Name, student.Age) return err } func (r *PostgresRepository) GetStudent(ctx context.Context, id string) (models.Student, error) { row := r.db.QueryRowContext(ctx, "SELECT id, name, age FROM students WHERE id = $1", id) var student models.Student err := row.Scan(&student.ID, &student.Name, &student.Age) if err != nil { return models.Student{}, err } return student, nil }
Este proceso te permitirá implementar un servicio gestionado por repositorios y accesible mediante gRPC, promoviendo una estructura limpia y mantenible en tu proyecto. Recuerda que la práctica hace al maestro, ¡así que sigue experimentando y mejorando tus habilidades con Go y PostgreSQL!