范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringCloudGateway限流实战

  欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《Spring Cloud Gateway实战》系列的第八篇,经过前面的学习,咱们对过滤器已了解得差不多,今天来补全过滤器的最后一个版块:限流(RequestRateLimiter )默认的限流器是基于redis实现的,限流算法是大家熟悉的令牌桶(Token Bucket Algorithm),关于令牌捅的原理就不在此展开了,聪明的您看一眼下图应该就懂了:装令牌的桶容量有限,例如最多20个,令牌进入桶的速度恒定(注意,这里是和漏桶算法的区别),例如每秒10个,底部每个请求能拿到令牌才会被处理:
  RequestRateLimiter基本套路使用RequestRateLimiter过滤器的步骤非常简单:准备可用的redismaven或者gradle中添加依赖org.springframework.boot:spring-boot-starter-data-redis-reactive确定按照什么维度限流,例如按照请求中的username参数限流,这是通过编写KeyResolver接口的实现来完成的配置application.yml文件,添加过滤器以上就是使用RequestRateLimiter过滤器的套路了,简单么?接下来,咱们先编码再验证源码下载本篇实战中的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
  这个git项目中有多个文件夹,本篇的源码在 spring-cloud-tutorials 文件夹下,如下图红框所示:
  spring-cloud-tutorials 文件夹下有多个子工程,本篇的代码是 gateway-requestratelimiter ,如下图红框所示:
  准备工作为了更好的演示Gateway的效果,在服务提供者 provider-hello 的代码(Hello.java)中新增一个web接口,可以接受一个入参:    @GetMapping("/userinfo")     public String userInfo(@RequestParam("username") String username) {         return Constants.HELLO_PREFIX + " " + username + ", " + dateStr();     }后面的测试咱们就用上述接口; 编码在父工程spring-cloud-tutorials 之下新增子工程gateway-requestratelimiter ,其pom.xml内容如下,重点是org.springframework.boot:spring-boot-starter-data-redis-reactive :<?xml version="1.0" encoding="UTF-8"?>               spring-cloud-tutorials         com.bolingcavalry         1.0-SNAPSHOT          4.0.0      gateway-requestratelimiter                            com.bolingcavalry             common             ${project.version}                                org.springframework.cloud             spring-cloud-starter-gateway                                org.springframework.boot             spring-boot-starter-data-redis-reactive               配置文件application.yml,请注意RequestRateLimiter的几个参数,已经用中文添加了详细的注释: server:   #服务端口   port: 8081 spring:   application:     name: circuitbreaker-gateway   # redis配置   redis:     host: 192.168.50.43     port: 6379    cloud:     gateway:       routes:         - id: path_route           uri: http://127.0.0.1:8082           predicates:             - Path=/hello/**           filters:             - name: RequestRateLimiter               args:               	# 令牌入桶的速度为每秒100个,相当于QPS                 redis-rate-limiter.replenishRate: 100                 # 桶内能装200个令牌,相当于峰值,要注意的是:第一秒从桶内能去200个,但是第二秒只能取到100个了,因为入桶速度是每秒100个                 redis-rate-limiter.burstCapacity: 200                 # 每个请求需要的令牌数                 redis-rate-limiter.requestedTokens: 1配置文件application.yml,请注意RequestRateLimiter的几个参数,已经用中文添加了详细的注释 server:   #服务端口   port: 8081 spring:   application:     name: circuitbreaker-gateway   # redis配置   redis:     host: 192.168.50.43     port: 6379    cloud:     gateway:       routes:         - id: path_route           uri: http://127.0.0.1:8082           predicates:             - Path=/hello/**           filters:             - name: RequestRateLimiter               args:               	# 令牌入桶的速度为每秒100个,相当于QPS                 redis-rate-limiter.replenishRate: 100                 # 桶内能装200个令牌,相当于峰值,要注意的是:第一秒从桶内能去200个,但是第二秒只能取到100个了,因为入桶速度是每秒100个                 redis-rate-limiter.burstCapacity: 200                 # 每个请求需要的令牌数                 redis-rate-limiter.requestedTokens: 1指定限流维度的代码CustomizeConfig.java,这里是根据请求参数username 的值来限流的,假设真实请求中一半请求的username的等于Tom ,另一半的username的等于Jerry ,按照application.yml的配置,Tom的请求QPS为10,Jerry的QPS也是10:package com.bolingcavalry.gateway.config;  import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import reactor.core.publisher.Mono; import java.util.Objects;  @Configuration public class CustomizeConfig {     @Bean     KeyResolver userKeyResolver() {         return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("username"));     } }毫无营养的启动类RequestRateLimiterApplication.java: package com.bolingcavalry.gateway;  import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;  @SpringBootApplication public class RequestRateLimiterApplication {     public static void main(String[] args) {         SpringApplication.run(RequestRateLimiterApplication.class,args);     } }代码写完了,接下来开始验证; 验证(桶容量等于入桶速度)首先验证的是桶容量等于入桶速度时的效果,请修改gateway-requestratelimiter应用的application.yml中文件,使得redis-rate-limiter.replenishRate和redis-rate-limiter.burstCapacity的值都等于100,也就是说桶的大小等于100,每秒放入的令牌数也是100确保redis已经启动,并且与application.yml中的配置保持一直启动nacos(provider-hello依赖)启动服务提供者provider-hello启动gateway-requestratelimiter为了模拟web请求,我这里使用了Apache Benchmark,windows版本的下载地址:https://www.apachelounge.com/download/VS16/binaries/httpd-2.4.48-win64-VS16.zip上述文件下载解压后即可使用,在控制台进入Apache24bin后执行以下命令,意思是向指定地址发送10000个请求,并发数为2:ab -n 10000  -c 2 http://localhost:8081/hello/userinfo?username=Tom控制台输出如下,可见不到八秒的时间,只成功了800个,证明限流符合预期:
  验证(桶容量大于入桶速度)接下来试试桶容量大于入桶速度时的限流效果,这对于我们控制峰值响应有很重要的参考价值请修改gateway-requestratelimiter 应用的application.yml中文件,redis-rate-limiter.replenishRate维持100 不变,但是redis-rate-limiter.burstCapacity改成200 ,也就是说每秒放入的令牌数还是100,但桶的容量翻倍了重启应用gateway-requestratelimiter 再次执行以下命令,意思是向指定地址发送10000个请求,并发数为2:ab -n 10000  -c 2 http://localhost:8081/hello/userinfo?username=Tom测试结果如下图,可见符合预期,可以将桶内令牌全部用掉,以支撑峰值超过QPS的场景:
  验证(根据username的维度限流)接下来验证限流的维度,究竟是不是按照请求参数username的值来限流的咱们打开两个命令行,同时发送请求(动作要快),第一个的username等于Tom,第二个等于Jerry,理论上推测,如果都是8秒内完成,那么每个命令都有900个请求能成功测试结果如下图,可见符合预期,每个username用的是自己的令牌:
  至此,Spring Cloud Gateway限流实战已经完成,如此简单易用的限流方案,希望能给您的学习和使用带来参考 欢迎关注头条号:程序员欣宸学习路上,你不孤单,欣宸原创一路相伴...

