¿Qué son los microservicios?

Completado

La nube controla el desarrollo de aplicaciones actual y la administración de sistemas de TI. Las aplicaciones en la nube modernas deben ser rápidas, ágiles, escalables de forma masiva y confiables.

El uso de contenedores puede ayudarle a implementar aplicaciones que cumplan con todos esos requisitos. Pero colocar una aplicación en un contenedor sin seguir un patrón de diseño estratégico es como entrar en un vehículo y esperar llegar a una ciudad nueva sin usar un mapa o GPS. Es posible que llegue al destino, pero es probable que la ruta no sea directa o la más eficaz.

Una arquitectura de microservicios resulta útil en este escenario. Los microservicios otorgan un enfoque de desarrollo e implementación de software que se adapta perfectamente a los requisitos de agilidad, escalabilidad y confiabilidad de las aplicaciones en la nube modernas.

¿Qué es una arquitectura de microservicios?

En una arquitectura de microservicios, una aplicación grande se divide en un conjunto de servicios más pequeños. Cada servicio se ejecuta en su propio proceso y se comunica con otros procesos mediante protocolos, como HTTP/HTTPS, WebSocket o Advanced Message Queuing Protocol (AMQP). Cada microservicio implementa un dominio de un extremo a otro específico o una capacidad empresarial dentro de un determinado límite de contexto. Cada microservicio debe desarrollarse de forma autónoma y debe ser implementable de forma independiente. Por último, cada microservicio debería poseer su modelo de datos de dominio relacionado y la lógica de dominio. Los microservicios se pueden basar en diferentes tecnologías de almacenamiento de datos (SQL, NoSQL) y en distintos lenguajes de programación.

Estas son algunas características clave de los microservicios:

  • Son pequeños, independientes y están acoplados de forma imprecisa.
  • Cada microservicio tiene una base de código independiente que un equipo de desarrollo pequeño puede administrar.
  • Se implementan de forma independiente. Un equipo puede actualizar un microservicio existente sin tener que recompilar y volver a implementar toda la aplicación.
  • Conservan sus datos o el estado externo en sus respectivas bases de datos. A diferencia de en una arquitectura monolítica, los microservicios no comparten bases de datos.
  • Se comunican entre sí mediante API bien definidas. Los detalles de la implementación interna de cada servicio se ocultan frente a otros servicios.
  • Admiten la programación polyglot. Por ejemplo, no es necesario que los microservicios que componen una aplicación web compartan la misma pila de tecnología, las bibliotecas o los marcos.

¿Por qué desarrollar con una arquitectura de microservicios?

Los microservicios suelen encapsular funcionalidades de requisitos del cliente más simples, que se pueden escalar horizontalmente o reducir horizontalmente. Se pueden probar, implementar y administrar de forma independiente. Una ventaja importante del enfoque de microservicios es que los equipos están más condicionados por los escenarios del cliente que por el uso de tecnología específica. Cada equipo de desarrollo pequeño desarrolla un microservicio basado en un escenario de cliente. El equipo elige las tecnologías que usa.

Los microservicios proporcionan agilidad a largo plazo. Los microservicios admiten la capacidad de mantenimiento en sistemas complejos, grandes y altamente escalables al permitirle crear aplicaciones basadas en muchos servicios que se pueden implementar de forma independiente, teniendo cada uno ciclos de vida granulares y autónomos.

Como ventaja adicional, los microservicios se pueden escalar horizontalmente de forma independiente. En lugar de tener una sola aplicación monolítica que debe escalar horizontalmente como unidad, es posible escalar horizontalmente microservicios específicos. Solo se puede escalar el área funcional que necesite más potencia de procesamiento o ancho de banda de red para satisfacer la demanda en lugar de escalar horizontalmente otras áreas de la aplicación que no sea necesario escalar. Así, puede ahorrar en costes porque necesita menos hardware.

Diagram that shows how microservices can scale across virtual machines.

El enfoque de microservicios permite cambios ágiles e iteración rápida de cada microservicio, ya que se pueden cambiar áreas específicas y pequeñas de aplicaciones complejas, grandes y escalables.

Diseñar la arquitectura de aplicaciones específicas basadas en microservicios habilita una integración continua y prácticas de entrega continua. También acelera la entrega de nuevas funciones en la aplicación. Es posible ejecutar y probar microservicios de forma aislada y hacer que evolucionen de forma autónoma al tiempo que se mantienen contratos claros entre servicios. Siempre y cuando no cambie las interfaces o los contratos, puede cambiar la implementación interna de cualquier microservicio o agregar nuevas funciones sin que ello interrumpa otros microservicios.

¿Qué rol desempeñan los contenedores?

La inclusión en contenedores es un enfoque de desarrollo de software en el que una aplicación o un servicio, sus dependencias y su configuración (extraídos como archivos de manifiesto de implementación) se empaquetan como una imagen de contenedor. Se puede probar la aplicación contenedorizada como una unidad e implementarla como una instancia de imagen de contenedor en el sistema operativo host.

Del mismo modo que los contenedores permiten el transporte de mercancías de todo tipo por barco, tren o camión, los contenedores de software actúan como una unidad estándar de implementación de software que puede contener diferentes dependencias y código. Los desarrolladores y profesionales de TI pueden usar software contenedorizado para implementar código y dependencias en entornos con poca o ninguna modificación.

Eso podría sugerir que la inclusión de una aplicación contenedorizadora podría ser una manera excelente de implementar el patrón de arquitectura de microservicios, y lo es. Las ventajas de usar contenedores se alinean casi exactamente con las ventajas de usar una arquitectura de microservicios.

