Crédito de la imagen principal: Western Oregon University
Los microservicios son una arquitectura de diseño de software popular que rompe sistemas monolíticos. Las aplicaciones se construyen como colecciones de servicios acoplados libremente. Cada microservicio es responsable de una sola característica. Ellos interactúan entre sí a través de protocolos de comunicación como HTTP y TCP.

¿Qué son los microservicios?

Los microservicios siguen los principios del diseño de arquitectura orientada a servicios (SOA). Aunque SOA no tiene estándares oficiales, los principios definidos en el libro de Thomas Erl titulado "SOA: Principles of Service Design" se usan a menudo como reglas básicas.
Son los siguientes:
  1. Contrato de servicio estandarizado (los servicios siguen una descripción estandarizada)
  2. Acoplamiento suelto (dependencias mínimas)
  3. Abstracción del servicio (los servicios ocultan su lógica interna).
  4. Reutilización del servicio (la estructura del servicio se planifica según el principio DRY)
  5. Autonomía del servicio (los servicios controlan internamente su propia lógica).
  6. Apatridia del servicio (los servicios no persisten del estado de las solicitudes anteriores)
  7. Descubrimiento del servicio (los servicios vienen con metadatos detectables y / o un registro de servicios)
  8. Composición del servicio (los servicios se pueden utilizar juntos)
Aunque SOA y los microservicios siguen principios similares, su relación a menudo se debate. Algunos desarrolladores enfatizan su similitud y consideran los microservicios como un subtipo de SOA. Otros prefieren enfatizar sus diferencias y afirman que cada uno resuelve un conjunto diferente de problemas.
Según esta última opinión, SOA tiene un ámbito empresarial, mientras que los microservicios tienen un ámbito de aplicación. Dentro del ámbito empresarial, las aplicaciones se comunican entre sí.
soa-vs-microservicios
Puede leer más sobre el debate SOA vs microservices en este artículo de IBM DeveloperWorks. La pregunta más interesante, sin embargo, es cómo los microservicios se comparan con las aplicaciones monolíticas.
Entonces, echemos un vistazo más de cerca a sus pros y contras.

Pros de los microservicios.

Los microservicios se han vuelto muy populares en los últimos años. Principalmente, porque vienen con un par de beneficios que son muy útiles en la era de la contenedorización y la computación en la nube. Puede desarrollar e implementar cada microservicio en una plataforma diferente, utilizando diferentes lenguajes de programación y herramientas de desarrollo. Los microservicios utilizan las API y los protocolos de comunicación para interactuar entre sí, pero de lo contrario no se apoyan entre sí.
El mayor pro de la arquitectura de microservicios es que los equipos pueden desarrollar, mantener e implementar cada microservicio de forma independiente. Este tipo de responsabilidad única lleva a otros beneficios también. Las aplicaciones compuestas de microservicios se escalan mejor, ya que puede escalarlas por separado, siempre que sea necesario. Los microservicios también reducen el tiempo de comercialización y aceleran su canalización de CI / CD. Esto significa más agilidad, también. Además, los servicios aislados tienen una mejor tolerancia a fallos. Es más fácil mantener y depurar un microservicio ligero que una aplicación compleja, después de todo.

Contras de microservicios

Como los microservicios dependen en gran medida de los mensajes, pueden enfrentar ciertos problemas. La comunicación puede ser difícil sin usar automatización y metodologías avanzadas como Agile. Debe introducir las herramientas de DevOps , como los servidores de CI / CD, las plataformas de administración de la configuración y las herramientas de APM para administrar la red. Esto es genial para las empresas que ya utilizan estos métodos. Sin embargo, la adopción de estos requisitos adicionales puede ser un desafío para las empresas más pequeñas.
Tener que mantener una red conduce a otros tipos de problemas, también. Lo que ganamos en la simplicidad de los microservicios de responsabilidad única, se pierde en la complejidad de la red. O, al menos una parte de ello. Por ejemplo, mientras que los microservicios independientes tienen mejor tolerancia a fallas que las aplicaciones monolíticas, la red tiene peor.
La comunicación entre microservicios puede significar un peor rendimiento, ya que enviar mensajes de un lado a otro conlleva una cierta sobrecarga. Y, si bien los equipos pueden elegir qué lenguaje de programación y plataforma quieren usar, también necesitan colaborar mucho mejor. Después de todo, necesitan gestionar todo el ciclo de vida del microservicio, de principio a fin.
Para resumir los puntos principales, aquí están las ventajas y desventajas de los microservicios en comparación con las aplicaciones monolíticas:
ProsContras
Mayor agilidadNecesita más colaboración (cada equipo debe cubrir todo el ciclo de vida del microservicio)
Tiempo más rápido al mercadoMás difícil de probar y monitorear debido a la complejidad de la arquitectura
Mejor escalabilidadMenor rendimiento, ya que los microservicios necesitan comunicarse (latencia de red, procesamiento de mensajes, etc.)
Ciclos de desarrollo más rápidos (implementación y depuración más fáciles)Más difícil mantener la red (tiene menos tolerancia a fallos, necesita más equilibrio de carga, etc.)
Más fácil de crear un canal de CI / CD para servicios de responsabilidad únicaNo funciona sin la cultura corporativa adecuada (cultura DevOps , prácticas de automatización, etc.)
Los servicios aislados tienen mejor tolerancia a fallas.Problemas de seguridad (más difícil mantener la seguridad de las transacciones, es más probable que la comunicación distribuida salga mal, etc.)
Plataforma y servicios de lenguaje.
Preparación para la nube

Ejemplos de microservicios

Microservicios en Java