海信U7H与TCLC11G谁更值得买?对比画质音质系统答案一目了然说起电视机,很多人可能会觉得现在都什么年代了,都用手机追剧了,再不济用笔记本追剧,谁还看电视啊?其实这种看法是非常片面的,手机和笔记本的小屏幕,是永远无法取代大屏幕带来的震撼效果的全球首份土耳其地震夜光遥感分析报告发布中国青年报客户端武汉2月16日电(张子航中青报中青网记者雷宇)记者从武汉大学今天举行的记者见面会上获悉,联合国卫星中心(UNOSAT)与武汉大学昨日联合发布了全球首份土耳其地震夜光3纳米M3首发iMac台积电拟招聘6千人小鹏人脸识别需对车头半跪日报君发自凹非寺量子位公众号QbitAI大家好,今天是3月6日星期一,又是元气满满的一周。新一周的开始,一起来和日报君看看最近科技圈都有哪些新鲜事吧台积电今年计划招聘6000余人年20222023武汉都市圈开放数据创新应用大赛决赛获奖名单出炉近日,20222023武汉都市圈开放数据创新应用大赛决赛在武汉市民之家顺利举行。经过激烈角逐,共有72支队伍获奖,其中职业赛道一等奖1名二等奖3名三等奖5名,高校赛道一等奖1名二等中字头国企股盈利能力排行榜!自全面注册制实行以来,市场的风格发生了重大的变化。短线题材股开始走弱,而权重蓝筹股却逆势走强。尤其是以中字头为代表的国企股更是持续爆发。昨天的报告中也提到,国企改革是实现经济目标的沙俄一哨兵,被埋地下军需库九年,被救出后,只想去找心爱的姑娘1924年,前沙俄少校瓦西里波伦斯基,来到了波兰布里斯特市。作为一名前沙俄军官,波伦斯基经历过第一次世界大战,也经历过1917年3月的二月革命,看到了罗曼诺夫王朝被推翻,以及列宁领速滑有道禁毒有我七台河禁毒宣传滑进黑龙江省短道速滑锦标赛近日,黑龙江省短道速滑锦标赛在七台河市体育馆火热举行,与以往不同的是,赛场上除了运动健儿的身影,还有一抹禁毒绿飞满全场,禁毒与速滑碰撞出满满的正能量。此次宣传活动,将禁毒宣传教育与胡锡进骂余茂春骂得对吗余茂春已经不是中国人了,是美国人了。他背叛了祖宗和故乡单说,祖宗和故乡也把他开除了,两不相欠,再骂他其实没啥意义了,因为骂他等于白骂,骂空气,骂墙壁,对牛骂琴。而且,说实在的,一般李世民既然得位不正李世民的评价为何还那么高历史开讲唐太宗李世民对于后世影响非凡,是中国历史上评价最高的皇帝之一,不少人拿他和秦皇汉武作比较,称其为千古一帝。然而,李世民的皇帝宝座,却是玄武门之变杀害自己的兄弟逼自己的亲爹让86版西游记居然有三个唐僧,你认为哪位最像唐玄奘我国四大古典名著都搬上了电视,普通都受到大众欢迎,其中西游记更是重播次数最多的影视剧,看过无数次的西游记,你有没有发现里面唐僧的扮演者居然有三个,主角换了三个在影视界却不常见。一汪千年古都地产梦碎首付2成也卖不动!洛阳买新房最高可补贴1万元和全国各地的三线城市一样,洛阳的房价,也在2022年沦陷了。作为古都,河南洛阳的房地产市场本应很景气,但现在却萎靡不振,即使首付比例放宽到两成,也无人问津。早先,洛阳因其文化底蕴吸
经常性的胃胀暗藏四个危害,大家一定要了解胃胀在生活中比较多见,虽然不是什么大病,但是要一两天才能缓解症状,这种感觉还是很难受的。而经常性或长久性的胃胀对身体是有害的,若不治疗可能会引发并发症造成不可挽回的损伤。经常性的胃怎么知道自己有没有冠心病?专家提醒可通过这5个方法判断冠心病又叫做冠状动脉粥样硬化性心脏病,是目前十分常见的一类心血管疾病,这是由患者的动脉管壁粥样硬化导致管腔狭窄,从而引起的一系列因供血不足导致的病症,这种疾病会对患者的生活造成较大出伏后,做好这三件事更健康本报记者韦莎妮娜8月25日是今年三伏的最后一天,过了这一天就意味着出伏了。出伏后,夏季渐渐远去,时节逐渐向秋天过渡。但出伏并不意味着炎热高温的天气会马上结束,秋老虎仍然会发威一段时早上空腹喝水,比不吃早餐危害还要大吗?哪种水要少喝?很多人在早上醒来,都有喝一杯温开水的习惯,早晨起来喝一杯温开水,可以补充身体的水分,促进血液循环,预防心血管疾病,也可以促进肠道蠕动缓解便秘,长期以往对身体有很多好处。但是有人说,吃一袋方便面,肝要解毒32天?事实是什么?中医大夫为你解答方便面是日常生活中再常见不过的速食食品,很多人提起它,都会有一种想吃,但吃了又会产生吃了垃圾食品的罪恶感。作为速食里面受欢迎的食品之一,方便面不仅吃法多样,就连口味也是十分丰富。大曝李章洙已下课!身体不适缺席赛后发布会张效瑞队伍现在很困难中超联赛第12轮补赛,大连人主场51逆转击败深足,送给对手五连败。最近3轮,深圳队共失14球,球队内忧外患,李章洙基本确定下课。赛后,深足中后卫元敏诚在接受采访时只能苦笑,称球队出媒体人塔克法尔近日入境开始隔离有望9月中旬与球队汇合直播吧9月1日讯今日据媒体人所罗门的臣仆报道,新疆大外援塔克法尔于近日入境开始隔离,9月中旬有望与球队汇合。小外援皮埃尔杰克逊已经与球队汇合并开始训练。所罗门的臣仆微博原文如下新疆CBA自由球员名单公布!贺天举李根领衔,至今32人无球可打北京时间的8月31日,根据CBA官网给出的消息,目前仍旧有32位球星处于自由球员名单当中,这份名单令许多球迷非常关注,毕竟其中还有很多优秀的球星,实力非常出色,如果就此离开赛场,难NBA历史上最具标志性的中锋全盘点,其中一位是中国骄傲(5155)NBA中锋是最需要身体挑战的位置,毕竟,他们身高都在6英尺10英寸左右,胳膊和腿比整个身体都长在如今的NBA中,球队的核心位置有一个具有统治力的中锋已经变得不那么常见了,这一切都要知名电竞爆料人回应LPL扩军传闻纯属工作失误战队展示页面已改今天上午,有热心网友在某直播平台发现,英雄联盟LPL官方直播间下方赛事介绍板块突然多了两个TBD队标,疑似是即将加入LPL的两支新战队。随后,这一消息在各大论坛平台掀起了一波热度,九年义务教育下的游戏江湖那是2000年,小镇有着南方特有的安逸。千禧一代的我们,大概不满足于这样的安逸,摩擦着游戏手柄,在稚嫩的吆喝中,幻想着快意人生。我的第一台小霸王学习机,是我父亲买来哄我的,那会儿因