Nivel 2 · 25 min
Patrones de Microservicios
Los microservicios requieren patrones de infraestructura que no existen en monolitos: service discovery para encontrar instancias, API gateway para centralizar cross-cutting concerns, y circuit breaker para prevenir fallos en cascada.
Service Mesh y API Gateway
El API Gateway es el punto de entrada único: autenticación, rate limiting, routing, logging y SSL termination en un lugar. Ejemplos: Kong, AWS API Gateway, NGINX. Un service mesh (Istio, Linkerd) añade funcionalidad a nivel de red entre servicios: mutual TLS, circuit breaking, observabilidad sin cambios de código.
Circuit Breaker
El patrón Circuit Breaker previene que fallos en un servicio se propaguen. Estados: Closed (normal), Open (cortocircuitado —retorna error inmediato sin llamar al servicio), Half-Open (probando si el servicio se recuperó). El umbral de apertura es configurable. Implementaciones: Resilience4j (Java), Polly (.NET).
Service Discovery
Los servicios no tienen IPs fijas en entornos dinámicos. Client-side discovery: el cliente consulta un registro (Consul, Eureka) y elige una instancia. Server-side discovery: el cliente llama a un load balancer que resuelve la instancia. En Kubernetes, kube-dns hace service discovery automático mediante DNS.
Code example
// Circuit Breaker con Resilience4j (Java)
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.slowCallRateThreshold(50)
.slowCallDurationThreshold(Duration.ofSeconds(2))
.waitDurationInOpenState(Duration.ofSeconds(30))
.permittedNumberOfCallsInHalfOpenState(3)
.build();
CircuitBreaker cb = CircuitBreaker.of("payment-service", config);
Supplier<PaymentResult> supplier = CircuitBreaker.decorateSupplier(
cb, () -> paymentClient.process(payment)
);
try {
PaymentResult result = supplier.get();
} catch (CallNotPermittedException e) {
return PaymentResult.deferred(payment.id());
}