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