如何正确处理带有回退且不推荐使用的@EnableCircuitbreaker注释的"FeignException$ServiceUnavailableException"



当使用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()而不是使用回退时会产生ServiceUnavailable Exception。

由于@EnableCircuitBreaker最近被弃用,使用回退的正确方法是什么?如果可能的话,我不想添加try-catch块,尤其是在lambdas的上下文中,或者将其封装在服务方法中。

应用程序使用@EnableDiscoveryClient注释,与类似

@SpringBootApplication
@EnableJpaRepositories
@EnableFeignClients
@EnableDiscoveryClient
@ServletComponentScan
public class Application {
   //..
}

我看到了这个问题,并查看了上面提到的文档,但没有帮助。库版本为Spring Boot 2.6.2和Spring Cloud 2021.0.0

最终为spring-cloud使用了reslience4j。在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());
    }
}

此外,reslience4j依赖关系需要到位,这里使用了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注释。如果您想要更细粒度的设置,下面将讨论如何通过默认方法使用reslient4j实现回退。

相关内容

  • 没有找到相关文章

最新更新