14 基于网关Spring Cloud Zuul的接口限流实现方案
在Spring Cloud Zuul网关中,限流业务是放在前置过滤器实现的,也就是在请求被Zuul转发给微服务之前进行限流。另外,当前置过滤器中同时存在限流、鉴权、身份认证等业务时,应该将限流业务放在首位执行。
实现接口限流的方案有很多,常见的包括令牌桶、漏桶、计数器等,这里基于Spring Cloud Zuul网关以令牌桶限流方案来实现接口的限流,令牌桶限流方案的架构图如下所示:
令牌生成器以固定速率生成令牌,并申请将令牌放入令牌桶;如果令牌桶没有放满令牌,则放入令牌,如果令牌桶已放满令牌,则丢弃。当一个Request请求到达Spring Cloud Zuul网关时,网关首先从令牌桶申请获取一个令牌给该请求,申请令牌成功则放行该请求,否则拒绝该请求。
目前已经有很多编程语言实现了令牌桶算法,在Java程序中,应用最广泛的是谷歌提供的开源组件Guava,该组件提供了令牌桶算法的Java实现。
(1)创建Zuul网关限流过滤器
在IntelJ IDEA中打开一个Spring Cloud Zuul网关项目,新建一个过滤器RateLimiterFilter并继承ZuulFilter,代码如下所示:
package cn.org.xcore.mall.zuul.filter;import cn.org.xcore.mall.zuul.exception.RateLimiterException;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;/*** Zuul限流过滤器** @author 李海林 手机:13802780104|微信:lihailin9073|Email:767679879@qq.com* @copyright 个人开发者李海林版权所有,产品详情及技术服务请登录官网查询[http://www.x-core.org.cn]* @create 2019-09-15 15:00*/
@Component
public class RateLimiterFilter extends ZuulFilter {/*** 声明一个限流器*/private static final RateLimiter RATE_LIMITER = RateLimiter.create(100); // 参数:每秒钟放多少个令牌进桶@Overridepublic String filterType() {return POST_TYPE; // 过滤器类型}@Overridepublic int filterOrder() {return SERVLET_DETECTION_FILTER_ORDER - 1; // 比优先级最高的Filter还要优先执行}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {if (!RATE_LIMITER.tryAcquire()) { // 从令牌桶申请获取一个令牌throw new RateLimiterException();}return null;}
}
其中使用到的限流异常类代码如下所示:
package cn.org.xcore.mall.zuul.exception;/*** 限流异常类** @author 李海林 手机:13802780104|微信:lihailin9073|Email:767679879@qq.com* @copyright 个人开发者李海林版权所有,产品详情及技术服务请登录官网查询[http://www.x-core.org.cn]* @create 2019-09-15 15:03*/
public class RateLimiterException extends RuntimeException {
}
到此,Spring Cloud Zuul网关组件结合令牌桶算法实现了接口限流方案。
(2)测试限流效果
使用Apache 的ab压测工具,通过终端命令窗口执行如下命令:
#cd F:\phpStudy\PHPTutorial\Apache\bin
#ab -n 5000 -c 300 http://localhost:9301/ms-goods/goods/get_goods_list?_token=abc
上例表示总共访问[http://localhost:9301/ms-goods/goods/get_goods_list?_token=abc]这个接口5000次,300并发同时执行。这里简单讲解一下ab压测命令的常见用法:
-n :总共的请求执行数,缺省是1
-c: 并发数,缺省是1
-t:测试所进行的总时间,秒为单位,缺省50000s
-p:POST时的数据文件
-w: 以HTML表的格式输出结果
执行测试用例:ab -n 1000 -c 100 -w http://localhost:9301/ms-goods/goods/get_goods_list?_token=abc >>d:miss.html
上面的测试用例表示100并发的情况下,共测试访问index.php脚本1000次,并将测试结果保存到d:miss.html文件中。
(3)开源限流组件推荐
在GitHub上有一个使用量挺高的开源限流组件项目,也可以用来实现Zuul网关的限流,项目地址:https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
14 基于网关Spring Cloud Zuul的接口限流实现方案相关推荐
- 《深入理解 Spring Cloud 与微服务构建》第十章 路由网关 Spring Cloud Zuul
<深入理解 Spring Cloud 与微服务构建>第十章 路由网关 Spring Cloud Zuul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十章 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...
- 路由网关--spring cloud zuul
路由网关--spring boot Zuul 1.为什么需要Zuul? Zuul Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到 ...
- API网关—Spring Cloud Zuul
原文作者:思想者 原文地址:一起学习使用Spring Cloud Netflix之Zuul 前言 Zuul在Spring Cloud 体系中扮演着统一网关的角色,负责与外部交互.用户可以通过不同的UR ...
- spring cloud微服务间限流,使用jMeter性能测试高并发
有关网关限流方式查看上一篇博客:spring cloud网关(zuul)限流,使用jMeter性能测试高并发 在网关限流后,有可能有些微服务与网关山的限流不一致,比如网关限流100QPS,而微服务只能 ...
- 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token
整理思路 由网关Zuul进行Token颁布 由网关Zuul进行登录认证拦截 拦截的配置等可以用Mysql存储配置或者配置文件,只配置默认放开的路径即可 拦截后把在zuul中的token,换成跟后台用户 ...
- Spring Cloud Zuul中使用Swagger汇总API接口文档
有很多读者问过这样的一个问题: 虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档 ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- Spring Cloud Zuul中使用Swagger汇总API接口文档 1
有很多读者问过这样的一个问题:虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档中 ...
最新文章
- 【前后端记录】前端接收后端数据并用div元素渲染 ,mybatis修改用户数据。
- php smtp报文_PHP 使用 SMTP 发送邮件教程(PEAR Mail 包)
- IDEA 2018 集成 MyBatis Generator 插件 详解、代码生成
- 8.使用Exists监控ZNode的三大Change事件
- python绘制函数曲线x2sin(x2-x-2)_Python数据处理从零开始----第四章(可视化)(2)图形和轴...
- python if else elif_Python之 if-elif-else
- 服务器pe安装win7系统安装教程,win7 winpe安装过程图文教程
- 假货泛滥是淘宝的毒瘤
- GTQ服务多层次金融衍生品市场,促进社会经济繁荣
- OAF: 怎样创建 DFF
- 新手Mac需要了解哪些内容?Mac小白基础教程
- MacBook Pro 触控板目前没有触感反馈怎么办?
- 『华为』 [行业要闻]华为VS思科:21世纪的第一场战争 。
- 华为项目管理的精髓干货!可收藏
- 晕菜...又要出差了...
- 外汇优势 炒外汇优势 外汇保证金交易的优点有哪些?
- 思科4500R系列交换机双引擎冗余讲解
- (干货)Adobe软件分享
- python连接mt4服务器_如何从MetaTrader 4/5终端向外部服务器发送数据?
- 用python输出田字格
热门文章
- java 异步邮件发送_java异步发送邮件
- C语言-成绩排名(结构)
- 计算机桌面提示没有权限删除,Win7电脑删除文件提示无权限怎么办
- Day7 - Python基础7 面向对象编程进阶 --转自金角大王
- DNSPod十问58沈剑:为什么创业公司不能做“中台“?
- lua中给userdata绑定元表示例
- 直流法判断互感器同名端
- 关于Altium Designer“放置3D体”颜色为 灰色 的解决方法
- 什么是接口的幂等性,如何实现接口幂等性?一文搞定
- 在线 OJ 项目(四) · 前端设计与项目总结