您的位置:首页 > 健康 > 美食 > 南宁网站开发软件_乌鲁木齐网站建设_长春网站建设公司哪个好_seo网站推广方案

南宁网站开发软件_乌鲁木齐网站建设_长春网站建设公司哪个好_seo网站推广方案

2025/1/10 13:38:58 来源:https://blog.csdn.net/dh798417147/article/details/145014336  浏览:    关键词:南宁网站开发软件_乌鲁木齐网站建设_长春网站建设公司哪个好_seo网站推广方案
南宁网站开发软件_乌鲁木齐网站建设_长春网站建设公司哪个好_seo网站推广方案

文章目录

  • 前言
  • 一、定制Fegin
  • 二、定制断路器
    • 1.自定义断路器DefaultCircuitBreaker
    • 2.定义Resilience4JCircuitBreakerFactory bean来替换内置断路器
  • 封装成Starter


前言

之前在SpringBoot2.7+中实现 全局Fallback方式较为复杂,且是从Feign入手,现在从断路器入手,通过捕获异常方式实现。

注意:这里基于SpringBoot3.4实现的,如果是2.7那么又会复杂一点,原因是内置的Resilience4JCircuitBreakerFactory实现的接口未返回接口CircuitBreaker而是实现Resilience4JCircuitBreaker,在3.4版本已修正为接口CircuitBreaker。


一、定制Fegin

请参考之前的实现。

二、定制断路器

因为在未设置断路器时,会抛出NoFallbackAvailableException,所以就通过捕获NoFallbackAvailableException来实现全局Fallback

1.自定义断路器DefaultCircuitBreaker

class DefaultCircuitBreaker implements CircuitBreaker {private static final Logger log = LoggerFactory.getLogger(DefaultCircuitBreaker.class);private final CircuitBreaker circuitBreaker;DefaultCircuitBreaker(CircuitBreaker circuitBreaker) {this.circuitBreaker = circuitBreaker;}@SuppressWarnings("unchecked")@Overridepublic <T> T run(Supplier<T> toRun, Function<Throwable, T> fallback) {try {return circuitBreaker.run(toRun, fallback);} catch (NoFallbackAvailableException e) {Throwable cause = e.getCause();String errorMessage = cause.getMessage();if (cause instanceof FeignException exception && !exception.contentUTF8().isEmpty()) {errorMessage = exception.contentUTF8();}log.error("Using DefaultFallback handle exception", cause);return (T) RestResp.error(ExceptionKeys.REMOTE_SERVICE_ERROR, errorMessage);}}}

2.定义Resilience4JCircuitBreakerFactory bean来替换内置断路器

    @BeanResilience4JCircuitBreakerFactory resilience4jCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry, TimeLimiterRegistry timeLimiterRegistry,@Autowired(required = false) Resilience4jBulkheadProvider bulkheadProvider,Resilience4JConfigurationProperties resilience4JConfigurationProperties) {return new Resilience4JCircuitBreakerFactory(circuitBreakerRegistry,timeLimiterRegistry, bulkheadProvider, resilience4JConfigurationProperties) {@Overridepublic CircuitBreaker create(String id) {return new DefaultCircuitBreaker(super.create(id));}@Overridepublic CircuitBreaker create(String id, String groupName) {return new DefaultCircuitBreaker(super.create(id, groupName));}};}

封装成Starter

  1. 创建一个自动配置类CircuitBreakerAutoConfiguration
@AutoConfiguration(before = Resilience4JAutoConfiguration.class)
@ConditionalOnClass(Resilience4JCircuitBreakerFactory.class)
public class CircuitBreakerAutoConfiguration {@BeanResilience4JCircuitBreakerFactory resilience4jCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry, TimeLimiterRegistry timeLimiterRegistry,@Autowired(required = false) Resilience4jBulkheadProvider bulkheadProvider,Resilience4JConfigurationProperties resilience4JConfigurationProperties) {return new Resilience4JCircuitBreakerFactory(circuitBreakerRegistry,timeLimiterRegistry, bulkheadProvider, resilience4JConfigurationProperties) {@Overridepublic CircuitBreaker create(String id) {return new DefaultCircuitBreaker(super.create(id));}@Overridepublic CircuitBreaker create(String id, String groupName) {return new DefaultCircuitBreaker(super.create(id, groupName));}};}}
  1. 将配置类添加到配置文件org.springframework.boot.autoconfigure.AutoConfiguration.imports中

  2. 如果需要配置一个开关来启用CircuitBreakerAutoConfiguration,也可以添加条件注解ConditionalOnProperty如下

@ConditionalOnProperty(prefix = "mcn.circuitbreaker", name = "default.enabled", havingValue = "true", matchIfMissing = true)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com