Desarrollo de microservicios
Muchas aplicaciones modernas no se construyen como una sola aplicación grande.
En su lugar se utilizan microservicios.
Los microservicios dividen el sistema en varios servicios pequeños e independientes.
Cada servicio tiene una responsabilidad específica.
1. Qué es un microservicio #
Un microservicio es una aplicación pequeña que se encarga de una parte concreta del sistema.
Ejemplo:
1Sistema ecommerce
Podría dividirse en:
1Servicio usuarios 2Servicio pedidos 3Servicio pagos 4Servicio inventario 5Servicio notificaciones
Cada uno funciona de forma independiente.
2. Arquitectura monolítica vs microservicios #
3. Monolito #
Todo está en una sola aplicación.
1Frontend 2Backend 3Base de datos
Problemas:
- difícil escalar
- difícil mantener
- despliegues complejos
4. Microservicios #
El sistema se divide en servicios independientes.
1Frontend 2 ↓ 3API Gateway 4 ↓ 5Users Service 6Orders Service 7Payments Service
Cada servicio puede tener su propia base de datos.
5. Ventajas de microservicios #
| ventaja | explicación |
|---|---|
| escalabilidad | cada servicio escala por separado |
| independencia | equipos trabajan en servicios distintos |
| flexibilidad | cada servicio puede usar tecnología distinta |
| despliegue rápido | actualizar un servicio sin parar todo |
6. Desventajas #
| problema | explicación |
|---|---|
| más complejidad | más servicios |
| comunicación | servicios deben hablar entre sí |
| monitorización | más difícil |
7. Comunicación entre microservicios #
Los microservicios normalmente se comunican mediante HTTP REST.
Ejemplo:
1OrderService → UserService
Petición HTTP:
1GET http://user-service/users/10
8. Ejemplo simple de microservicio #
9. User Service #
1@RestController 2@RequestMapping("/users") 3public class UserController { 4 5 @GetMapping("/{id}") 6 public User getUser(@PathVariable Long id) { 7 8 return new User(id, "Ana"); 9 10 } 11 12}
10. Llamar a otro microservicio #
Podemos llamar usando RestTemplate.
11. Ejemplo #
1@Service 2public class OrderService { 3 4 private final RestTemplate restTemplate = new RestTemplate(); 5 6 public User getUser(Long userId) { 7 8 String url = "http://localhost:8081/users/" + userId; 9 10 return restTemplate.getForObject(url, User.class); 11 12 } 13 14}
12. Usar Feign Client #
Una forma mucho más cómoda es Feign Client.
Feign convierte llamadas HTTP en interfaces Java.
13. Añadir dependencia #
1<dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-openfeign</artifactId> 4</dependency>
14. Activar Feign #
1@EnableFeignClients 2@SpringBootApplication 3public class Application { 4 5}
15. Crear cliente Feign #
1@FeignClient(name="user-service", url="http://localhost:8081") 2public interface UserClient { 3 4 @GetMapping("/users/{id}") 5 User getUser(@PathVariable Long id); 6 7}
16. Usar el cliente #
1@Service 2public class OrderService { 3 4 private final UserClient userClient; 5 6 public OrderService(UserClient userClient) { 7 this.userClient = userClient; 8 } 9 10 public User getUser(Long userId) { 11 12 return userClient.getUser(userId); 13 14 } 15 16}
Spring hace la llamada HTTP automáticamente.
17. API Gateway #
Cuando hay muchos microservicios se usa un API Gateway.
El gateway es la puerta de entrada al sistema.
Arquitectura:
1Cliente 2 ↓ 3API Gateway 4 ↓ 5Users Service 6Orders Service 7Payments Service
Ventajas:
- seguridad centralizada
- control de tráfico
- simplificación del frontend
18. Service Discovery #
Cuando hay muchos servicios se usa un sistema de descubrimiento.
Ejemplo:
1Eureka 2Consul 3Kubernetes
Esto permite que los servicios se encuentren automáticamente.
19. Base de datos en microservicios #
Cada microservicio debería tener su propia base de datos.
Ejemplo:
1UserService → user_db 2OrderService → order_db 3PaymentService → payment_db
Esto evita dependencias fuertes entre servicios.
20. Buenas prácticas #
Servicios pequeños #
Cada microservicio debe tener una responsabilidad clara.
Comunicación simple #
Preferir REST o eventos.
Base de datos independiente #
Evitar que varios servicios compartan la misma base de datos.
Logging centralizado #
Usar herramientas como:
1ELK 2Grafana 3Prometheus
21. Ejemplo arquitectura real #
1Frontend 2 ↓ 3API Gateway 4 ↓ 5Auth Service 6User Service 7Course Service 8Payment Service 9Notification Service
Cada uno implementado con Spring Boot.
Resumen del tema
Conceptos clave #
- Arquitectura de Microservicios: descomposición de un sistema monolítico en servicios independientes, débilmente acoplados, desplegables de forma aislada y con base de datos propia (Database per Service).
- Comunicación Síncrona vs Asíncrona: HTTP REST mediante clientes declarativos (
@FeignClientde Spring Cloud OpenFeign) oRestClient/WebClient, frente a mensajería asíncrona por eventos (Kafka, RabbitMQ). - Componentes de Ecosistema Distribuido:
- API Gateway (Spring Cloud Gateway): punto único de entrada, enrutamiento, rate limiting y autenticación.
- Service Registry & Discovery (Netflix Eureka / Consul / Kubernetes DNS): resolución dinámica de instancias y balanceo de carga en cliente.
- Tolerancia a Fallos y Observabilidad: Circuit Breaker (Resilience4j) y trazabilidad distribuida (Micrometer Tracing / Zipkin).
Qué debes recordar #
En microservicios cada servicio gestiona su propia base de datos y se comunica síncronamente con OpenFeign o asíncronamente con eventos, centralizando el acceso tras un API Gateway.