Soul限流插件之RateLimiter插件
從Soul的RateLimiter插件的配置可以看到
RateLimiter是依賴於Redis的,可以看到限流也可以基於Redis的三種模式的單機(standlone),集羣(cluster)和哨兵(sentinel)模式
在插件處理的開啓的過程中即進行了Redis模式的配置
在選擇器規則中兩個主要的配置的含義
- capacity(容量):是允許用戶在一秒鐘內執行的最大請求數。這是令牌桶可以保存的令牌數。
- rate(速率):是你允許用戶每秒執行多少請求,而丟棄任何請求。這是令牌桶的填充速率。
通過之前的學習可以知道,插件的具體執行邏輯在插件的執行方法doExecute中
而更爲關鍵的執行則是RateLimiter的isAllowed方法。
可以看到在方法內部,將配置表單中的兩個方法參數直接傳遞給了執行限流的lua腳本,並由lua腳本進行具體的限流操作
另外,最後執行的文件位置位於/META-INF/scripts/request_rate_limiter.lua,並且從加載可以看到,文件由Spring-data-redis提供組件進行加載。這也提示我們,如果要對RateLimiter做一些操作。我們可以通過lua腳本的方式來進行。
另外可以看到SoulReactiveRedisTemplate和SoulReactiveScriptExecutor已經將所有的Redis操作和腳本操作變爲Reactive的異步操作,了。這無疑提升了ratelimiter插件的性能
可以總結的是。ratelimiter基於Redis和lua腳本以及Reactive構建了一個高性能的限流插件
歡迎搜索關注本人與朋友共同開發的微信面經小程序【大廠面試助手】和公衆號【微瞰技術】,以及總結的分類面試題https://github.com/zhendiao/JavaInterview