sentinel限流_阿里开源项目Sentinel限流、降级的统一处理

本文探讨了阿里开源项目Sentinel在限流、降级时如何避免代码冗余。通过自定义限流页面和全局FallbackFactory,实现了统一处理。文章详细介绍了两种自定义限流页面的方法,以及针对Spring Cloud Feign的统一兜底处理,帮助读者更好地理解和应用Sentinel。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

前言

之前老顾介绍了sentinel的fallback、blockhandler;不知道小伙伴们有没有注意到一个问题?老顾带着大家来看看

问题一

sentinel的默认流控返回的是

Blocked by Sentinel (flow limiting)

当然我们可以通过@SentinelResource设置定制的fallback、blockhandler方法

cead7df49319a55f4fc5f943cbbc10db.png

但是我们也不可能每个限制的方法上面,都要去设置@SentinelResource;这样代码太冗余了。

解决方案

自定义限流页面

默认情况下,当请求被限流时会返回默认的提示页面。可通过二种方式设置自定义的跳转 URL

方式一:

WebServletConfig.setBlockPage(blockPage)方法 
c082cfa9d2c9cdd5f52dec4c5d86ddc9.png

方式二:

JVM -Dcsp.sentinel.web.servlet.block.page=xxx 

在启动应用的时候,加入启动参数

//设置全局生效,被流控的所有页面都会跳转到这里。-Dcsp.sentinel.web.servlet.block.page=https://www.x.com

上面的两种方式,都能够做到一旦出现流控异常,就会跳转到指定页面

更灵活的处理方式

上面的解决方案,只是跳转到另一个页面,但如果我们只要得到json返回值呢;那就需要此方式了,定义UrlBlockHandler接口限流处理逻辑,并将其注册至 WebCallbackManager

首先自定义一个UrlBlockHandler实现类

14119d81a7562fe5a82f3a970a19e35d.png
e1fda610e6d309f99ea3281d745b9987.png

在一个初始化方法里面注册此UrlBlockHandler

8865d78d1d5824a417cf25f75ee9051c.png

来看看效果

062571938844f5e9d7f5cfa0f7bc215b.png

注意此解决方案:需要引入一个jar包,这个是基于servlet

com.alibaba.csp

sentinel-web-servlet

问题二

在spring cloud中我们会经常使用到feign,在@FeignClient中我们可以指定fallback,我们来看看案例

5a4c0147611338f59fbfbf6d00117253.png
02cdaa4e41b1389e85121aa83a3aa3a6.png
1ffbd9db22e075f350d9684b82301337.png

以上就是常规的在使用@FeignClient注解时,加上fallbackFactory;但每次都要为其设置fallbackFactory参数。导致项目中会多出很多冗余代码。那我们能不能有一个自己定制化的默认Fallback去处理这些相同的事情呢。

解决方案

在使用sentinel时,需要引入一个jar包

com.alibaba.cloudspring-cloud-starter-alibaba-sentinel

在这个jar包中,有一段源码

ab16d9d1a031c95c90d77fd992bd8dc3.png
d3bdc462aa58a41954fba49381bad0de.png

从源码我们可以看出,在没有配置fallback时,并没有向SentinelInvocationHandler构造方法中传入FallbackFactory。这样的话我们就有了思路

  • 编写公共FallbackFactory
  • 改写SentinelFeign使得fallbackFactory为void.class时,我们传入自己的公共FallbackFactory实例

让我们一起上代码吧

先定义全局的fallback处理器

10829104739b09fa70593835e8cd30bc.png
37778b23710cd18491810869d58d8227.png

再定义一个全局的FallbackFactory

9f4834e2b0b5f69b413664e8a105efcb.png

再后面我们需要重新实现spring-cloud-starter-alibaba-sentinel下的SentinelFeign

1c131aaaffeab4a608f53a808f224354.png
f8ee80c65dd157be471f6d710e00eba6.png
0bc9d34b0553a1cfc8b5b97a87238703.png
65ce934acffeb5bf639c00e3be0dbda8.png

上面的代码其实是仿照SentinelFeign源码的,唯一的区别就是画上红色的框的

注意:其中有个方法setAccessible,这个是因为SentinelInvocationHandler的构造方法是私有方法。

其实还有一种方案,就是把重写 的SentinelFeign类,放到com.alibaba.cloud.sentinel.feign包下,也就是在自己的项目中,新建com.alibaba.cloud.sentinel.feign包

最后注入我们的SentinelFeign Bean

a1984e4b0b2f473cc5c76dc3f0731e16.png

注意:一定要在配置文件中配置feign.sentinel.enabled=true

到这里就可以了,以后只要定义基本属性@FeignClient,不需要再配置fallBackFactory了哦。

当然你还有特殊的需求,再自定义的可以了。

总结

通过此文章,小伙伴就可以更好的使用Sentinel了,更方便的编写统一的兜底方法了。如果有人使用dubbo时,sentinel也有对应的适配器;有空老顾再写一篇文章。谢谢!!!

---End---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值