摘要:Sentinel提供的ZuulBlockFallbackProvider接口中定义的返回对象是BlockResponse ,也就意味着限制了响应的字段,BlockResponse中有code,message,route三个字段,如果我想返回status, msg这两个字段目前我没找到其它的方式,不知道后续会不会支持,其实最好的是也返回ClientHttpResponse,这样就可以自定义响应内容了。本来想基于Spring Cloud Alibaba来进行整合讲解,整合的时候发现目前还没更新版本,依赖还是之前的版本,咱们就以最原生的方式进行整合吧,等Spring Cloud Alibaba更新之后,Sentinel的整合只会变得更简单。

前面我们讲解了Sentinel整合Spring Cloud Gateway,详细请查看文章: 阿里Sentinel支持Spring Cloud Gateway啦!

目前来说,大部分公司线上的网关应该是Zuul,所以今天我们就来看看如何在Zuul中整合Sentinel。

本来想基于Spring Cloud Alibaba来进行整合讲解,整合的时候发现目前还没更新版本,依赖还是之前的版本,咱们就以最原生的方式进行整合吧,等Spring Cloud Alibaba更新之后,Sentinel的整合只会变得更简单。

加入zuul-adapter依赖:

配置Sentinel提供的限流过滤器和限流规则:

  • SentinelZuulPreFilter pre过滤器,在请求路由之前匹配routeId和api,进行限流操作

  • SentinelZuulPostFilter post过滤器,路由之后恢复资源

  • SentinelZuulErrorFilter error过滤器,异常后的处理

最后再配置一个简单的路由,路由名称yinjihuan,跟上面规则中的名称一致:

触发限流后会返回固定的提示:

如果想修改提示内容可以自己实现ZuulBlockFallbackProvider接口,框架默认提供的实现是DefaultBlockFallbackProvider,源码如下:

用法其实跟Zuul中的FallbackProvider一致,但是FallbackProvider比较好的是返回的ClientHttpResponse,我们可以自定义响应内容。

Sentinel提供的ZuulBlockFallbackProvider接口中定义的返回对象是BlockResponse ,也就意味着限制了响应的字段,BlockResponse中有code,message,route三个字段,如果我想返回status, msg这两个字段目前我没找到其它的方式,不知道后续会不会支持,其实最好的是也返回ClientHttpResponse,这样就可以自定义响应内容了。

这边有个小插曲,就是我们自定义fallbackResponse的时候如果用中文message的话,响应内容是乱码,如下:

我看了下SentinelZuulPreFilter中的代码,如下:

这边是构造了BlockResponse,然后设置到ResponseBody中,但是没有进行编码设置,我自己改了下源码,加了一行代码:

加了上面的代码后,中文就不会乱码了,效果如下:

不说了,我还是去提个issues吧: https://github.com/alibaba/Sentinel/issues/733

彩蛋来了:发文当天加入星球前三位的小伙伴,将获取神秘大礼

加入星球特权

1、从前端到后端玩转Spring Cloud

2、实战分库分表中间件Sharding-JDBC

3、实战分布式任务调度框架Elastic Job

4、配置中心Apollo实战

5、高并发解决方案之缓存

6、更多课程等你来解锁,20+课程

相关文章