main.go
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.
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.
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
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.