Microservicios

Publicado por

1. Introducción

El término de microservicio normalmente se utiliza para describir un enfoque del desarrollo de software que involucra la descomposición de la funcionalidad de la aplicación en componentes individuales que pueden ser desplegados de manera independiente unos de otros; y que normalmente se comunican a través de interfaces de aplicaciones o APIs.

Las características comunes de los microservicios son:

  • Soportan protocolos HTTP/REST
  • Implementan métodos de intercambio de datos basados en formatos JSON o XML
  • Se despliegan con frameworks basados en contenedores, como Docker
  • Escalan dinámicamente sobre una infraestructura cloud privada o pública
  • Normalmente persisten los datos en almacenamiento noSQL, microSQL o clave valor

Los beneficios de utilizar microservicios son los siguientes:

  • Mayor resistencia y tolerancia a fallos debido al aislamiento de un servicio
  • Capacidad de escalar los servicios según sea necesario
  • Aumenta la reutilización definiendo interfaces estandarizadas
  • Se pueden construir servicios separados en diferentes lenguajes de programación
  • Migraciones más fáciles porque los servicios pueden rediseñarse o reconstruirse con diferentes tecnologías con la misma definición de API y minimizar la interrupción

Los microservicios son utilizados por grandes compañías como Amazon, eBay, Netflix, PayPal o Twitter.

Lo contrario a un microservicio es una aplicación “monolito” donde toda la funcionalidad es parte de un programa corriendo sobre una máquina.

Hay discusiones sobre cuan “micro” debería ser un servicio, si los datos deberían ser parte de cada servicio y si el nombre es microservicios o servicios desacoplados, y otra definición podría ser:

“En las arquitecturas de microservicios, las aplicaciones se crean y se despliegan como servicios simples, desacoplados y enfocados en una tarea. El sistema de comunicación entre ellos es agnóstico y con un lenguaje liviano lo que se traduce en APIs HTTP y colas de mensajería. Los servicios se construyen alrededor de las capacidades del negocio y se pueden modificar y desplegar independientemente con un mínimo de administración centralizada. Pueden utilizar diferentes lenguajes de programación y múltiples sistemas de almacenamiento de datos”.

2. Arquitectura de microservicios

1) Contenedores

No se pueden crear microservicios sin contenedores, existen múltiples piezas que tienen que ser desarrolladas, probadas y desplegadas en producción, y hacerlo con contenedores facilita cada una de las tareas.

Herramientas: Docker.

2) Clúster

Necesitamos un conjunto de servidores donde desplegar microservicios y necesitamos que haya más de una instancia de cada uno corriendo sobre distintas máquinas para evitar escenarios de fallo. Podemos desplegar sobre una nube privada o pública lo importante es codificar esa infraestructura. Esta tarea puede realizarse con Ansible, pero teniendo en cuenta los requisitos de escalar rápidamente, no tiene sentido esperar a que se críe y se aprovisione un servidor, en vez de ello se puede construir una imagen de la máquina con todas las herramientas instaladas y luego usar esa imagen con Terraform o Cloudformation

3) Orquestador

El orquestador conoce los requisitos de memoria de los servicios y que cantidad de CPU debe ser reservada, también coloca cada servicio en el servidor apropiado.

Herramientas: Docker Swarm, Kubernetes.

4) Integración continua

Hay que automatizar todo lo que se pueda, los procesos de construir, medir, aprender y repetir se vuelven más ágiles con la integración continua, de esta forma podemos repetir el ciclo más veces.

Hay que esforzarse en automatizar todo, hasta el punto en que comitear a la rama master debería desencadenar la puesta a punto del cambio realizado en el entorno de pruebas. Se deberían abrir ramas para desarrollar las mejoras y los commits a la rama master deberían tener los mecanismos de seguridad apropiados para controlarlos.

Herramientas: Jenkins, Bamboo, TravisCI.

5) Proxy

Los servicios deben de estar securizados, no hay que exponerlos públicamente, en lugar de eso hay que utilizar un proxy inverso que sea fácilmente configurable, la mejor opción sería que se configurase teniendo en cuenta las opciones definidas en el servicio, de esta manera el equipo de desarrollo puede decidir mejor como interactuar con el proxy.

Herramientas: Nginx, HAProxy, Docker-flow-proxy.

6) Cola de mensajería

Los servicios deben comunicarse en un lenguaje universal y un cola de mensajes puede ser el pegamento perfecto para enviar mensajes a todos los clientes suscritos. Tampoco debería ser responsabilidad del servicio saber quien este consumiendo sus recursos.

Se podría utilizar un almacén de claves distribuidas como Consul y mantenerlo actualizado para evitar tener que reconfigurar su servicio.

Herramientas: RabbitMQ, Kafka.

7) Logging centralizado

Debido a que los mensajes suceden entre muchos nodos y réplicas, y el orquestador posiblemente los mueva, no es una opción viable entrar a un servidor por SSH y ver los ficheros de log. Hay que moverlos todos a una localización centralizada donde sea fácil buscar en ellos, y ver como está funcionando el código en producción.

Siempre hay que escribir a la salida estándar stdout o a la salida de error stderr y utilizar una herramienta para recoger todos esas salidas de cada nodo del clúster.

Herramientas: ELK (ElasticSearch, Logstash, Kibana), GrayLog.

8) Monitorización y alerta

Similar al logging, no es buena idea buscar las estadísticas de uso de los servicios, todas las métricas deberían ser recolectadas y enviadas a una ubicación centralizada.

Tampoco se debería perseguir esta información, lo ideal es que solo escuche ruido cuando algo funciona mal, esto significa que hace falta una herramienta de alerta que pueda responder a las métricas de monitorización y alertar a un usuario. Y mejor todavía podría alertar a otro microservicio para desencadenar un evento para evitar la interacción humana.

Herramientas: Prometheus, Alertmanager, Grafana

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s