Diagram that shows multiple containers running on a single host.

Nota:

La inclusión de una aplicación en contenedores no es la única manera de implementar los microservicios. Implemente microservicios como servicios individuales en Azure App Service, en máquinas virtuales o de otras maneras. Los contenedores son la herramienta de implementación que se usa para nuestros microservicios para el resto de este módulo.

Otra ventaja de la inclusión en contenedores es la escalabilidad. Escale horizontalmente de forma rápida con la creación de nuevos contenedores que se usen para tareas a corto plazo. Desde el punto de vista de la aplicación, la creación de instancias de una imagen (la creación de un contenedor) es similar a la creación de instancias de un proceso como un servicio o una aplicación web.

En resumen, los contenedores ofrecen las ventajas del aislamiento, la portabilidad, la agilidad, la escalabilidad y el control a lo largo de todo el flujo de trabajo del ciclo de vida de la aplicación.

Los microservicios que cree en este módulo se ejecutarán en un contenedor Docker, publicado con la CLI de .NET.

Publicación de contenedores del SDK de .NET

En .NET 7, el SDK de .NET obtuvo la capacidad de crear imágenes de contenedor mediante el comando dotnet publish. Las herramientas para ello generan diversas inferencias en función de las propiedades del proyecto y sus salidas. Después, .NET crea la misma imagen que crearía un archivo Dockerfile. Basta con solo dos comandos para crear una nueva aplicación y publicarla como imagen:

dotnet new webapi
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release

Los comandos anteriores de la CLI de .NET crean una nueva API web y publican la aplicación como contenedor:

  • Establecer Linux como sistema operativo (--os linux).
  • Especificar una arquitectura x64 (--arch x64).
  • Usar la configuración Release (-c Release).

Muchos aspectos del contenedor generado se pueden controlar mediante propiedades de MSBuild. En general, si puede usar un comando en un Dockerfile para establecer alguna configuración, podrá hacer lo mismo a través de MSBuild.

¿Por qué compilar microservicios en .NET?

Desde .NET Core y continuando con las iteraciones actuales, .NET se ha creado para que sea nativo en la nube en primer lugar. Se ejecuta en múltiples plataformas, por lo que la imagen de Docker se podría basar en una variedad de Linux y el código de .NET seguiría ejecutándose. Microsoft ya ha creado imágenes de .NET para Docker. Además, .NET es extremadamente rápido. El servidor web Kestrel de ASP.NET supera de forma rutinaria a otros servidores web.

Docker

Docker es una plataforma de código abierto que se usa para automatizar la implementación de aplicaciones como contenedores portátiles y autosuficientes que se puedan ejecutar en la nube o en el entorno local. Docker también es la empresa que promueve y evoluciona esta tecnología. Docker, como organización, trabaja en colaboración con proveedores de nube, Linux y Windows, incluido Microsoft.

Los contenedores de Docker se pueden ejecutar en cualquier lugar: en el entorno local en el centro de datos del cliente, en un proveedor de servicios externo o en la nube. Los contenedores de imagen de Docker se pueden ejecutar de forma nativa en Linux y Windows.

¿Qué es una imagen?

Cuando un desarrollador usa Docker, crea una aplicación o servicio y, a continuación, empaqueta la aplicación o el servicio y sus dependencias en una imagen de contenedor. Una imagen es una representación estática de la aplicación o el servicio y de su configuración y las dependencias.

La imagen, cuando se ejecuta, se convierte en el contenedor. El contenedor es la instancia en memoria de una imagen.

Las imágenes de contenedor son inmutables. Después de compilar una imagen, esta no se puede cambiar. Dado que no se puede cambiar una imagen, si necesita realizar cambios en la aplicación o el servicio y sus dependencias, cree una nueva imagen. Esta característica garantiza que la imageF que se usa en producción será la misma imagen que se use en desarrollo y pruebas.

¿Qué es un Dockerfile?

Un Dockerfile es un archivo de texto que contiene instrucciones sobre cómo crear una imagen de Docker. Los Dockerfile se escriben en un lenguaje de scripting mínimo diseñado para compilar y configurar imágenes. Los Dockerfile también documentan las operaciones necesarias para compilar una imagen a partir de una imagen base.

Para crear una imagen de Docker que contenga la aplicación, normalmente se comienza identificando una imagen base. A continuación, se agregan más archivos y configuración a la imagen base. El proceso de identificar una imagen base adecuada normalmente comienza con una búsqueda en Docker Hub para obtener una imagen ya preparada que ya contiene un marco de aplicación y todas las utilidades y herramientas de una distribución de Linux como Ubuntu o Alpine. Por ejemplo, si tiene una aplicación ASP.NET que quiere empaquetar en un contenedor, Microsoft publica una imagen llamada mcr.microsoft.com/dotnet/aspnet que ya contiene el runtime de ASP.NET.

Se puede personalizar una imagen iniciando un contenedor con una imagen base y, a continuación, realizando cambios en ella. Los cambios normalmente implican actividades, como la copia de archivos del sistema de archivos local en el contenedor y la ejecución de varias herramientas y utilidades para compilar código.

Un Dockerfile es un conjunto de instrucciones que crean una imagen de Docker que tiene el software exacto necesario para ejecutar la aplicación, incluida la propia aplicación.

1.

¿Cuál de los escenarios siguientes sería candidato para convertirse en un microservicio?

2.

¿Qué propósito tiene una imagen de Docker en un patrón de arquitectura de microservicios?

3.

¿Cuál es la diferencia entre un contenedor y una imagen?