springgateway限流 令牌桶演算法

2021-10-07 12:46:50 字數 2375 閱讀 1753

參見:

lua指令碼

參見spring-spring-cloud-gateway-core包下的request_rate_limiter.lua

redis從2.6版本開始引入對lua指令碼的支援,通過在伺服器中嵌入lua環境,redis客戶端可以使用lua指令碼,直接在伺服器端原子地執行多個redis命令

對比之後的註解過程:

-- redis中的值,只有一次訪問時候

-- request_rate_limiter..tokens 令牌桶

local tokens_key = keys[1]

-- request_rate_limiter..timestamp 時間戳

local timestamp_key = keys[2]

-- 通過截圖可知

local rate = tonumber(ar**[1]) -- = 10 允許使用者每秒處理多少個請求

local capacity = tonumber(ar**[2])-- = 20 令牌桶的容量,允許在一秒鐘內完成的最大請求數

local now = tonumber(ar**[3])-- = 159173167 instant.now().getepochsecond()當前時間戳

local requested = tonumber(ar**[4]) -- = 訪問量 1,瀏覽器模擬乙個請求

local fill_time = capacity/rate -- 20/10 = 2

local ttl = math.floor(fill_time*2) -- 過期時間4秒

-- 獲取redis上一次token數量

local last_tokens = tonumber(redis.call("get", tokens_key))

if last_tokens == nil then

last_tokens = capacity

end-- 獲取redis上一次時間戳

local last_refreshed = tonumber(redis.call("get", timestamp_key))

if last_refreshed == nil then

last_refreshed = 0

end-- 時間差 = 當前時間戳 - 上一次時間戳

-- 比如只過去了一秒 delta=1

local delta = math.max(0, now-last_refreshed)

-- 當前最大量capacity=20,delta*rate=1*10=10

-- filled_tokens = 10個

local filled_tokens = math.min(capacity, last_tokens+(delta*rate))

-- 當前 10個》1個

local allowed = filled_tokens >= requested

-- new_tokens = 10個

local new_tokens = filled_tokens

-- 允許數量

local allowed_num = 0

-- 允許訪問

if allowed then

-- new_tokens= 10 - 1 = 9

new_tokens = filled_tokens - requested

allowed_num = 1

endredis.call("setex", tokens_key, ttl, new_tokens)

redis.call("setex", timestamp_key, ttl, now)

return

啟動一百個執行緒壓測列印返回日誌:

response: response, tokensremaining=-1}

response: response, tokensremaining=-1}

// 省略。。。。。。

response: response, tokensremaining=-1}

response: response,tokensremaining= -1}

此時客戶端:http response code: 429 

Spring gateway的動態路由

gateway官方文件 gateway是spring cloud中乙個用於替換zuul閘道器作用的子專案,基於webflux實現了非同步非阻塞處理。gateway工程首先需在啟動時注入route,在請求進來時,會根據route的predicate匹配路由規則,然後經過gatewayfilter以及g...

spring gateway閘道器的使用

1建立module檔案 2匯入依賴 org.springframework.cloudgroupid spring cloud starter gatewayartifactid dependency 3配置yml檔案 server port 9527 spring name cloud gatew...

spring gateway 處理 跨域 問題

問題一 spring name nb web cloud nacos discovery server addr localhost 8848 gateway globalcors corsconfigurations allowedheaders allowedorigins allowcrede...