城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

SpringCloudGateway通过redis实现限流

10月2日 九阙忬投稿
  前言
  在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。
  常见的限流方式,比如Hystrix适用线程池隔离,超过线程池的负载,走熔断的逻辑。在一般应用服务器中,比如tomcat容器也是通过限制它的线程数来控制并发的;也有通过时间窗口的平均速度来控制流量。常见的限流纬度有比如通过Ip来限流、通过uri来限流、通过用户访问频次来限流。
  一般限流都是在网关这一层做,比如Nginx、Openresty、kong、zuul、SpringCloudGateway等;也可以在应用层通过Aop这种方式去做限流。
  限流的目的是通过对并发访问请求进行限速或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或友好的展示页)、排队或等待(比如秒杀、评论、下单等场景)、降级(返回兜底数据或默认数据)。一般的中间件都会有单机限流框架,支持两种限流模式:控制速率和控制并发。常见的限流算法计数器算法
  计数器算法采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。具体的实现可以是这样的:对于每次服务调用,可以通过AtomicLongincrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。这种实现方式,相信大家都知道有一个弊端:如果我在单位时间1s内的前10ms,已经通过了100个请求,那后面的990ms,只能眼巴巴的把请求拒绝,我们把这种现象称为突刺现象漏桶算法
  漏桶算法为了消除突刺现象,可以采用漏桶算法实现限流,漏桶算法这个名字就很形象,算法内部有一个容器,类似生活用到的漏斗,当请求进来时,相当于水倒入漏斗,然后从下端小口慢慢匀速的流出。不管上面流量多大,下面流出的速度始终保持不变。不管服务调用方多么不稳定,通过漏桶算法进行限流,每10毫秒处理一次请求。因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理的请求就先放在桶里,既然是个桶,肯定是有容量上限,如果桶满了,那么新进来的请求就丢弃。
  在算法实现方面,可以准备一个队列,用来保存请求,另外通过一个线程池(ScheduledExecutorService)来定期从队列中获取请求并执行,可以一次性获取多个并发执行。
  这种算法,在使用过后也存在弊端:无法应对短时间的突发流量。令牌桶算法
  从某种意义上讲,令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。
  实现思路:可以准备一个队列,用来保存令牌,另外通过一个线程池定期生成令牌放到队列中,每来一个请求,就从队列中获取一个令牌,并继续执行。RequestRateLimiterGatewayFilterFactory
  限流作为网关最基本的功能,SpringCloudGateway官方就提供RequestRateLimiterGatewayFilterFactory这个类。RequestRateLimiterGatewayFilter工厂使用RateLimiter实现来确定是否允许继续处理当前请求。如果不是,则返回HTTP429TooManyRequests(默认情况下)状态。
  RequestRateLimiterGatewayFilter采用可选的keyResolver参数和特定于速率限制器的参数KeyResolver
  keyResolver是一个实现KeyResolver接口的bean。在配置中,使用SpEL按名称引用bean。{myKeyResolver}是一个SpEL表达式,它引用名为myKeyResolver的bean。KeyResolver的默认实现是PrincipalNameKeyResolver,它从ServerWebExchange检索Principal并调用Principal。getName()。默认情况下,如果KeyResolver没有找到key,请求将被拒绝。可以以下通过设置来调整此行为spring。cloud。gateway。filter。requestratelimiter。denyemptykey(Boolean)和spring。cloud。gateway。filter。requestratelimiter。emptykeystatuscode(String)RedisRateLimiter
  RequestRateLimiterGatewayFilterFactory使用redis和lua脚本来实现令牌桶算法,lua脚本在RequestRateLimiterGatewayFilterFactory所在的包METAINFscripts中
  使用RedisRateLimiter需要引入springbootstarterdataredisreactive包,RedisRateLimiter使用的是令牌桶算法。redisratelimiter。replenishRate:希望允许用户每秒执行多少请求,而没有任何丢弃的请求。这是令牌桶填充的速率。redisratelimiter。burstCapacity:允许用户在一秒内执行的最大请求数。这是令牌桶可以容纳的令牌数量。将此值设置为零会阻止所有请求。redisratelimiter。requestedTokens:请求需要使用多少令牌。这是每个请求从桶中取出的令牌数量,默认为1。
  通过在replenishRate和burstCapacity中设置相同的值来实现稳定的速率。通过将burstCapacity设置为高于replenishRate,可以允许临时突发。在这种情况下,需要允许速率限制器在突发之间有一段时间(根据replenishRate),因为两个连续的突发将导致请求丢失(HTTP429TooManyRequests)。实现
  这些实现的限流的项目都是在我之前的springcloud学习的基础上实现的,有兴趣的可以查看springcloud入门(1)eureka注册中心
  springcloud入门(10)SpringSecurity安全与权限
  springcloud入门之网关springcloudgateway
  1、在cloudgatewayspringboot项目中引入依赖dependencygroupIdorg。springframework。cloudgroupIdspringcloudstartergatewayartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootstarterdataredisreactiveartifactIddependency复制代码
  2、实现KeyResolver接口ComponentpublicclassUriKeyResolverimplementsKeyResolver{OverridepublicMonoStringresolve(ServerWebExchangeexchange){finalStringpathexchange。getRequest()。getURI()。getPath();System。out。println(path);returnMono。just(path);}}复制代码
  UriKeyResolver是对URI进行限流。
  3、修改配置文件server。port7201spring。application。nameCLOUDGATEWAY路由配置spring。cloud。gateway。routes〔0〕。idmycsdnroutespring。cloud。gateway。routes〔0〕。urihttp:blog。csdn。netspring。cloud。gateway。routes〔0〕。predicates〔0〕Pathqq39654841限流过滤器spring。cloud。gateway。routes〔0〕。filters〔0〕。nameRequestRateLimiter令牌桶每秒填充平均速率spring。cloud。gateway。routes〔0〕。filters〔0〕。args。redisratelimiter。replenishRate1令牌桶总容量spring。cloud。gateway。routes〔0〕。filters〔0〕。args。redisratelimiter。burstCapacity10用于限流的键的解析器的Bean对象的名字。它使用SpEL表达式根据{beanName}从Spring容器中获取Bean对象spring。cloud。gateway。routes〔0〕。filters〔0〕。args。keyresolver{uriKeyResolver}redisspring。redis。hostlocalhostspring。redis。port6379spring。redis。database0spring。redis。jedis。pool。maxactive8复制代码
  4、测试访问http:localhost:7201qq39654841,使用postman迭代20次进行测试,可以发现会有HTTP429TooManyRequests报错
  查看redis会有限流存储的key的信息,关于key的含义可以查看lua脚本
  至此,SpringCloudGateway限流就到此结束了。
  作者:索码理
  链接:https:juejin。cnpost7129694147492970504
  来源:稀土掘金
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
投诉 评论 转载

