APIs y MicroServicios en Empresas Monolíticas — Overview #1

Llevo aproximadamente 4 años involucrado en todo el tema de Transformacion digital, APIs como pegamento en la APIficacion y migracion o creación de aplicaciones basadas en el estilo de Arquitectura de Microservicios. todo esto en diferentes empresas totalmente Monolíticas y con cientos de aplicaciones.

El objetivo de los siguientes parrafos y articulos es contar sobre mi experiencia y lo que he aprendido sobre la Tranformacion Digital que estan llevando acabo muchas empresas Mexicanas asi como la APIficacion de las aplicaciones existentes y con ello la inclusion de Microservicios en el desarrollo de software, desde la perspectiva de Ingeniero de Software y un aprendiz diario que le gusta expresar sus ideas y compartir el conocimiento.

Pero vayamos al grano…

¿Cuales son los diferentes retos al implementar arquitecturas distribuidas “MicroServicios”?

Overview:

Definicion Microservicios:

La Arquitectura de microservicios consiste en construir una aplicación como un conjunto de pequeños servicios, los cuales se ejecutan en su propio proceso y se comunican con mecanismos ligeros (normalmente una API HTTP o mensajería AMQP). Cada servicio se encarga de implementar una funcionalidad del negocio.
Sistemas Distribuidos: La computación distribuida o informática en malla (grid) es un modelo para resolver problemas de computación masiva, utilizando un gran número de ordenadores organizados en clústeres en una infraestructura de telecomunicaciones distribuida.

Evolución:

Monolítica: Alto acoplamiento,
cualquier modificación afecta a la totalidad de la aplicación o sistema, CI/CD es complicado y aveces no es viable.

SOA: Menor acoplamiento, código en partes más pequeñas, pero todo debe estar comunicado y estrictamente desarrollado para que encaje (WSDL) con el resto.

Microservicios: Desacoplamiento total,
permite desarrollar pequeños servicios totalmente independiente (
Agnósticos y Poliglotas). expuestos a través de APIS.

Características:

• Reduce tiempo de salida al mercado. (Time to Market)
• Ciclo de vida CI/CD automatizado
• Protocolos (HTTP) REST para exponer servicios y comunicarse (Mensajeria).
• Integración con otros sistemas (Circuit Breaker)
• Servicios con alta disponibilidad y rendimiento. (Scaling)
• Centralizar funcionalidad (Cambios en caliente).
• Mejor control de fallos (Resiliencia).

Patrones de Diseño:

DDD (Domain Driven Design)
Es un enfoque para el desarrollo de software definido por Eric Evans, Se centra en un modelo rico, expresivo y en constante evolución para resolver problemas del dominio de una forma semántica.
Aspectos:
Lenguaje Ubicuo https://github.com/jatubio/5minutos_laravel/wiki/Resumen-sobre-DDD.-Domain-Driven-Design

Capas Conceptuales:

• Interface de Usuario
• Aplicación
• Dominio
• Infraestructura

Arquitectura Hexagonal

Llamada también ports and adapters.

Objetivo:

Es separar nuestra aplicación en distintas capas que tienen su propia responsabilidad.

Event Driven Architecture
La arquitectura enfocada a eventos mediante el envío y recepción de eventos nos permite desacoplar responsabilidades.

Los servicios internos o externos que reciban los eventos darán tratamiento a ellos y emitirán nuevos eventos de ser necesario.

Arquitectura y Componentes de los Microservicios:

Los microservicios son mas pequeños, desacoplados para realizar
pequeñas funciones de manera eficiente.
Necesitaremos componentes que permiten una correcta implementación de la
arquitectura. Estos componentes deben de cubrirse por la plataforma y no propiamente en los microservicios.

Arquitectura Datos y Comunicación

Igual que las aplicación monolíticas los microservicios pueden acceder a base de datos través de capas de persistencia.

Service Discovery — Registry

