# Microservicios

> Construir una aplicación como muchos servicios chicos que hacen una sola cosa cada uno.

- Nivel: Avanzado
- Temas: Software, Cloud
- URL: https://tidbit.legios.com.ar/es/microservices/
- En inglés: [Microservices](https://tidbit.legios.com.ar/microservices/)

Los **microservicios** son una forma de organizar el software en la que una aplicación se divide en muchos servicios chicos e independientes. Una tienda online puede tener un servicio para usuarios, otro para el catálogo, otro para pedidos y otro para pagos. Cada uno corre por su cuenta, normalmente en su propio contenedor, muchas veces tiene su propia base de datos, y se comunica con los demás solo a través de APIs o de mensajes en una cola.

La alternativa es un **monolito**: un solo programa que tiene todo adentro y se despliega como una sola pieza. Los monolitos son más simples de construir, probar y entender, y por eso la mayoría de los productos arranca así. El problema aparece cuando el código y el equipo crecen: un cambio chico obliga a desplegar todo de nuevo, una parte lenta frena al resto y decenas de personas se pisan entre sí.

Los microservicios responden a eso dejando que cada equipo sea dueño de un servicio, lo cambie y lo despliegue a su ritmo, y que se escalen solo las partes con más carga. El precio es la complejidad. Una llamada a una función dentro de un programa se vuelve una llamada por la red que puede tardar o fallar; una transacción en una sola base de datos se vuelve coordinación entre varios servicios; y encontrar un bug implica seguir un pedido a través de muchos logs. Si se hace sin necesidad, sale un "monolito distribuido" con los problemas de los dos. Herramientas como Kubernetes, los balanceadores de carga y el tracing existen en buena parte para manejar esto.

## Una analogía

Un monolito es la cocina de un único restaurante donde todos los cocineros comparten la misma hornalla. Los microservicios son un patio de comidas: cada local tiene su cocina, su menú y su gente, y puede remodelar sin cerrar a los demás, pero ahora alguien tiene que coordinar los pedidos que necesitan comida de tres locales.

## Para quedarse

- Cada servicio hace una cosa, se despliega solo y suele tener sus propios datos.
- Los servicios se hablan por la red, con APIs o colas de mensajes.
- A favor: equipos, deploys y escalado independientes. En contra: fallas de red y más complejidad operativa.
- Muchos equipos arrancan con un monolito y lo dividen recién cuando duele.

## Para seguir leyendo

- [Microservices, de Martin Fowler y James Lewis (en inglés)](https://martinfowler.com/articles/microservices.html)
- [¿Qué son los microservicios? (AWS)](https://aws.amazon.com/es/microservices/)
- [Arquitectura de microservicios en Wikipedia](https://es.wikipedia.org/wiki/Arquitectura_de_microservicios)

## Términos relacionados

- [Contenedor](https://tidbit.legios.com.ar/es/container/): Una caja cerrada con un programa y todo lo que necesita para correr en cualquier lado.
- [Base de datos](https://tidbit.legios.com.ar/es/database/): Un depósito ordenado de datos que los programas consultan y actualizan sin riesgo.
- [API](https://tidbit.legios.com.ar/es/api/): El menú de cosas que un programa le deja pedir a otro programa.
- [Bug](https://tidbit.legios.com.ar/es/bug/): Un error en un software que hace que se comporte distinto de lo que se buscaba.
- [Kubernetes](https://tidbit.legios.com.ar/es/kubernetes/): El sistema que corre y cuida contenedores en muchas máquinas a la vez.
- [Balanceador de carga](https://tidbit.legios.com.ar/es/load-balancer/): El agente de tránsito que reparte los pedidos que llegan entre muchos servidores.
