限流的方式有很多:
1、單機模式下,可以使用atomicinteger、ratelimiter、semaphore。
2、分布式下,可以使用佇列(如kafka等),但是編碼比較繁雜;也可以使用nginx限流,但是屬於閘道器層面,不能解決所有問題(如內部服務介面)。
所以,應用層也是需要做限流操作的。這裡簡單結合aop+redis+lua來實現。注:如果是需要接入層先流的話,建議還是要使用nginx自帶的連線數限流模組和請求限流模組。
lua指令碼:
/**
* 限流指令碼
*/private string buildluascript()
1、keys[1]獲取傳入的keys引數,(這裡為redis的鍵key)
2、ar**[1]獲取到傳入的limit引數,(這裡為請求的token數量,也可以理解為次數)
3、ar**[2]獲取到傳入的limit引數,(這裡為使用的限流key的過期時間)
限流註解,limit
@target
(elementtype.method)
@retention
(retentionpolicy.runtime)
public @inte***ce
limit
切面aspect
@aspect
@component
public
class
limitaspect
@pointcut
("@annotation(com.xx.xx.limit)"
)public
void
pointcut()
@around
("pointcut()"
)public object around
(proceedingjoinpoint joinpoint)
throws throwable 次訪問key為 {},描述為 [{}] 的介面"
}
測試
/**
* @author shamee
* 限流測試
*/@restcontroller
("/api/limit"
)public
class
limitcontroller
}
簡單備註,以便日後查閱。 使用Redis進行限流
通過使用註解 提供介面形式與引數形式2種方式 針對性的對介面進行限流,底層使用redis配合lua指令碼實現令牌桶。public class redisratelimiter public boolean tryacquire string flag,int maxpermits,int addra...
使用Nginx實現限流
1.http限流配置 限制請求 請求單個ip,每秒讀50次,寫10次 limit req zone uri zone api read 20m rate 50r s 讀 limit req zone uri zone api write 20m rate 10r s 寫 按ip配置乙個連線 zone...
限流和限流演算法
目錄 一 什麼是限流 二 為什麼需要限流 三 那些場景需要用到限流 3.1 對外服務 3.2 對內服務 四 限流演算法 4.1 計數器演算法 4.2 漏桶演算法 4.3 令牌桶演算法 限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務...