Integración de OpenFeign y Hystrix en Microservicios con Spring Cloud Alibaba Nacos

Configuración de Dependencias

Para establecer la comunicación entre microservicios registrados en Nacos, es necesario incorporar las bibliotecas de descubrimiento y el cliente HTTP declarativo. En el servicio consumidor, se requeiren ambas dependencias, mientras que el proveedor solo necesita la de descubrimineto.

<!-- Dependencias para el servicio consumidor -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!-- Dependencia para el servicio proveedor -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

Propiedades de la Aplicación y Resiliencia

La configuración de los servicios debe apuntar al servidor de registro. Además, para garantizar la tolerancia a fallos, se habilita el mecanismo de corte de circuito (Circuit Breaker) proporcionado por Hystrix a través de las propiedades de Feign. Se recomienda utilizar el formato YAML para una mejor legibilidad.

spring:
  application:
    name: billing-service # Evitar guiones bajos en el nombre de la aplicación
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

feign:
  hystrix:
    enabled: true # Activa la integración con Hystrix para degradación

Habilitación del Cliente Declarativo

En la clase principal del microservicio consumidor, se debe activar el escaneo de interfaces de Feign mediante la anotación correspondiente. El servicio proveedor no requiere configuraciones adicionales en su clase de arranque.

@SpringBootApplication
@EnableFeignClients(basePackages = "com.example.billing.clients")
public class BillingApplication {
    public static void main(String[] args) {
        SpringApplication.run(BillingApplication.class, args);
    }
}

Definición de la Interfaz de Comunicación

Se crea una interfaz que mapea los endpoints del servicio remoto. Se especifica el nombre del servicio proveedor registrado en Nacos y se vincula la clase que manejará la lógica de degradación en caso de fallo.

@FeignClient(name = "payment-service", fallback = PaymentApiFallback.class)
public interface PaymentApiClient {

    @GetMapping("/api/payments/{transactionId}")
    PaymentDetails fetchPaymentStatus(@PathVariable("transactionId") Long transactionId);
}

Implementación de la Lógica de Degradación

La clase de fallback debe implementar la interfaz de Feign y anotarse como un componnete de Spring. Aquí se define la respuesta alternativa que se devolverá cuando el servicio remoto no esté disponible o supere el tiempo de espera.

@Component
public class PaymentApiFallback implements PaymentApiClient {

    @Override
    public PaymentDetails fetchPaymentStatus(Long transactionId) {
        PaymentDetails fallbackResponse = new PaymentDetails();
        fallbackResponse.setStatus("PENDING_REVIEW");
        fallbackResponse.setMessage("El servicio de pagos no está disponible temporalmente.");
        return fallbackResponse;
    }
}

Consumo del Servicio en el Controlador

Finalmente, se inyecta el cliente de Feign en el controlador del servicio consumidor. Se utiliza la inyección por constructor para asegurar la inmutabilidad y se expone un endpoint local que delega la llamada al microservicio remoto.

@RestController
@RequestMapping("/api/billing")
public class BillingController {

    private final PaymentApiClient paymentApiClient;

    public BillingController(PaymentApiClient paymentApiClient) {
        this.paymentApiClient = paymentApiClient;
    }

    @GetMapping("/status/{transactionId}")
    public ResponseEntity<PaymentDetails> getTransactionStatus(@PathVariable Long transactionId) {
        PaymentDetails details = paymentApiClient.fetchPaymentStatus(transactionId);
        return ResponseEntity.ok(details);
    }
}

Etiquetas: spring-cloud openfeign nacos Hystrix Microservicios

Publicado el 7-2 01:30