En la medida que tenemos más demanda se hace necesario desplegar mayor número de microservicios o instancias de manera automática.
Es necesario que descubramos y registremos los nuevos servicios creados automáticamente.

Componentes:
Registro: Consiste en el registro de
cada nueva instancia, dejando
consignado sus datos de ubicación,
como nodo, puerto e ip entre otros.

Descubrimiento: Es el proceso que
permite tener acceso a la información
del registro.

Herramientas disponibles para el servicio de Descubrimiento:

• Eureka (Spring Cloud Netflix)
• Zookeper
• Etcd
• Consul

Scaling — Escalabilidad de Servicios

Escalar (Scaling) en función de la demanda puede ser configurado con base al uso de cpu, memoria, request o métricas que se pueden customizar.

Sus características son:

• Escalado horizontal.
• Alta tolerancia a fallos: Recuperación automática por
configuración
• Despliegues basados en estrategias CI / CD.
• Abstracción de la capa de microservicios (Multi Runtime | Contenedores). 
• Conocer el estado de salud de nuestro ecosistema (Health).

Herramientas para la orquestación y Scaling:

• Ribbon + Eureka (Spring Cloud Netflix)
• Kubernetes
• Docker Swarm
• RancherOS
• Openshift
• Docker EE
• ECS EC2 o Fargate, EKS

API Gateway

Caracteristicas de API Gateway

• Solicitudes a través de un único punto de entrada (API Gateway).
• Mapeo global de request (Url’s).
• Abstracción de los microservicios (MultiRuntime)
• Filtros dinámicos, redireccionamiento con base en localización de las solicitudes.

Herramientas:

• Zuul (Spring Cloud Netflix)
• TYK
• KONG
• Haproxy
• API Gateway (AWS)
• CA API Gateway
• Apigee

En los proximos artículos hablaremos especialmente de APIGEE el API Gateway de Google, ya que actualmente estoy trabajando con esta herramienta.

Monitoreo de Microservicio

Un aspecto importante en la arquitectura a microservicios es la
monitorización, contar con un panel centraliado con información en tiempo real de cada microservicio o multiples servicios (scaling).

Ejemplos:
• Hystrix + turbine + Spring boot admin
• InfluxDB + Grafana
• Service Mesh — Istio, Linkerd

Balanceador de Carga

Es recomendado contar con un balanceador de carga externo que
nos permita mejorar la fiabilidad de nuestra aplicación, incrementando además la disponibilidad y tolerancia a fallos.

Balancear la carga entre las distintas instancias de un microservicio.
haciéndolo más efectivo a la hora de manejar las peticiones.

• Configuración de políticas de balanceo.
• Integración con el servicio de descubrimiento.

Ejemplos:

• Kubernetes Service|Ingress Balanceo por POD
• ELB, R53 
• Ribbon (Spring Cloud Netflix).

Tratamiento de Logs

La centralización y explotación de logs juega un papel importante de lo contrario seria inmanejable la administración de los mismos.

Trazabildad de Transacciones

En un sistema distribuido debemos contar con la capacidad de registrar en
nuestros logs las trazas a nivel de request.

Ejemplos:

• Spring Sleuth + Zipkin
• Istio — Service Mesh
• Zipkin / Jaeger

Ciclo de Vida CI/CD

La creación de Microservicios es apoyada por herramientas de Iaas y Paas que
complementan el proceso de automatización.

  • Dependiendo de la infraestructura y plataforma podrá variar las herramientas y el ciclo de CI/CD.
  • Es aquí donde Docker nos garantiza el despliegue de microservicios en cualquier plataforma.

En lo siguientes articulos hablaremos a profundidad de cada uno de los aspectos a considerar en una arquitectura de Microservicios, así mismo como implementarlo.

Te invito a leer la continuación:

Jovani Arzate | apificación | microservicios | kubernetes | apis | spring boot | microservices