一、限流算法
主要的限流算法包含:
漏桶算法
、
令牌桶算法
、
計數器
。
每種限流算法詳細可以參考這裡
二、分布式限流方案
一般也就分為三種:
Gateway限流
,
redis+lua實作限流
,
nginx限流
。
2.1 Gateway限流
Spring Cloud Gateway
中提供了
RequestRateLimiterGatewayFilterFactory
類,這個是基于
令牌桶
實作的。
它内置
RedisReteLimiter
,依賴于
Redis
存儲限流配置和統計資料,也可以通過繼承
org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter
或者是實作
org.springframework.cloud.gateway.filter.ratelimit.RateLimiter
接口來實作自己的
RateLimiter
。
具體實作如下:
1. 首先在網關服務引入依賴
2. 具體配置如下
3. 可以實作基于三個次元的限流:
上面所示的配置是每秒産生的令牌數量是1,當我們的請求速度大于這個數值時,就會傳回429的狀态碼。
2.2 redis+lua
1.在服務中引入lua腳本
2.讀取lua
3.判斷是否需要限流的代碼
4. 上面我們可以看到正常情況下10s内隻産生3個令牌,我們來看下效果
可以看到10秒内隻有前三個請求通過,其他的都是被拒絕的,過了10s後又會有三個請求可以通過,這完全符合我們預期的效果。
2.3 Nginx限流
限制通路頻率(用來限制機關時間内的請求數):
Nginx可以通過參數
ngx_http_limit_req_module
子產品來限制通路頻率,使用的
漏桶算法
實作的;可以通過
limit_req_zone
指令以及
limit_req
指令限制單個
ip
的請求處理頻率。
限制連接配接數(用來限制同一時間連接配接數,即并發限制):
ngx_http_limit_conn_module
子產品提供了并發連接配接數的功能,可以使用
limit_conn_zone
指令和
limit_conn
進行配置,也是基于
漏桶算法
實作的。
具體配置:
限制通路速率
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server {
location / {
limit_req zone=mylimit;
}
}