Microservicios y arquitectura de microservicios
Descubre los pros y los contras de los microservicios y en qué se diferencian de los monolitos.
No hace mucho tiempo, el método por excelencia para crear aplicaciones de software era usar una arquitectura monolítica, que era una única unidad autónoma. Este enfoque funcionó bien para muchos desarrolladores hasta que las aplicaciones aumentaron en complejidad. Cuando se modifica una pequeña sección de código en un sistema monolítico, es necesario recompilar todo el sistema, ejecutar todas las pruebas en él e implementar una versión completamente nueva de la aplicación.
Luego llegaron los microservicios, un enfoque que consiste en dividir los sistemas de software en unidades más pequeñas que se desarrollan e implementan de forma autónoma. La arquitectura de microservicios fue impulsada por el movimiento DevOps, cuyo objetivo es entregar con frecuencia actualizaciones, como nuevas funciones, correcciones de errores y mejoras de seguridad. También dio pie, en muchos casos, a que las empresas reescribieran aplicaciones antiguas utilizando lenguajes de programación modernos y actualizaciones de una pila tecnológica.
Los microservicios son un conjunto de unidades pequeñas que entregan e implementan aplicaciones grandes y complejas de forma continua.
¿Qué son los microservicios?
Una arquitectura de microservicios, o simplemente "microservicios", es un concepto para crear una aplicación en forma de una serie de servicios que se pueden implementar de forma independiente, están descentralizados y se desarrollan de forma autónoma. Estos servicios están poco vinculados, se pueden implementar de forma independiente y se mantienen fácilmente. Si bien una aplicación monolítica se crea como una sola unidad indivisible, los microservicios dividen esa unidad en una colección de unidades independientes que contribuyen a un todo más amplio. Los microservicios son una parte integral de DevOps, ya que son la base de las prácticas de entrega continua que permiten a los equipos adaptarse rápidamente a los requisitos de los usuarios.

