关于api网关(四)——限流

author author     2023-04-24     542

关键词:

参考技术A

通俗的说,流量控制就是控制用户请求的策略,主要包括:权限、限流、流量调度。
权限上一篇已经讲过了,这一篇讲限流,下一篇讲流量调度。
限流是指限制用户调用的频率(QPS/QPM)或者次数。

流量限制,站在用户或者运营的角度看,最直观能感受到的作用是——收费
各大主流开放平台的对外API,一般都有一些免费的额度,可以供个人测试用,一旦想大规模调用,就需要付费购买更大的额度(频率、次数),根据调用次数或者频率进行收费。一旦超过拥有的额度,就会被限制调用。

其实这才是限流最大的用处,只是用户或者运营同学无感,所以不太被大多数人了解。
网关后面是各个服务,各个服务的接口通过网关透出去给用户调用。理论上说,用户的流量是不可预知的,随时可能来一波,一旦流量的峰值超过了服务的承载能力,服务就挂了,比如有大新闻发生时的某浪微博,比如前些年的12306.
所以, 网关必须保证,放过去到达后端服务的流量一定不可以超过服务可以承载的上限 。这个上限,是网关和各个服务协商出来的。

由简到难,限流可以 分为单机限流、单集群限流、全集群限流
这里不讨论具体的如漏桶、令牌桶等限流算法,只说概念和思想。

单机限流的思想很简单,就是每个机器的限流值 x 机器数量 = 总的限流值。
举个例子,A用户的QPS限制是100,网关部署了10台机器,那么,每台机器限制10QPS就可以了。
先说好处,这种方法实现起来非常简单,每台机器在本地内存计算qps就可以了,超过阈值就拒流。
不过单机限流的缺陷也十分明显,主要体现在两点:
 当网关部署的机器数量发生变化时,每台机器的限流值需要根据机器数调整。现实中,因为扩容、缩容、机器宕机等原因,机器数的变化是常有的事。
 单机限流的前提是,每台网关承载的用户的流量是平均的,但是事实上,在某些时间,用户的流量并不是完全平均分布在每台机器上的。
举个例子:
10台机器,每台限qps10,其中3台每台实际qps是15,因为超限导致用户流量被拒。其余7台每台qps是7。这样用户总的qps = 15 * 3 + 7 * 7 = 94. 用户qps并没有超限,但是却有一部分流量被拒了,这样就很有问题。
实际上,单台限流的阈值也会设置的稍微大一些,以抵消流量不均的问题。
因为上面的问题, 单机限流通常作为一种兜底的备用手段,大多数时候用的还是集群限流

先来看一个示意图:

相比单机限流,集群限流的计数工作上移到redis集群内进行,解决了单机限流的缺陷。
但是集群限流也不是完美的,因为引入了redis,那么,当网关和redis之间的网络抖动、redis本身故障时,集群限流就失效了,这时候,还是得依靠单机限流进行兜底。
也就是说, 集群限流 + 单机限流配合,才是一个比稳妥的方案

接下来我们来思考这样一个问题:大型网关一般都是多机房、多地域部署的,当然,后端的服务也是多机房、多地域部署的,在保护服务这一点来说,集群限流是够用了。但是对用户来说,还是有一些问题:
比如,用户购买的QPS上限是30,我们的网关部署在中国北、中、南三个地域,那么这30QPS怎么分配呢?
平均肯定不行,用户的流量可能是明显不均衡的,比如用户的业务主要集中在中国北方,那么用户的流量大部分都会进入北方的网关,网关如果限制QPS为10的话,用户肯定来投诉。
那每个地域都限制为30行不行?也不行,如果用户的流量比较均匀的分布在各个地域,那么用户购买了30QPS,实际上可能使用了90QPS,这太亏了。
按照解决单机限流流量不均的思路,搞一个公共的redis集群来计数行不行?
也不行,受限于信号传播速度和天朝的广阔疆域,每个流量都计数,肯定不现实,rt太高会导致限流失去意义,带宽成本也会变得极其昂贵,对redis的规格要求也会很高。总之,很贵还解决不了问题。
有一种巧妙的解决办法是:本地集群阶梯计数 + 全集群检查。
还是刚才的例子:
限流阈值时90,那么三个地域各自计数,当本地域的数值达到30时,去其他两个地域取一次对方当前的计数值,三个地域的计数值加起来,如果超了,告诉另外两个地域超了,开始拒流。如果没超,本地QPS每上涨10,重复一次上述的动作。
这样就能有效的减少与redis的交互次数,同时实现了全地域真·集群限流。
当然,这种全地域集群限流,因为rt和阶梯计数间隔的存在,一定是不准的,但是,比单集群限流还是好很多。

当某个用户流量特别大的时候,redis计数就会遇到典型的热点key问题,导致redis集群单节点压力过大, 有两种办法可以解决这个问题:打散和抽样。

打散是指,把热点key加一些后缀,使其变成多个key,从而hash到不通的redis节点上,均摊压力。
比如热点key是abcd,那么打散后,key变成了abcd1、abcd2、abcd3、abcd4。技术时,轮流加1、2、3、4的后缀就可以了。

抽样是指,针对热点key,不是每个每个请求到来时都进行计数,而是进行一个抽样,比如每10个请求记一次数,这样redis的压力就会降低到十分之一。

说着把流量调度的也说完了哈哈,那下一篇再说说监控好了,顺便推一下我现在在用的国产网关:GOKU,来自Eolinker。我觉得比KONG好用,感兴趣的同学可以自行去了解一下。
www.eolinker.com

使用springcloudgateway搭建网关(分流,限流,熔断)

...项目是基于Spring5.0,SpringBoot2.0和ProjectReactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。SpringCloudGateway作为SpringCloud生态系统中的网关,目标是替代NetflixZuul,其不仅 查看详情

springcloud如何限流控制以及一些相关的策略分享

上面的文章演示了网关某些功能的自定义开发。API网关还起到流量输入的作用。为了保护后端微服务不被峰值流量淹没,API网关可以进行限流、融合和降级。熔断和劣化由hystrix等组件支持,电流限制策略还包括RequestRateLimitor。... 查看详情

soul网关(十五):限流和熔断的扫盲篇

...和GuavaRateLimiter的名字类似,但两者不一样。hystrix插件是网关用来对流量进行熔断的核心实现。使用信号量的方式来处理请求,基于Netflix/Hystrix来实现的。sentinel为网关熔断限流提供能力。resilience4j为网关熔断限流提供能力。上... 查看详情

springcloud使用zuul限流(spring-cloud-zuul-ratelimit)

...率能在一定程度上抵御短信轰炸攻击,降低损失。微服务网关是每个请求的必经入口,非常适合做一些API限流、认证之类的操作,本文介绍Zuul如何进行限流操作个人建议:如果在网关做细粒度的限流,后面微服务业务变化的话... 查看详情

api网关kong使用指南(四)——hmac-auth插件配置

...因此,我们在Kong转发时配置了认证插件。Kong官网提供的关于认证插件很多,有17个之多,我们挑选了其中三个比较适合的插件作出对比:参考淘宝及中通开放平台的api协议规则,它们也是采用类似HMAC这种带签名的认证方式实现... 查看详情

springcloudgateway整合sentinel实现流控熔断(代码片段)

一、什么是网关限流:在微服务架构中,网关层可以屏蔽外部服务直接对内部服务进行调用,对内部服务起到隔离保护的作用,网关限流,顾名思义,就是通过网关层对服务进行限流,从而达到保护后... 查看详情

关于eShopOnContainers api网关路由前缀的问题

】关于eShopOnContainersapi网关路由前缀的问题【英文标题】:QuestionabouteShopOnContainersapigatewayrouteprefix【发布时间】:2021-07-2008:16:18【问题描述】:有一个名为eShopOnContainer的项目,它是一个.NET微服务示例参考应用程序,由Microsoft提... 查看详情

springcloudalibaba——sentinel服务熔断与限流(四@sentinelresource注解)

...规则、降级规则、热点规则,那么这篇文章来说一下关于@SentinelResource注解的作用。在之前学习Hystrix的时候,有一个核心注解是@HystrixCommand,而阿里的sentinel中的@SentinelResource注解可以理解为@HystrixC 查看详情

springcloudalibaba——sentinel服务熔断与限流(四@sentinelresource注解)

...规则、降级规则、热点规则,那么这篇文章来说一下关于@SentinelResource注解的作用。在之前学习Hystrix的时候,有一个核心注解是@HystrixCommand,而阿里的sentinel中的@SentinelResource注解可以理解为@HystrixC 查看详情

网关篇-自定义客户端限流

转https://www.cnblogs.com/jackcao/p/9987424.html转https://www.cnblogs.com/jackcao/p/9987424.html 查看详情

又被面试官装到了:springcloudgateway网关限流怎么做?

...imiter过滤器来实现限流操作。1.引入jar包2.编写配置文件3.网关正常响应4.网关限流响应1.自定义限流key配置文件中的写法(部分)2.自定义限流算法配置文件中的写法(部分)注意⚠️:这个类需要加上@Primary注解。3.配置文件中... 查看详情

springcloud系列之网关gateway-14.网关层的其他妙用-限流

参考技术A这里采用令牌桶计数的方式做限流,总共分三步我们的BestPractice是基于Redis来实现限流,因此要保证本地启动了Redis服务。同时将下列配置加入到Gateway的配置文件中:这里是配置Redis连接信息的,假如你不配置的话,Gate... 查看详情

envoy实现.net架构的网关集成redis实现限流

.NET网关与Gateway实战-Envoy与kong课程什么是限流限流即限制并发量,限制某一段时间只有指定数量的请求进入后台服务器,遇到流量高峰期或者流量突增时,把流量速率限制在系统所能接受的合理范围之内,不至于... 查看详情

springcloudgateway限流操作

...系统时有三把利器用来保护系统:缓存、降级和限流。API网关作为所有请求的入口,请求量大,我们可以通过对并发访问的请求进行限速来保护系统的可用性。常用的限流算法比如有令牌桶算法,漏桶算法,计数器算法等。在Zuu... 查看详情

微服务网关常用限流算法

...,这种算法保护了后端的微服务,但是会可能造成微服务网关压力激增      第三种:令牌桶算法令牌桶算法相对于漏斗桶算法,其实就是少了一个输出速率的设置,他与漏斗桶算法相比,主要是为了保护网... 查看详情

springcloud(greenwich版)新一代api网关gateway

一、Gateway简介  Gateway是在Spring生态系统之上构建的API网关服务,基于Spring5,SpringBoot2和ProjectReactor等技术。SpringCloudGateway旨在提供一种简单而有效的方法来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流... 查看详情

微服务网关鉴权:gateway使用网关限流使用用户密码加密jwt鉴权(代码片段)

目标掌握微服务网关Gateway的系统搭建掌握网关限流的实现能够使用BCrypt实现对密码的加密与验证了解加密算法能够使用JWT实现微服务鉴权1.微服务网关Gateway1.1微服务网关概述不同的微服务一般会有不同的网络地址,而外部客... 查看详情

微服务网关鉴权:gateway使用网关限流使用用户密码加密jwt鉴权(代码片段)

目标掌握微服务网关Gateway的系统搭建掌握网关限流的实现能够使用BCrypt实现对密码的加密与验证了解加密算法能够使用JWT实现微服务鉴权1.微服务网关Gateway1.1微服务网关概述不同的微服务一般会有不同的网络地址,而外部客... 查看详情