摘要:前面我们讲解了整合,详细请查看文章阿里支持啦目前来说,大部分公司线上的网关应该是,所以今天我们就来看看如何在中整合。
前面我们讲解了Sentinel整合Spring Cloud Gateway,详细请查看文章:阿里Sentinel支持Spring Cloud Gateway啦
目前来说,大部分公司线上的网关应该是Zuul,所以今天我们就来看看如何在Zuul中整合Sentinel。本来想基于Spring Cloud Alibaba来进行整合讲解,整合的时候发现目前还没更新版本,依赖还是之前的版本,咱们就以最原生的方式进行整合吧,等Spring Cloud Alibaba更新之后,Sentinel的整合只会变得更简单。
加入zuul-adapter依赖:
com.alibaba.csp sentinel-zuul-adapter 1.6.0
配置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() { Setrules = 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,等你哦!文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74485.html
摘要:在之后,也终于发布了最新的版本。该版本距离上一次发布,过去了整整个月下面就随我一起看看,这个大家期待已久的版本都有哪些内容值得我们关注。如果是用户,同时也是阿里云这些产品的用户,那么直接使用还是非常方便的。 在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也终于发布了最新的版本。该版本距离上一次发布,过去了整整4个月!下面就随我一起看看,这个大家期...
摘要:有没有那么一个框架能够把熔断跟限流都给做了,以前没有,但是现在有了,我这属于自问自答哈这个框架就是阿里最新开源的。后来我才发现我错了,大错特错,这是一个新的框架,潜力实力阿里开源。 前言 在 Spring Cloud 体系中,熔断降级我们会使用 Hystrix 框架,限流通常会在 Zuul 中进行处理,Zuul 中没有自带限流的功能,我们可以自己做限流或者集成第三方开源的限流框架。最新...
摘要:可简单地认为它是的扩展,负载均衡自然成为不可或缺的特性。是基于开发的服务代理组件,在使用场景中,它与和整合,打造具备服务动态更新和负载均衡能力的服务网关。类似的特性在项目也有体现,它是另一种高性能代理的方案,提供服务发现健康和负载均衡。 摘要: Cloud Native 应用架构随着云技术的发展受到业界特别重视和关注,尤其是 CNCF(Cloud Native Computing Fo...
摘要:而当企业只是将系统与系统之间的调用使用的方式进行访问时使用网关对调用进行管理,那么网关起到的就是服务治理的作用。另外很多企业因为自身信息安全的原因,不能使用外网公有网的网关服务,这样就只有选择私有云的方案了。 showImg(https://segmentfault.com/img/bVbsVBA?w=255&h=255); 前言 「 API网关 」是任何微服务架构的重要组成部分。有了...
摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...
阅读 2398·2021-11-23 09:51
阅读 2402·2021-11-11 17:21
阅读 3060·2021-09-04 16:45
阅读 2347·2021-08-09 13:42
阅读 2158·2019-08-29 18:39
阅读 2834·2019-08-29 14:12
阅读 1231·2019-08-29 13:49
阅读 3324·2019-08-29 11:17