Un microservicio es un servicio web responsable de una parte de la lógica del dominio. Se combinan varios microservicios para crear una aplicación, y cada uno de ellos proporciona una parte de la funcionalidad de un dominio. Los microservicios interactúan entre sí mediante API, como REST o gRPC, pero no conocen el funcionamiento interno de los demás servicios. Esta armoniosa interacción entre microservicios es una arquitectura de microservicios.
Con una arquitectura de microservicios, los desarrolladores se pueden organizar en equipos más pequeños especializados en servicios distintos, con implementaciones desacopladas y pilas diferentes. Por ejemplo, Jira funciona con varios microservicios, cada uno de los cuales proporciona funciones específicas, como buscar incidencias, ver detalles de incidencias, comentarios, transiciones de incidencias y muchas otras.
Características de los microservicios
No existe una definición formal de arquitectura de microservicios, pero hay algunos patrones o características comunes que es importante conocer.
Componentes autónomos
La base de una arquitectura de microservicios es un componente, que puede ser un paquete de software, un servicio o recurso web, una aplicación o un módulo que contiene una serie de funciones relacionadas. O como explica Martin Fowler de manera más sencilla: “los componentes de software son elementos que se pueden reemplazar y actualizar de forma independiente”.
En una arquitectura de microservicios, cada componente se puede desarrollar, implementar, operar, cambiar y volver a implementar sin afectar al funcionamiento de otros servicios o a la integridad de una aplicación.
Los componentes se usan juntos para ofrecer una experiencia o un valor empresarial a los clientes. Los más comunes son los servicios y las bibliotecas, pero pueden ser también herramientas de interfaz de línea de comandos (CLI), aplicaciones móviles, módulos de front-end, canalizaciones de datos, modelos de aprendizaje automático y muchos otros conceptos que se pueden aplicar dentro de una arquitectura de microservicios.
Interfaces claras
Una vez que se establecen los componentes individuales, estos requieren una cantidad sustancial de lógica para comunicarse entre sí a través de un mecanismo de comunicación como RPC, REST a través de HTTP o un sistema basado en eventos. Estos mecanismos pueden ser métodos sincrónicos o asíncronos y los microservicios pueden usar una combinación de ambos tipos.
El aspecto más importante es que, junto con cada microservicio, debe proporcionarse un contrato claro e intuitivo que describa cómo puede utilizar un usuario ese servicio. Por lo general, esto se hace a través de una API que se publica junto con el servicio.
Tú lo creas, tú lo gestionas
La filosofía “tú lo creas, tú lo gestionas” de DevOps pone de relieve que no se puede transformar una arquitectura en microservicios sin tener en cuenta cómo se estructuran los equipos. DevOps integra las motivaciones de los distintos roles funcionales (desarrollo, control de calidad, ingeniería de publicación y operaciones) en un solo equipo con el objetivo compartido de crear software de alta calidad. Las prácticas de DevOps, como la CI/CD, las pruebas automatizadas y las marcas de función, aceleran la implementación y ayudan a mantener la estabilidad y la seguridad de los sistemas. Además, cada equipo puede crear e implementar microservicios de los que es propietario sin afectar a otros equipos.
La evolución de la nube simplificó la creación, la implementación y la operación de microservicios. Las técnicas de automatización de la infraestructura, como la integración continua, la entrega continua y las pruebas automatizadas, sirven de gran ayuda a los equipos.
Arquitectura orientada a servicios frente a microservicios
La arquitectura orientada a servicios (SOA) y los microservicios son dos tipos de arquitecturas de servicios web. Al igual que los microservicios, una SOA integra componentes especializados y reutilizables que funcionan de forma independiente. La diferencia entre ambos tipos de arquitectura es la clasificación burocrática de los tipos de servicios.
Una SOA tiene cuatro tipos de servicios básicos:
- Business
- Enterprise
- Aplicación
- Servicios de infraestructura
Estos tipos definen la responsabilidad específica de dominios relacionada con los servicios subyacentes. Por otro lado, los microservicios solo se dividen en dos tipos: funcionales e infraestructurales.
Ambas arquitecturas comparten el mismo conjunto de estándares en diferentes capas de una empresa. La existencia de una arquitectura de microservicios depende del éxito de un patrón de SOA. Por lo tanto, un patrón de arquitectura de microservicios es un subconjunto de SOA. Aquí el foco principal está en la autonomía de tiempo de ejecución de cada servicio.
Ventajas de los microservicios

Agilidad
Como los equipos pequeños e independientes suelen crear un servicio dentro de los microservicios, esto los anima a adoptar prácticas de metodología ágil. Los equipos pueden trabajar de forma independiente y moverse rápidamente, lo que acorta el ciclo de desarrollo.

Escalado flexible
Como los microservicios están distribuidos por definición y se pueden implementar en clústeres, permiten escalar de forma horizontal y dinámica más allá de los límites de los servicios. Si un microservicio está alcanzando su capacidad de carga, se pueden implementar rápidamente nuevas instancias de ese servicio al clúster que lo acompaña para aliviar la presión.

Publicaciones frecuentes
Una de las principales ventajas de los microservicios son los ciclos de publicación frecuentes y más rápidos. Como elemento clave de la integración continua y la entrega continua (CI/CD), los microservicios permiten a los equipos experimentar con nuevas funciones y revertirlas si algo no funciona. Esto facilita la actualización del código y acelera el tiempo de salida al mercado de nuevas funciones.

Flexibilidad tecnológica
Las arquitecturas de microservicios no tienen por qué seguir un enfoque establecido con una cadena de herramientas, sino que dan a los equipos la libertad de seleccionar las herramientas que desean.

Enfoque en la calidad
La separación de intereses empresariales en microservicios independientes permite que el equipo encargado de dicho servicio se centre por completo en la calidad de la entrega.