薛宝钗张莉,身家过亿至今不婚,无儿无女终难逃红楼一梦看过87版《红楼梦》的想必都知道剧中的薛宝钗最终还是嫁给了贾宝玉,但是谁都没有想到在现实生活中她如今却还是孑然一身。她不仅是娱乐圈中公认的冻龄女星,同时也是身家过亿的房地……微淼财商教育低风险存钱的方法,你知道的有哪些?近日来,六大国有银行(中国银行、农业银行、工商银行、建设银行、交通银行和邮储银行)集体下调居民存款利率。除邮储银行一年期定存挂牌利率为1。68,略有不同外,所有活期存款下……人人尽说江南好,游人只合江南老春水碧于天,画船听雨眠不能外出旅游的期间,翻看旧日的照片总是会屡屡带来新感受。随着手指的翻动,一幅江南水乡的美景映入眼帘,江南醉人美景随即在脑海浮现。图源小版管家江南好,风景旧曾谙。日出……废太子,屠大臣吴大帝孙权早年精明,晚年为何却犯了糊涂?孙权字仲谋,生就了一副碧睛紫髯的天生异像。江东的基业虽是其父长沙太守孙坚和其兄小霸王孙策开创的,但将其发扬光大的却是孙权。如果以一句话评价孙权的一生,那就是早年精明强干晚……55岁泰国前总理英拉真不见老,长相端庄大气,穿衣高级显品味女人上了年纪后考验的不是容貌有多么艳丽,毕竟岁月不可逆,上了年纪后所有女人都改变不了皱纹和发腮。那考验的是什么呢?是岁月沉淀下来的独特的气质。泰国前总理英拉可以说是政坛少……SpringCloudGateway通过redis实现限流前言在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。常见的限流方式,比如Hystrix……恭喜!又一对中国冠军夫妇诞生,身高合计超4米,太有夫妻相随着时代的变化,男女除了传统的同事、同学和朋友介绍等相识方式,更多的男女愿意通过网络相识,网络上有很多我们中意的对象,联系也十分方便,但是比较之下,还是传统的一些渠道更有安全感……母亲节一天6件喜事怀孕晒照秀恩爱送礼物,快乐的事全了母亲节一天6个瓜,陈冠希表白老婆,韩庚老婆卢靖姗晒孕照引言。韩庚卢靖姗官宣怀孕5月8日是母亲节,当天,大家都在发文晒照,感恩自己的母亲,明星们也不例外,仅这一天,娱……2022年7月30日新闻简报,周末愉快正文共898字预计阅读时间:3分钟码字不易,如果有用,请记得支持点赞关注转发!美好的一天,从读报开始,7月30日,壬寅年七月初二,星期六,周末愉快,幸福生活1……高血压患者夏季饮食指南,这样吃才健康高血压已经成为很常见的慢性病了,据统计,我国目前已有3。3亿高血压患者。但每到夏季,部分患者的血压忽高忽低,很不稳定,不仅会伤及血管,增加动脉硬化的进程,还会引起心、脑、肾、眼……男篮赴欧洲拉练14人名单,各自有什么特点?4人很难定位文水清清结束亚洲杯后,男篮14人奔赴欧洲进行拉练,预祝球员们能够调整状态,帮助球队在世预赛第四个窗口期取得佳绩的同时,也希望他们能够提升各自的能力,而提到能力,脑海里闪过……10年和20年湖人两次伟大夺冠对比!科比28。6击败三巨头,湖人作为联盟有史以来最伟大的豪门球队,向来不缺大牌球星,而他们的近两次总冠军,也是由当时联盟的第一人率队夺得的,分别是科比2010年在抢七复仇击败绿军,如愿拿到自己的职业生涯最……
风景区里的星级派出所住在绍兴,不走了把车辆变得会思考通人性孤独症儿童母亲自述崩溃过努力过,如今孩子要上普通小学了分享15个HTML新特性,大多数人可能不知道,建议尽早使用上宜家和Sonos合作推出新款SYMFONISK音箱台灯,配竹一条紫色春山路聊一款主流价位的轻薄笔记本为什么说泰坦星上存在生命?提醒!预防手足口病,家长需做好6件事以岭药业种植的中药品种连翘荣登2022道地药材品牌榜单科斯蒂奇建功,尤文客场小胜国米

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找