Java es uno de los mejores lenguajes para desarrollar microservicios. Hay un par de marcos de microservicio para la plataforma Java que puede usar, tales como:
  • Dropwizard
  • JHipster
  • Marco de chispa
  • Marco de primavera
  • Pavonearse
  • Marco de juego
  • Vert.x
Usar Spring Boot es la forma más popular de construir microservicios en Java. Spring Boot es una utilidad construida sobre la plataforma Spring. Permite configurar aplicaciones Spring independientes con una configuración mínima. Puede ahorrar mucho tiempo configurando automáticamente las bibliotecas Spring y de terceros.
Por ejemplo, aquí hay un ejemplo muy sencillo de microservicios de Paul Chapman, publicado en detalle en el blog oficial de Spring. Utiliza Spring, Spring Boot y Spring Cloud para compilar la aplicación. No incluiré ejemplos de código aquí, como puede encontrarlos en el artículo original. Solo echaremos un breve vistazo a la estructura de la aplicación. Los pasos son los siguientes:
  1. Cree el registro del servicio (para que los microservicios puedan encontrarse entre sí), utilizando el servidor de registro Eureka (incorporado en Spring Cloud)
  2. Cree un microservicio de administración de cuentas llamado "Servicio de cuentas" con Spring Boot
  3. Cree un servicio web para acceder al microservicio, utilizando la RestTemplateclase de Spring
Aquí hay una ilustración de la estructura de la aplicación (también del blog de Spring):
soa-vs-microservicios
Por supuesto, este es un ejemplo muy simple. En las aplicaciones de la vida real, el servicio web realiza solicitudes a más de un microservicio.
Spring Boot es una gran herramienta para crear microservicios en Java, sin embargo, también puedes usar otros marcos. Aquí hay algunos otros grandes artículos (con código de ejemplo), también:

Microservicios en Docker

La contenedorización es una de las mayores tendencias en el mundo de los desarrolladores en este momento. Docker, siendo la plataforma de contenedorización más popular, es una excelente herramienta para construir microservicios. Tienes diferentes opciones para estructurar microservicios en Docker.
Puede implementar cada microservicio en su propio contenedor Docker, leer más sobre cómo funciona Docker También puede dividir un microservicio en varios procesos y ejecutar cada uno en un contenedor separado.
También puede usar Docker Compose para ejecutar aplicaciones de múltiples contenedores. Puede ahorrarle mucho tiempo, ya que no tiene que crear e iniciar cada contenedor por separado.
Con Docker Compose, puede configurar los microservicios de su aplicación usando un archivo YAML. Si está interesado, aquí hay un artículo útil de Linode sobre cómo implementar microservicios con Docker y Docker Compose .
Si tiene una aplicación a gran escala con varios contenedores, también puede hacer uso de una plataforma de orquestación de contenedores. Las dos herramientas más populares son Docker Swarm y Kubernetes. Ambos le permiten implementar contenedores en un grupo de computadoras en lugar de una sola máquina.
Docker Swarm está incrustado en el motor Docker; Es la herramienta de orquestación nativa de Docker. Kubernetes fue creado por Google y, en este momento, es la plataforma de orquestación más popular. Si bien Swarm encaja bien en el ecosistema Docker y es fácil de configurar, Kubernetes es más personalizable y tiene una mayor tolerancia a fallas.
A continuación, puede ver una ilustración del blog de Docker sobre cómo usar Docker Swarm y Componer juntos para administrar grupos de contenedores:
Docker Composure enjambre
No necesitarás una herramienta de orquestación de contenedores en el caso de una aplicación más pequeña. Sin embargo, es posible que desee automatizar la administración de contenedores cuando trate con varios microservicios.

Microservicios en la nube

Los microservicios se ejecutan con frecuencia como aplicaciones en la nube, ya que son ligeros y fáciles de escalar e implementar. Las plataformas de nube populares vienen con varias características compatibles con el microservicio, tales como:
  • Recursos a pedido
  • Paga lo que pagas
  • Infraestructura como código
  • Implementación y entrega continua
  • Servicios gestionados (por ejemplo, manejo de escalado, configuración y optimización de software, actualizaciones automáticas de software, etc.)
  • Gran variedad de lenguajes de programación, sistema operativo, tecnologías de base de datos.
  • Herramientas incorporadas como Docker y Kubernetes.
Los microservicios en la nube generalmente se implementan en contenedores, ya que así es como puede sacar el máximo provecho de la infraestructura. Además, los contenedores están aislados, se ejecutan en cualquier lugar y crean un entorno predecible. Sin embargo, también es posible implementar microservicios en la nube sin utilizar contenedores.
Aunque la última solución es menos común, a veces es la mejor opción. Por ejemplo, WeatherBug ejecuta microservicios directamente en Amazon EC2, sin utilizar contenedores. Decidieron omitir Docker y la contenedorización para evitar una sobrecarga y complejidad adicionales. Puede leer el análisis detallado de su enfoque en The New Stack.

Conclusión

Los microservicios son los más adecuados para aplicaciones a gran escala. Sin embargo, las aplicaciones más pequeñas suelen estar mejor con una base de código monolítico.
Si bien es más fácil desarrollar y mantener microservicios independientes, la administración de la red requiere esfuerzos adicionales. Las plataformas de contenedores, las prácticas de DevOps y la computación en la nube pueden ayudar mucho en la adopción de la arquitectura de microservicios.
Mantener y monitorear microservicios es una parte importante de los microservicios. Raygun APM, Real User Monitoring y Crash Reporting están diseñados teniendo en cuenta las prácticas modernas de desarrollo. Vea cómo la plataforma Raygun puede ayudar a mantener el rendimiento de sus contenedores.