Resilience4j+Feign实现熔断,fallback

这篇博客介绍了如何在Feign客户端中使用Resilience4j实现熔断策略,避免依赖已不维护的Hystrix。作者探讨了Resilience4j与Sentinel的适用场景,并分享了自己改造Resilience4j-Feign以支持自定义配置的实践经验,包括代码层面的调整和执行流程分析。
摘要由CSDN通过智能技术生成

FeignClient Hystrix超时重试降级讲了Hystrix和feign各自的超时,重试,降级策略。然后Hystrix其实已经不再维护了,社区推荐Resilience4j,阿里有一个开源的sentinel也可以做到熔断限流等功能。网上有一个表格图片,对比了三者的不同。
在这里插入图片描述
我自己在实际使用中的情况是,服务间调用使用Feign,没有用其他RPC框架,然后想做熔断策略,又不想用Hystrix,毕竟不维护了,所以在考虑Resilience4j 和sentinel。然后对比了之后发现sentinel可以无缝切换Hystrix+Feign。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
   <version>0.2.1.RELEASE</version>
</dependency>
@Bean
    @Scope("prototype")
    @ConditionalOnMissingBean
    @ConditionalOnProperty(name = "feign.sentinel.enabled", matchIfMissing = true)
    public Feign.Builder sentinelHystrixBuilder() {
   
        return SentinelFeign.builder();
    }

但是我们进入SentinelFeign里面会发现,这种配置只实现了基础的fallback,如果想做到限流,熔断,还需要配合其dashboard,但是现实情况是,我们的熔断并不怎么变化,只是一种以防万一,不需要动态配置。那么虽然dashboard很轻量,还是有点不合适。

注:这里说的sentinel只能用dashboard做熔断,限流配置是因为使用SentinelFeign,实际上的sentinel是可以使用代码写死规则的

然后考虑Resilience4j,这个网上搜了一下,没啥实际使用的感觉,至少在我这个实用主义来看,那些demo代码都用不上,然后看了github,有个Resilience4j-feign,然后我就试用了一下。

那么果然可以在代码里配置熔断的策略,可以配置

	@Bean
    @Scope("prototype")
    @ConditionalOnMissingBean
    public Resilience4jFeign.Builder feignResilience4jBuilder() {
   
    CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("backendName");
        RateLimiter rateLimiter = RateLimiter.ofDefaults("backendName");
        FeignDecorators decorators = FeignDecorators.builder()
                                         .withRateLimiter(rateLimiter)
                                         .withCircuitBreaker(circuitBreaker)
                                         .build();
        return Resilience4jFeign.builder(decorators);
    }

那么就想更进一步,能不能利用上次FeignClient Hystrix超时重试降级中的MyHystrixAnno 注解,增加一些自定义的配置呢?至少git上官方代码不行了。然后就对比学习了一下HystrixFeign,SentinelFeign,Resilience4jFeign,发现了一些共同点,然后自己改造了一波,记录如下。

另外:Resilience4jFeign里很多类的访问级别是包内,或者是final class的,所以我改造的时候只能copy出来改造。

使用Resilience4j-feign需要添加如下maven配置

  <dependency>
			<groupId>io.github.resilience4j</groupId>
			<artifactId>resilience4j-feign</artifactId>
			<version>1.1.0</version>
		</dependency>

1、从FeignClientFactoryBean#feign方法来看,feign的一些设置参数可以通过Builder来设置,这一点可以从以上三个框架里看出来

HystrixFeign

public static final class Builder extends Feign.Builder 

SentinelFeign

public static final class Builder extends feign.Feign.Builder implements ApplicationContextAware 

Resilience4jFeign

@Bean
    @Scope("prototype")
    @Con
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过在Feign客户端上添加Resilience4j的拦截器来实现熔断逻辑。下面是一些步骤来实现这个过程: 1. 首先,确保你已经添加了Resilience4j的依赖到你的项目中。你可以在Maven或者Gradle配置文件中添加以下依赖: ```xml <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-cloud2</artifactId> <version>1.6.1</version> </dependency> ``` 2. 创建一个实现Feign的RequestInterceptor接口的类,用于拦截Feign的请求。以下是一个示例: ```java import feign.RequestInterceptor; import feign.RequestTemplate; import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class Resilience4jFeignInterceptor implements RequestInterceptor { private final CircuitBreakerRegistry circuitBreakerRegistry; @Autowired public Resilience4jFeignInterceptor(CircuitBreakerRegistry circuitBreakerRegistry) { this.circuitBreakerRegistry = circuitBreakerRegistry; } @Override public void apply(RequestTemplate requestTemplate) { String serviceName = requestTemplate.feignTarget().name(); circuitBreakerRegistry.circuitBreaker(serviceName).executeRunnable(() -> { // 在这里执行你的Feign请求 requestTemplate.header("Authorization", "Bearer your-token"); }); } } ``` 3. 在你的Feign客户端接口上添加`configuration`属性,使用上述的拦截器类。例如: ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "your-service-name", configuration = Resilience4jFeignInterceptor.class) public interface YourFeignClient { @GetMapping("/your-endpoint") String yourFeignMethod(); } ``` 这样,当你使用`YourFeignClient`接口的方法发送请求时,请求将会通过Resilience4j的断路器进行拦截和熔断处理。 请注意,上面的示例中使用了`CircuitBreakerRegistry`来获取相应的断路器实例。你需要根据你的实际需求进行配置和使用Resilience4j的断路器。另外,你还可以根据需要添加其他的Resilience4j功能,如限流、重试等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值