在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的接口限流实现方案相关推荐

  1. 《深入理解 Spring Cloud 与微服务构建》第十章 路由网关 Spring Cloud Zuul

    <深入理解 Spring Cloud 与微服务构建>第十章 路由网关 Spring Cloud Zuul 文章目录 <深入理解 Spring Cloud 与微服务构建>第十章 ...

  2. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...

  3. 路由网关--spring cloud zuul

    路由网关--spring boot Zuul 1.为什么需要Zuul? Zuul Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到 ...

  4. API网关—Spring Cloud Zuul

    原文作者:思想者 原文地址:一起学习使用Spring Cloud Netflix之Zuul 前言 Zuul在Spring Cloud 体系中扮演着统一网关的角色,负责与外部交互.用户可以通过不同的UR ...

  5. spring cloud微服务间限流,使用jMeter性能测试高并发

    有关网关限流方式查看上一篇博客:spring cloud网关(zuul)限流,使用jMeter性能测试高并发 在网关限流后,有可能有些微服务与网关山的限流不一致,比如网关限流100QPS,而微服务只能 ...

  6. 网关 Spring Cloud Zuul 自定义过滤器认证转换 Token

    整理思路 由网关Zuul进行Token颁布 由网关Zuul进行登录认证拦截 拦截的配置等可以用Mysql存储配置或者配置文件,只配置默认放开的路径即可 拦截后把在zuul中的token,换成跟后台用户 ...

  7. Spring Cloud Zuul中使用Swagger汇总API接口文档

    有很多读者问过这样的一个问题: 虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档 ...

  8. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  9. Spring Cloud Zuul中使用Swagger汇总API接口文档 1

    有很多读者问过这样的一个问题:虽然使用Swagger可以为Spring MVC编写的接口生成了API文档,但是在微服务化之后,这些API文档都离散在各个微服务中,是否有办法将这些接口都整合到一个文档中 ...

最新文章

  1. 【前后端记录】前端接收后端数据并用div元素渲染 ,mybatis修改用户数据。
  2. php smtp报文_PHP 使用 SMTP 发送邮件教程(PEAR Mail 包)
  3. IDEA 2018 集成 MyBatis Generator 插件 详解、代码生成
  4. 8.使用Exists监控ZNode的三大Change事件
  5. python绘制函数曲线x2sin(x2-x-2)_Python数据处理从零开始----第四章(可视化)(2)图形和轴...
  6. python if else elif_Python之 if-elif-else
  7. 服务器pe安装win7系统安装教程,win7 winpe安装过程图文教程
  8. 假货泛滥是淘宝的毒瘤
  9. GTQ服务多层次金融衍生品市场,促进社会经济繁荣
  10. OAF: 怎样创建 DFF
  11. 新手Mac需要了解哪些内容?Mac小白基础教程
  12. MacBook Pro 触控板目前没有触感反馈怎么办?
  13. 『华为』 [行业要闻]华为VS思科:21世纪的第一场战争 。
  14. 华为项目管理的精髓干货!可收藏
  15. 晕菜...又要出差了...
  16. 外汇优势 炒外汇优势 外汇保证金交易的优点有哪些?
  17. 思科4500R系列交换机双引擎冗余讲解
  18. (干货)Adobe软件分享
  19. python连接mt4服务器_如何从MetaTrader 4/5终端向外部服务器发送数据?
  20. 用python输出田字格

热门文章

  1. java 异步邮件发送_java异步发送邮件
  2. C语言-成绩排名(结构)
  3. 计算机桌面提示没有权限删除,Win7电脑删除文件提示无权限怎么办
  4. Day7 - Python基础7 面向对象编程进阶 --转自金角大王
  5. DNSPod十问58沈剑:为什么创业公司不能做“中台“?
  6. lua中给userdata绑定元表示例
  7. 直流法判断互感器同名端
  8. 关于Altium Designer“放置3D体”颜色为 灰色 的解决方法
  9. 什么是接口的幂等性,如何实现接口幂等性?一文搞定
  10. 在线 OJ 项目(四) · 前端设计与项目总结