如何正确处理 "FeignException$ServiceUnavailableException" 后备和不推荐使用的 @EnableCircuitbreaker 注释
How to correctly handle "FeignException$ServiceUnavailableException" with fallback and without deprecated @EnableCircuitbreaker annotation
当使用 OpenFeign 时,我实施返回空结果的回退,因此列表应该简单地显示为空。例如。比如
@FeignClient(name = "objects", fallback = ObjectsClientFallback.class)
public interface ObjectsClient {
@RequestMapping("/objects/count")
Long count();
}
和
@Component
public class ObjectsClientFallback implements ObjectsClient {
@Override
public Long count() {
return 0L;
}
}
但是,如果服务未启动,应用程序在调用 objectsClient.count()
而不是使用回退时会产生 ServiceUnavailableException。
作为 @EnableCircuitBreaker
最近 deprecated 使用回退的正确方法是什么?如果可能,我不想添加 try-catch 块,尤其是在 lambda 的上下文中或将其包装在服务方法中。
应用程序使用了@EnableDiscoveryClient
注解,像这样
@SpringBootApplication
@EnableJpaRepositories
@EnableFeignClients
@EnableDiscoveryClient
@ServletComponentScan
public class Application {
//..
}
我看过这个 并检查了提到的文档,但没有帮助。库版本为 Spring-Boot 2.6.2 和 Spring-Cloud 2021.0.0
最终使用 resilience4j for spring cloud。
在 application.properties
中的 feign.circuitbreaker.enabled=true
旁边,它使用默认配置设置断路器。
可以像这样添加自定义配置:
@Configuration
public class FeignConfiguration {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> circuitBreakerFactoryCustomizer() {
CircuitBreakerConfig circuitBreakerConfig =
CircuitBreakerConfig.custom()
.ignoreException(FeignException.ServiceUnavailable.class::isInstance)
.build();
return circuitBreakerFactory -> circuitBreakerFactory
.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig),
ObjectsClient.class.getSimpleName());
}
}
此外,resilience4j依赖需要到位,这里使用maven pom.xml
。
<project>
<!-- .. -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
</dependencies>
这样您就可以替换已弃用的 hystrix 实现并删除 @EnableCircuitBreaker
注释。
如果您想要更细粒度的设置,这里讨论了如何通过默认方法实现 fallback with resilience4j。
当使用 OpenFeign 时,我实施返回空结果的回退,因此列表应该简单地显示为空。例如。比如
@FeignClient(name = "objects", fallback = ObjectsClientFallback.class)
public interface ObjectsClient {
@RequestMapping("/objects/count")
Long count();
}
和
@Component
public class ObjectsClientFallback implements ObjectsClient {
@Override
public Long count() {
return 0L;
}
}
但是,如果服务未启动,应用程序在调用 objectsClient.count()
而不是使用回退时会产生 ServiceUnavailableException。
作为 @EnableCircuitBreaker
最近 deprecated 使用回退的正确方法是什么?如果可能,我不想添加 try-catch 块,尤其是在 lambda 的上下文中或将其包装在服务方法中。
应用程序使用了@EnableDiscoveryClient
注解,像这样
@SpringBootApplication
@EnableJpaRepositories
@EnableFeignClients
@EnableDiscoveryClient
@ServletComponentScan
public class Application {
//..
}
我看过这个
最终使用 resilience4j for spring cloud。
在 application.properties
中的 feign.circuitbreaker.enabled=true
旁边,它使用默认配置设置断路器。
可以像这样添加自定义配置:
@Configuration
public class FeignConfiguration {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> circuitBreakerFactoryCustomizer() {
CircuitBreakerConfig circuitBreakerConfig =
CircuitBreakerConfig.custom()
.ignoreException(FeignException.ServiceUnavailable.class::isInstance)
.build();
return circuitBreakerFactory -> circuitBreakerFactory
.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig),
ObjectsClient.class.getSimpleName());
}
}
此外,resilience4j依赖需要到位,这里使用maven pom.xml
。
<project>
<!-- .. -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
</dependencies>
这样您就可以替换已弃用的 hystrix 实现并删除 @EnableCircuitBreaker
注释。
如果您想要更细粒度的设置,这里讨论了如何通过默认方法实现 fallback with resilience4j。