阿里Sentinel整合Zuul网关详解
前面我们讲解了Sentinel整合Spring Cloud Gateway,详细请查看文章:阿里Sentinel支持Spring Cloud Gateway啦
目前来说,大部分公司线上的网关应该是Zuul,所以今天我们就来看看如何在Zuul中整合Sentinel。本来想基于Spring Cloud Alibaba来进行整合讲解,整合的时候发现目前还没更新版本,依赖还是之前的版本,咱们就以最原生的方式进行整合吧,等Spring Cloud Alibaba更新之后,Sentinel的整合只会变得更简单。
加入zuul-adapter依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-zuul-adapter</artifactId>
<version>1.6.0</version>
</dependency>
配置Sentinel提供的限流过滤器和限流规则:
@Configuration
public class ZuulConfig {
@Bean
public ZuulFilter sentinelZuulPreFilter() {
return new SentinelZuulPreFilter();
}
@Bean
public ZuulFilter sentinelZuulPostFilter() {
return new SentinelZuulPostFilter();
}
@Bean
public ZuulFilter sentinelZuulErrorFilter() {
return new SentinelZuulErrorFilter();
}
@PostConstruct
public void doInit() {
// 注册 FallbackProvider
ZuulBlockFallbackManager.registerProvider(new MyBlockFallbackProvider());
initGatewayRules();
}
/**
* 配置限流规则
*/
private void initGatewayRules() {
Set<GatewayFlowRule> rules = new HashSet<>();
rules.add(new GatewayFlowRule("yinjihuan").setCount(1) // 限流阈值
.setIntervalSec(1) // 统计时间窗口,单位是秒,默认是 1 秒
);
GatewayRuleManager.loadRules(rules);
}
}
- SentinelZuulPreFilter
pre过滤器,在请求路由之前匹配routeId和api,进行限流操作 - SentinelZuulPostFilter
post过滤器,路由之后恢复资源 - SentinelZuulErrorFilter
error过滤器,异常后的处理
最后再配置一个简单的路由,路由名称yinjihuan,跟上面规则中的名称一致:
zuul.routes.yinjihuan.path=/cxytiandi/**
zuul.routes.yinjihuan.url=http://cxytiandi.com
触发限流后会返回固定的提示:
{
"code":429,
"message":"Sentinel block exception",
"route":"yinjihuan"
}
如果想修改提示内容可以自己实现ZuulBlockFallbackProvider接口,框架默认提供的实现是DefaultBlockFallbackProvider,源码如下:
public class DefaultBlockFallbackProvider implements ZuulBlockFallbackProvider {
@Override
public String getRoute() {
return "*";
}
@Override
public BlockResponse fallbackResponse(String route, Throwable cause) {
if (cause instanceof BlockException) {
return new BlockResponse(429, "Sentinel block exception", route);
} else {
return new BlockResponse(500, "System Error", route);
}
}
}
用法其实跟Zuul中的FallbackProvider一致,但是FallbackProvider比较好的是返回的ClientHttpResponse,我们可以自定义响应内容。
Sentinel提供的ZuulBlockFallbackProvider接口中定义的返回对象是BlockResponse ,也就意味着限制了响应的字段,BlockResponse中有code,message,route三个字段,如果我想返回status, msg这两个字段目前我没找到其它的方式,不知道后续会不会支持,其实最好的是也返回ClientHttpResponse,这样就可以自定义响应内容了。
这边有个小插曲,就是我们自定义fallbackResponse的时候如果用中文message的话,响应内容是乱码,如下:
{
code: 429,
message: "??????",
route: "yinjihuan"
}
我看了下SentinelZuulPreFilter中的代码,如下:
这边是构造了BlockResponse,然后设置到ResponseBody中,但是没有进行编码设置,我自己改了下源码,加了一行代码:
ctx.getResponse().setContentType("application/json; charset=utf-8");
加了上面的代码后,中文就不会乱码了,效果如下:
{
code: 429,
message: "访问太频繁啦",
route: "yinjihuan"
}
不说了,我还是去提个issues吧: https://github.com/alibaba/Sentinel/issues/733
欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)
PS:目前星球中正在星主的带领下组队学习Spring Cloud,等你哦!
最新文章
- CSS3 background-image背景图片相关介绍
- ffmpeg+x264 Windows MSVC 静态编译
- C# 扩展方法集
- 【C#】1.2 控制台应用程序学习要点
- QQ微信与智能家电连接一起 小马哥";连接一切";野心凸显
- Keil(MDK-ARM)使用教程(二)_菜单
- 再识C中的结构体
- [主席树]SPOJ DQUERY
- Java 8 vs. Scala(二):Stream vs. Collection
- 浅谈HTTP中Get与Post的区别/HTTP协议与HTML表单(再谈GET与POST的区别)
- N个元素的集合划分成互斥的两个子集的数目
- 简单的js实现网页时钟
- 对于JavaScript中this关键字的理解
- 201521123088《JAVA程序设计》第8周学习总结
- MySQL出现“错误1067:进程意外终止”
- linux中pthread_join()与pthread_detach()
- 树莓派中transmission的blocklist
- 【比赛】NOIP2018 铺设道路
- WebPack基本概念以及基本使用
- OpenGL编程-第一个程序-画出一个正方形
热门文章
- Python程序中的进程操作-进程同步(multiprocess.Lock)
- [反汇编]函数开始部分利用mov ebx,esp找到返回地址(_KTRAP_FRAME结构)
- 数据库系统原理(第四章:SQL与关系数据库基本操作 )
- C++ const常量对象、常量成员函数和常引用
- 顺F分享,你是在裸奔吗?
- 从0系统学Android-1.4日志工具的使用
- Ajax错误
- MSSQL 插入数据时候,如果存在则更新的方法分享
- zabbix入门
- Windows下使用ssh-add报错 Error connecting to agent: No such file or directory