Selección de herramientas: trabajo autónomo segunda semana
Explicaremos en conjunto tanto el trabajo realizado tanto para el avance de proyecto y los ejercicios de autoevaluación.
Selección del lenguaje
Para la elaboración del proyecto se han considerado una serie de lenguajes iniciales siendo los más destacados JavaScript, Go y Rust. Las razones para elegir entre estos tres lenguajes ha sido aprender un lenguaje nuevo, a pesar que en JavaScript ya tenía una pequeña base. Tras consultar varias páginas sobre el tema:
- Lenguajes de programación que debes aprender en 2020.
- Lenguajes de programación 2020.
- Rust vs Go.
- Rust vs Go 2.
- Go vs JavaScript.
- JavaScript vs Rust.
- Cuáles son los lenguajes de programación con los sueldos más altos.
se ha decido seleccionar Go como lenguaje de programación del proyecto. Las principales razones para elegirlo frente a los otros ha sido que en la bibliografía consultada se ha resaltado la facilidad de aprender el lenguaje desde cero así como la rapidez de programación en él. También se ha tenido en cuenta que es un lenguaje que actualmente está en auge y se prevé que en los próximos años hagan falta informáticos con conocimiento en el mismo. Como nunca se ha trabajado con él, han sido necesarios consultar tutoriales para conocer la sintaxis del programa y también ha sido necesaria (y será) una investigación para conocer las herramientas que dispone y que nos harán falta durante el desarrollo. Estos aspectos se irán comentando según se crea necesario. En primer lugar, ponemos los enlaces de los tutoriales de Go utilizados para conocer la sintaxis del mismo y realizar el primer acercamiento al mismo:
Se ha seguido este tutorial para instalar Go. También se ha seguido esta guía sobre cómo estructurar correctamente un proyecto en Go.
Uso de goftm
Con gofmt, que ya viene con el lenguaje, podemos automáticamente comprobar la sintaxis de los archivos o formatear el código. De hecho, en la etapa de definición de interfaces que no “podemos” ejecutar los archivos comprobamos que estos estén correctamente escritos. Además, estas comprobaciones se han incluido en el arhivo de tareas específico para que sea más fácil aplicarlas. En la etapa inicial esto se comprueba para ver que no hay problemas.
Dependiencias
Pasamos ahora ha explicar cómo se van a manejar las dependencias del proyecto. Este apartado tiene relación con el ejercicio 2. En el trabajo de investigación se ha visto que tienes la opción de usar vendoring
(más información) o Go modules
. Se ha decidido usar esta última herramienta y su funcionamiento se ha visto en este enlace y este. Se ha priorizado su uso frente a vendoring
ya que es una herramienta más moderna y que permite manejar las dependencias de una manera más sencilla.
Tests
Este apartado guarda relación con el ejercicio4. La información se ha obtenido de este enlace con un uso básico de la librería estandar de GO y este otro donde explica algunos frameworks para los tests, donde destacamos Testify que sirve para las aserciones y mocking y Ginkgo que presenta el sistema Behaviour Driven Development que permiten describir los tests. En principio, se ha decidido usar Testify
. Si accedemos a los enlaces correspondientes a Ginkgo
y Testify
vemos que la última release del primero es bastante reciente mientras que la otra fue a primeros de años. Sin embargo, Testify
presenta mayor número de estrellas. Por lo tanto, se considera que ambas herramientas serían adecuadas para el desarrollo del proyecto. Ejemplos de uso en el lenguaje lo podemos ver en este ejemplo o este otro.
Integración Continua
Este apartado guarda relación con el ejercicio5. Para llevar a cabo la integración continua se va a usar Travis
que es una herramienta que ya ha usado, por ejemplo en DatosDemograficos-curso-tdd. También se ha consultado este enlace para añadir el badge al README.md
.
Cobertura
Para la cobertura de los test se va a usar Codecov
que es una herramientas que también se usó en DatosDemograficos-curso-tdd y presenta un muy buen funcionamiento junta con la herramienta de integración continua. Para añadir el badge al README.md
se ha consultado este enlace.
Automatización
En caso de ser necesaria la automatización de tareas se usará o Tusk o Task. Se ha decidido usar el segundo ya que en GitHub aparece que se ha actualizado más recientemente y tiene mayor valoración y contribuidores. Es cierto que go ya tiene mecanismos como go test
para ejecutar los tests, pero usando Task
tenemos una manera unificada para todas las tareas existentes.
Base de datos
La herramientas de bases de datos barajadas han sido las usuales: MySQL, PostgreSQL, MongoDB, SQLite, MariaDB, etc. Todas las opciones serían adecuadas para el desarrollo del proyecto. Si comparamos PostgreSQL y MongoDB:
vemos que ambas herramientas son robustas, adecuadas y cada una de ellas tiene sus ventajas e inconvenientes. Sin embargo, se ha decidido usar PostgeSQL, ya que, aunque MongoDB es adecuada para desarrollos ágiles, PostgreSQL tiene mejor integración con otras herramientas que usaremos después como Gorm (una ORM que nos facilitará las operaciones en la base de datos). Además, presenta opciones como la facilidad de identificadores con autoincremento lo que será muy útil para poder identificar sin problemas cada una de las entradas de la base de datos. Los enlaces consultados sobre su utilización en el lenguaje y con otras herramientas han sido los siguientes:
Comunicación y tareas
La aplicación que se va a desarrollar, va a utilizar microservicios como mostramos en al arquitectura de la misma. Para ello, es necesario un sistema para la comunicación entre los microservicios. Sobre este tema se han consultado los siguientes enlaces con distintas herramientas:
- Message Broker In Microservices.
- Redis, Kafka or RabbitMQ: Which MicroServices Message Broker To Choose?
- AMQP, RabbitMQ and Celery - A Visual Guide For Dummies.
- Empezando con Apache Kafka en Golang.
- RabbitMQ.
- RabbitMQ GitHub.
- Go RabbitMQ Beginners Tutorial.
- GoCelery I.
- GoCelery II.
- Taskqueue.
- Redis QuickStar.
- Redis GitHub.
Una vez consultados estos enlaces y obtener una idea de cómo funcionan, se ha decido usar como cola de tareas para le ejecución asíncrona GoCelery. Este puede funcionar sobre Redis o AMQP(RAbbitMQ) como bróker de mensajes. Vemos que en GitHub Redis está mejor posicionado. Es cierto que presenta ciertas desventajas ya que, por ejemplo, no tiene persistencia y es más básico. Sin embargo, para nuestro aplicación puede funcionar adecuadamente.
Otros enlaces para conocer mejor estos mecanismos han sido:
- What is the difference between a message queue and a task queue?
- What is the relationship between Celery and RabbitMQ?
Configuración remota
Los servicios en la nube necesitan una configuración remota. Entre las posibilidades a usar tenemos etcd
, zookeper
o consul
. Si vemos los repositorios de estas herramientas:
y actuamos de manera similar a las herramientas anteriores vemos que las que mejor opiniones tienen son Consul
y etcd
. etcd
tiene mayor valoración que Consul
(aunque también tiene muchas estrellas) por lo que se va a usar esta. Su uso en Go se puede ver en este tutorial.
Logging
También es necesaria una herramienta de logging. La información consultada para este tema se encuentra en las siguientes páginas:
- Logging in Go: Choosing a System and Using it.
- Golang Logging: ship GoLang application logs to logstash.
- How to integrate your Go Service with ELK.
Por lo tanto se va usar logrus
y Logstash
. Dentro del lenguaje de programación no se han econtrado muchas alternativas a logrus
pero aún vemos que está bien valorada en su repositorio. Otras alternativas a Logstash
serían las mostradas pero la integración junto con logrus
es mejor y además es gratuito.
API REST Framework
El acceso a los microservicios será mediante una API REST. Dentro del lenguaje Go, tenemos framworks para construirlo como Revel, Martini o Gorilla. En nuestro caso, hemos optado por usar Gin, muy valorado en GitHub con 42.6K estrellas. Algunos ejemplos de su uso los podemos ver en este tutorial o en este donde se observa una buena división del proyecto en carpetas.