Alta fiabilidad
Al separar la funcionalidad, los microservicios reducen el riesgo de dañar toda una aplicación o código base al publicar actualizaciones. Además, es fácil aislar y corregir fallos y errores en los servicios individuales. Se pueden implementar cambios solo en un servicio específico sin interrumpir el funcionamiento de toda la aplicación, lo que proporciona una mayor fiabilidad.
Desafíos de los microservicios
Expansión descontrolada
Pasar de una arquitectura monolítica a los microservicios conlleva una mayor complejidad. Hay más servicios en más lugares y creados por varios equipos. Esto hace que sea difícil determinar cómo se relacionan los diferentes componentes entre sí, quién es el propietario de un componente en particular y cómo evitar causar un impacto negativo en los componentes dependientes. Si no se gestiona la expansión, se reduce la velocidad de desarrollo y el rendimiento operativo. A medida que un sistema crece, requiere un equipo de operaciones experimentado para gestionar las reimplementaciones constantes y los cambios frecuentes en la arquitectura.
Falta de claridad en cuanto a la propiedad
Con una arquitectura de microservicios, es más difícil saber quién es el propietario de cada componente. Un equipo de DevOps puede ejecutar una combinación de API, bibliotecas de componentes, herramientas de monitorización e imágenes de Docker para que los usuarios implementen una aplicación. Es importante tener clara cierta información sobre los componentes, como sus propietarios, recursos y relaciones cambiantes con otros componentes. Es necesario tener una comunicación y coordinación precisas entre numerosos equipos para que todos los involucrados puedan encontrar fácilmente los conocimientos necesarios para entender un producto.
Costes de infraestructura exponenciales
Cada nuevo microservicio que se añade a la implementación de producción viene con sus propios costes asociados al conjunto de pruebas, manuales de estrategias de implementación, infraestructura de alojamiento, herramientas de monitorización, etc.
Sobrecarga organizativa añadida
Se necesita un nivel adicional de comunicación y colaboración para coordinar las actualizaciones e interfaces entre los equipos de arquitectura de microservicios.
Depuración
Puede resultar difícil depurar una aplicación que contiene varios microservicios, cada uno con su propio conjunto de registros. Un solo proceso empresarial puede ejecutarse en varias máquinas en distintos momentos, lo que complica aún más la depuración.
Respuesta ante incidencias
Es importante contar con documentación de respuesta ante incidentes de microservicios que incluya información como quién usa el microservicio, dónde y cómo se implementó, y con quién contactar cuando surgen problemas.
Microservicios y DevOps: como uña y carne
Dado el aumento de la complejidad y las dependencias de los microservicios, las prácticas de DevOps de automatización de la implementación, la monitorización y el ciclo de vida se consideran una parte integral de las arquitecturas de microservicios. Por eso, los microservicios a menudo se consideran el primer paso para adoptar una cultura de DevOps, que permite:
- Automatización
- Mayor escalabilidad
- Facilidad de gestión
- Agilidad
- Entrega e implementación más rápidas
Tecnologías y herramientas clave para una arquitectura de microservicios
Contenedores, Docker y Kubernetes
Un contenedor es simplemente el paquete de una aplicación y todas sus dependencias, lo que permite implementarlo de manera fácil y coherente. Como los contenedores no tienen la sobrecarga de su propio sistema operativo, son más pequeños y ligeros que las máquinas virtuales tradicionales. Pueden activarse y desactivarse más rápidamente, por lo que son perfectos para los servicios más pequeños que se encuentran en las arquitecturas de microservicios.
Con la proliferación de servicios y contenedores, es esencial coordinar y gestionar grupos numerosos de contenedores. Docker es una popular plataforma de contenedorización y un tiempo de ejecución de contenedores que ayuda a los desarrolladores a crear, implementar y ejecutar contenedores. No obstante, es difícil ejecutar y gestionar contenedores a gran escala solo con Docker. Kubernetes y otras soluciones como Docker Swarm, Mesos o HashiCorp Nomad ayudan a llevar a cabo la contenedorización a gran escala.
La contenedorización y la implementación de contenedores son un nuevo patrón de infraestructura distribuida. Docker y Kubernetes empaquetan un servicio en un contenedor completo que se puede implementar y descartar rápidamente. Estas herramientas de infraestructura complementan la arquitectura de microservicios. Los microservicios se pueden almacenar en contenedores, así como implementar y gestionar fácilmente mediante un sistema de gestión de contenedores.
Puertas de enlace de API
Los servicios de una arquitectura de microservicios se comunican entre sí a través de API bien definidas. Una puerta de enlace de API actúa como un proxy inverso: acepta llamadas a la API, recopila los servicios necesarios para darles respuesta y devuelve los resultados. Las puertas de enlace de API proporcionan una abstracción que sirve a un único punto de conexión de API, aunque las API reciben servicio de varios microservicios. Las puertas de enlace de API también pueden dar respuesta a necesidades como la limitación de volumen, la monitorización, la autenticación, la autorización y el enrutamiento al microservicio adecuado.
Transmisión de mensajes y eventos
Debido a la naturaleza distribuida de los microservicios, los equipos necesitan una forma de compartir los cambios de estado y otros eventos. Los sistemas de transmisión de mensajes permiten a los microservicios comunicarse entre sí, lo que permite que algunos microservicios procesen eventos como parte de su interfaz principal. Por ejemplo, los cambios en las páginas de Confluence provocan un evento que desencadena una reindexación de la búsqueda y las notificaciones para quienes siguen la página.
Registro y monitorización
Los microservicios dificultan identificar las incidencias y resolverlas en varios servicios. Es importante tener herramientas de observación para el registro, la monitorización y el rastreo. Esto ayuda a conocer cómo se comportan los microservicios, identificar posibles problemas, solucionar incidencias y depurar fallos.
Integración y entrega continuas
Una de las principales ventajas de los microservicios son los ciclos de publicación frecuentes y más rápidos. Como elemento clave de la CI/CD, los microservicios permiten a los equipos experimentar con nuevas funciones y revertirlas si algo no funciona. Esto facilita la actualización del código y acelera el tiempo de salida al mercado de nuevas funciones.
Portal para desarrolladores
A medida que las arquitecturas distribuidas aumentan en complejidad, los equipos de desarrollo pueden beneficiarse de una herramienta que integre la información sobre los resultados de ingeniería y la colaboración del equipo en un solo lugar. Por ejemplo, Atlassian Compass se diseñó para ayudar a controlar la expansión de los microservicios proporcionando datos e información útil de las cadenas de herramientas de DevOps.
El futuro de los microservicios
La contenedorización y la implementación de contenedores ahora son un patrón habitual de la infraestructura distribuida. Herramientas como Docker y Kubernetes empaquetan un servicio en un contenedor completo que se puede implementar y descartar rápidamente. Estas nuevas herramientas de infraestructura sirven de complemento a la arquitectura de microservicios, ya que los microservicios se pueden almacenar en contenedores, así como implementar y gestionar fácilmente mediante un sistema de gestión de contenedores.
La adopción de microservicios debe considerarse un viaje, no el objetivo inmediato de un equipo.
Puede resultar útil empezar poco a poco para conocer los requisitos técnicos de un sistema distribuido y escalar componentes individuales. Luego, puedes extraer gradualmente más servicios a medida que vas adquiriendo experiencia y conocimientos.
Gestiona tus microservicios con Compass
Si trabajas con una arquitectura de microservicios, Atlassian Compass se encarga de gestionar la complejidad de las arquitecturas distribuidas que se escalan. Es una plataforma de experiencia extensible para desarrolladores que reúne la información suelta sobre los procesos de ingeniería y la colaboración en el equipo en un lugar centralizado que permite hacer búsquedas. Además de ayudarte a controlar la expansión de tus microservicios con el Catálogo de componentes, Compass puede ayudarte a establecer prácticas recomendadas y evaluar el estado de tu software con cuadros de mandos, así como ofrecerte datos e información útil en toda tu cadena de herramientas de DevOps mediante extensiones creadas en la plataforma Atlassian Forge.
