CodeGym /Cursos /Módulo 5. Spring /Lección 166: Patrones importantes de microservicios: API ...

Lección 166: Patrones importantes de microservicios: API Gateway, Service Discovery, Circuit Breaker

Módulo 5. Spring
Nivel 11 , Lección 5
Disponible

Hoy nos espera un tema que es la base del éxito en una arquitectura de microservicios: ¡patrones! Imagina una ciudad con muchos edificios: oficinas, tiendas, restaurantes. Cada uno tiene su dirección y su función. En teoría, puedes ir directamente a cualquier edificio, pero ¿cómo lo haces realmente? Imagina que tienes unos navegadores inteligentes que conocen todas las rutas y te sugieren el camino más corto. En el mundo de los microservicios esos "navegadores" se llaman API Gateway, y para que los propios edificios se encuentren entre sí se usa Service Discovery. Pero, ¿qué pasa si uno de los edificios está cerrado temporalmente? Entonces la ciudad usa Circuit Breaker para evitar sobrecargas. Los patrones que vamos a ver hoy simplifican mucho el trabajo con microservicios y los hacen más resilientes y manejables.


API Gateway: La puerta al mundo de los microservicios

API Gateway — es el punto de entrada central para todas las peticiones de los clientes. En lugar de que el cliente interactúe directamente con cada microservicio, pasa por el Gateway, que enruta las peticiones, transforma datos y además se encarga de la seguridad.

Una analogía: si los microservicios son edificios, el API Gateway es la entrada única desde donde luego se dirige a los visitantes al edificio correcto.

Principales tareas del API Gateway:

  1. Enrutamiento de peticiones: redirigir las peticiones HTTP al microservicio correspondiente.
  2. Autenticación y autorización: asegurar el sistema.
  3. Agregación de datos: combinar las respuestas de varios microservicios en una sola.
  4. Cacheado: reducir la carga sobre los servicios almacenando datos localmente.
  5. Transformación de peticiones y respuestas: por ejemplo, convertir datos de un formato a otro.

¿Cómo se ve eso en la práctica?

Supongamos que tienes una aplicación e-commerce:

  • El cliente quiere ver información de un producto. La petición pasa por el API Gateway.
  • El Gateway reenvía la petición al microservicio de catálogo.
  • Si la información del producto también está ligada a reseñas, el Gateway puede agregar datos de dos microservicios (catálogo y reseñas) y devolver al cliente una única respuesta.

Ejemplo usando Spring Cloud Gateway:


@SpringBootApplication
public class ApiGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("catalog_service", r -> r.path("/catalog/**")
                         .uri("http://localhost:8081")) // redirige al microservicio de catálogo
                .route("review_service", r -> r.path("/reviews/**")
                         .uri("http://localhost:8082")) // redirige al microservicio de reseñas
                .build();
    }
}

¿En qué ayuda esto?

  • Simplifica la lógica del cliente: el cliente "conoce" sólo una única entrada.
  • Lugar central de control: puedes activar cacheado o logging sólo en el Gateway.
  • Adaptación rápida: puedes cambiar rutas internas sin afectar a los clientes.

Desventajas del API Gateway:

  • Puede convertirse en un punto único de fallo (single point of failure) si no configuras tolerancia a fallos.
  • Añade un pequeño overhead, ya que todas las peticiones pasan por un servicio adicional.

Service Discovery: ¡ahora encuéntrense entre ustedes!

Service Discovery — mecanismo que permite a los microservicios encontrarse entre sí de forma dinámica. Esto es especialmente relevante cuando los microservicios se crean, eliminan o escalan con frecuencia.

Si el API Gateway es la "puerta principal", Service Discovery es las "páginas amarillas" donde están listadas las direcciones de todos los edificios (microservicios).

Escenario de uso:

  1. Un nuevo microservicio arranca y se registra en el "registro de servicios".
  2. Otros microservicios o el API Gateway pueden consultar ese "registro de servicios" para encontrar el servicio necesario.

Herramientas populares de Service Discovery:

  • Netflix Eureka (Spring Cloud lo soporta "out of the box").
  • Consul.
  • Zookeeper.

Ejemplo de uso con Eureka:

Paso 1: Configurar Eureka Server


@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

Paso 2: Registrar un microservicio Añade en application.properties:


spring.application.name=catalog-service
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

Ahora tu "catalog-service" se registrará en el Eureka Server y estará disponible para otros.


Circuit Breaker: tolerancia a fallos al máximo

Circuit Breaker (interruptor) — es el patrón que previene la sobrecarga de microservicios. Si uno de los microservicios deja de responder (o responde muy lento), el Circuit Breaker "bloquea" las peticiones a ese servicio, protegiendo al resto del sistema.

El Circuit Breaker hace al sistema más resiliente, porque evita fallos en cascada cuando un servicio falla. Además reduce la carga sobre recursos que ya están pasando por momentos difíciles.

Ejemplo de Circuit Breaker para una petición REST (implementación con Resilience4j)

  1. Añade la dependencia:
    
    <dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>2.0.2</version>
    </dependency>
    
  2. Configura el Circuit Breaker en application.properties:
    
    resilience4j.circuitbreaker.instances.catalog.failureRateThreshold=50
    resilience4j.circuitbreaker.instances.catalog.slowCallRateThreshold=60
    
  3. Úsalo en el código:
    
    @RestController
    public class CatalogController {
    
        private final RestTemplate restTemplate;
    
        public CatalogController(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }
    
        @GetMapping("/catalog")
        @CircuitBreaker(name = "catalog", fallbackMethod = "fallbackCatalog")
        public String getCatalog() {
            return restTemplate.getForObject("http://localhost:8081/catalog", String.class);
        }
    
        public String fallbackCatalog(Throwable t) {
            return "El servicio de catálogo no está disponible en este momento. Intenta de nuevo más tarde.";
        }
    }
    

Conclusiones

Estos tres patrones — API Gateway, Service Discovery y Circuit Breaker — son las piedras angulares de la arquitectura de microservicios. API Gateway proporciona una entrada centralizada y gestiona las peticiones. Service Discovery ayuda a que los microservicios se encuentren entre sí. Circuit Breaker protege tu sistema de avalanchas de fallos.

Estos patrones te ayudarán a que tu sistema no sólo sea escalable y flexible, sino también resistente a fallos. En la siguiente lección hablaremos sobre la autonomía de los servicios, aislamiento de datos y algunos otros principios arquitectónicos de microservicios.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION