微服务限流技术总结
一、微服务业务面试题引入
在微服务业务面试中,限流是重要考点,常与分布式事务、分布式服务接口幂等解决方案、分布式任务调度等一同被考查。面试官一般会询问项目中是否实施限流及具体做法,回答需涵盖限流原因、采用的方式与算法等方面。
二、限流原因
(一)应对高并发
业务增长或特定活动(如抢券业务)时会出现流量高峰,大量请求可能超出系统处理能力,导致系统响应变慢、资源耗尽甚至崩溃,影响用户体验和系统稳定性,因此需要限流来保障系统正常运行。
(二)防范恶意攻击
恶意用户刷接口会占用大量系统资源,即使采用集群技术也可能无法应对大规模恶意流量,限流可有效阻止此类攻击,确保合法用户的服务质量。
三、常见限流方式及算法
(一)Tomcat 限流
通过设置 max rs
等参数控制最大连接数实现限流。例如,若 max rs
设置为 150,则 Tomcat 同时处理的连接数最多为 150。但在微服务架构下,每个微服务都需单独配置,管理复杂,适用于单体项目,在微服务项目中存在局限性。
(二)Nginx 限流
- 漏桶算法控制速率
- 算法原理:基于漏桶算法,Nginx 将请求存入类似漏桶的结构,按照固定速率向外流出请求进行处理。如每秒固定流出 2 个请求,可使处理请求的速率保持稳定。
- 配置参数 :
limit_req_zone
:用于设置请求区域。- 可按用户
ip
或路径等方式定义限流对象,如remote_addr
表示按ip
限流。 - 存储空间可根据实际需求设置,如 10M 可存储 16 万
ip
地址,用于记录限流相关信息。 rate
如10r/s
表示每秒最多处理 10 个请求。burst
表示桶的大小,如设置为 20,则桶最多能存储 20 个请求,超过此数量的请求将被等待或抛弃。nodelay
表示快速处理请求,包括快速处理桶内请求和快速抛弃超出限量的请求。
- 漏桶算法控制并发连接数
- 配置参数 :
limit_conn
:用于控制连接相关的限流操作。- 可按
ip
或server_name
(虚拟主机)等方式进行限流配置,如按ip
限流时可设置内存大小为 10M,并可自定义引用。 - 对于
server_name
,可设置虚拟主机同时处理的并发连接数总数,如设置为 100,表示该服务最大并发连接数为 100;对于单个ip
,可设置其最多能持有的连接数,如 20 个。
- 配置位置 :需在具体的主机或反向代理中进行配置才能生效。
- 配置参数 :
(三)网关限流(以 Spring Cloud 网关为例)
- 令牌桶算法原理及配置
- 算法原理:采用令牌桶算法,以固定速率生成令牌并存入令牌桶中。请求到达时需从桶中获取令牌,获取到令牌的请求才能被服务处理,未获取到令牌的请求则被阻塞或丢弃。例如,每秒生成 3 个令牌,如果某一秒内没有请求消耗令牌,下一秒来了 6 个请求,这 6 个请求可先获取上一秒剩余的 3 个令牌,同时本秒再生成 3 个令牌,从而可以处理这 6 个请求,这体现了令牌桶算法在处理突发流量时与漏桶算法的区别,即令牌桶处理请求的速率可能存在波动,而漏桶是以固定速率处理请求。
- 配置参数 :
keyResolver
:用于定义限流对象,可按ip
、路径或参数等方式定义,需要通过代码实现并被 Spring 管理,可使用SPEL
表达式获取对象。- 设置令牌桶每秒填充的平均速度,即令牌生成速度,如设置为 1 表示每秒生成 1 个令牌。
- 设置令牌桶的总容量,因为令牌桶不能无限制生成令牌,且令牌默认存储在 Redis 中,所以在网关配置文件中需要配置 Redis 连接信息。
- 配置位置 :在网关的配置文件(如
yaml
)中,通过request rate limit
局部过滤器进行设置。
(四)自定义连接器限流
在没有 Nginx 或网关的情况下,可采用自定义连接器限流,但在一般微服务项目中,通常会有 Nginx 或网关,所以在面试中重点应阐述 Nginx 和网关的限流方式。
四、面试回答要点
(一)业务场景描述
详细介绍项目业务及限流场景,例如在开展促销活动期间,如假期抢优惠券活动时,QPS(每秒查询率)可能会从平时的 10 - 50 飙升至 2000,为应对这种突发流量需要进行限流;或者为防止恶意攻击,若系统压测得出能承受的最大 QPS 为 1000,超过此值系统可能崩溃,因此需要控制每秒访问次数在 1000 以内。
(二)限流方式阐述
分别说明项目中采用的 Nginx 和网关限流方式及相关算法原理。对于 Nginx,提及控制速率的漏桶算法和控制并发连接数的配置及原理;对于网关,重点讲解令牌桶算法在网关中的应用及配置细节,如限流对象定义、令牌生成速度和桶容量设置等,强调这些限流方式如何保障系统在面对高并发和恶意攻击时的稳定运行。