View on GitHub

EvaluaUGR

Proyecto para la asignatura de Cloud Computing del Máster en Ingeniería Informática

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:

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:

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:

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:

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.