Command Palette

Search for a command to run...

ES·EN

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.

Puntos clave

  • El API Gateway centraliza cross-cutting concerns (auth, rate limiting, logging) en un solo lugar.
  • Circuit Breaker previene fallos en cascada —un servicio lento sin circuit breaker puede agotar los threads de todos sus callers.
  • En Kubernetes, el service discovery está built-in via DNS; en otros entornos necesitás Consul o similar.

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());
}