天天看點

分布式限流方案

一、限流算法

主要的限流算法包含:​

​漏桶算法​

​​、​

​令牌桶算法​

​​、​

​計數器​

​ 。

每種限流算法詳細可以參考這裡

二、分布式限流方案

一般也就分為三種:​

​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;
    }
}      

補充一、怎麼讓系統承受更大的通路量?

繼續閱讀