Mi plantilla para proyectos en 2023 usando Go (Fiber y MongoDB) 👨🏽‍💻

10 de Noviembre del 2022 ¿Ves algún error? Corregir artículo golang wallpaper

Ya estamos cerca al final del 2022 y esto quiere decir es un año más en el que trabaje como desarrollador Golang full time, dentro de este año de trabajo descubrí nuevas herramientas que te ayudan en el flujo de desarrollo y la documentación como tambien una nueva forma de organizar mis proyectos de manera que escalen de forma saludable.

El Stack 🧱

Haremos un mini recorrido a las herramientas que le dan vida a esta plantilla y sabremos porque las uso actulamente.

  • El enrutador 🚀: Para el enrutador escogí usar Fiber debido a las multiples herramientas que tiene desarralladas internamente en el framework y porque me parece que la declaracion de rutas es mucho más intuitiva.

  • La base de datos 💾: Para el almacenamiento de datos escogí a MongoDB por su facíl despliegue y más que todo por que la mayoría de proyectos que desarrolle en 2022 y 2021 me pidieron usar esta base de datos.

  • La documentación 📄: Una de las partes más importantes cuando desarrollas un proyecto en el ambito profesional es la documentación recuerda que trabajaras con más desarrolladores. Para esto usaremos Swag un paquete de Go que nos permite generar la documentación en base a comentarios.

  • Los logs ⚡️: En cuanto a los logs es una combiancion entre una herramienta desarrollada en el proyecto que me permite tener logs en un archivo de CSV y para los Logs en el servidor uso Zap

  • Los tests 💀: En los test use la librería nativa de Go en combinación de la libreía de mocks gomock para generar mocks automaticamente a partir de mis interfaces.

  • Los contenedores 🐳: Para el despligue en contenedores por ahora sigo usando Docker, estoy explorando nuevas opciones, si tienes alguna recomendación dejala en los comentarios.

  • El despliegue 🐙: Para el CI estoy totalmente enamorado de Github actions y de su potencial, me decante por Github Actions por la facilidad de integración con tu repositorio.

La clave para ser un buen programador es mantenerse en constante aprendizaje. 👉🏽

La estructura de archivos 📂

Tenemos una combinación entre el famoso repositorio de Go Standart Layout que es un "Estandar" no oficial y la estructura de los paquetes viene de la estructura de carpetas de la Arquitectura Hexagonal.

Dentro de los paquetes podemos apreciar dentro de la carpeta internal/user que tenemos 3 carpetas application, domain e infrastructure. Para mantener las funcionalidades lo más faciles de entender posible tengo archivos separados para cada una de las funcionalidades.

Deje este proyecto como plantilla en Github en caso quieran verlo más a detalle y como ejemplo implemente todo el sistema de login y de autenticación usando JWT.

Ver proyecto.

.github

workflows

CI.yaml

cmd

http

main.go

config

env.json

deploy

dockerfile

docs

docs.go

swagger.json

swagger.yaml

hooks

pre-commit.sh

internal

user

application

application.go

create_user.go

create_user_test.go

domain

models

user.go

ports

user_application.go

user_handlers.go

user_repository.go

infrastructure

handlers

fiber.go

create_user.go

create_user_test.go

repositories

mongo.go

create_user.go

create_user_test.go

logs

log-2023-01-01.csv

pkg

middleware

application

middleware.go

authenticate.go

domain

request.go

ports.go

infrastructure

scripts

build.sh

generate-mocks.sh

.gitignore

go.mod

go.sum

main.go

README.md

Conclusiones 🤔

Cada año mejoras como desarrollador a nivel exponenciale si constantemente estas empezando nuevos proyectos, te ayuda a pensar: ¿Qué hubiese hecho diferente al empezar este proyecto? ¿Qué herrammienta hubiese usado en cambio de esta otra? y aplicarlas vas iterando poco a poco hasta encontrar tu "template" perfecto para empezar un proyecto. Por ahora esta es la mía y espero que les sea de ayuda para que puedan crear la suya segun sus necesidades.

Conviértete en un Go Ninja 🥷.Suscríbete a mi newsletter y recibe las últimas novedades en Go.