由於api介面無法控制呼叫方的行為,因此當遇到瞬時請求量激增時,會導致介面占用過多伺服器資源,使得其他請求響應速度降低或是超時,更有甚者可能導致伺服器宕機。限流可以應對:熱點業務帶來的突發請求;限流(rate limiting)指對應用服務的請求進行限制,例如某一介面的請求限制為100個每秒,對超過限制的請求則進行快速失敗或丟棄。
呼叫方bug導致的突發請求;
惡意攻擊請求。
因此,對於公開的介面最好採取限流措施。
新增pom
建立配置類
@configuration
public
class
redisconfig
自定義限流註解
@target
(elementtype.method)
@retention
(retentionpolicy.runtime)
public @inte***ce
limit
public
enum limittype
建立限流切面類(根據自己業務需要可進行修改)
@slf4j
@aspect
@component
public
class
limitaspect
@pointcut
("@annotation(com.bszn.managerplatform.common.limit)"
)public
void
pointcut()
@around
("pointcut()"
)public object around
(proceedingjoinpoint point)
throws throwable
string argsname=
((codesignature) point.
getsignature()
).getparameternames()
; map
parammap =
newhashmap
<
>()
;if(argsname.length >0)
if(objects.
equals
("timestamp"
,argsname[i]))
if(objects.
equals
("sign"
,argsname[i]))
}}immutablelist
keys = immutablelist.
of(stringutils.
join
(limitannotation.
prefix()
+"_"
, key, ip,parammap));
string luascript =
buildluascript()
; redisscript
redisscript =
newdefaultredisscript
<
>
(luascript, number.
class);
number count = limitredistemplate.
execute
(redisscript, keys, limitcount, limitperiod)
; log.
info
("ip:{} 第 {} 次訪問key為 {},描述為 [{}] 的介面"
, ip, count, keys, name);if
(count != null && count.
intvalue()
<= limitcount)
else
}/**
* 限流指令碼
* 呼叫的時候不超過閾值,則直接返回並執行計算器自加。
** @return lua指令碼
*/private string buildluascript()
private
static
final string unknown =
"unknown"
;public string getipaddress()
if(ip == null || ip.
length()
==0|| unknown.
equalsignorecase
(ip))if
(ip == null || ip.
length()
==0|| unknown.
equalsignorecase
(ip)
)return ip;
}}
使用註解對介面進行限流
分布式限流實戰 redis實現令牌桶限流
這篇文章我們主要是分析一下分布式限流的玩法。因為限流也是乙個經典用法了。隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。快取 降級和限流是保護微服務系統執行穩定性的三大利器。快取的目的是提公升系統訪問速度和增大系統能處理的容量,而降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待...
redis lua分布式限流
註解反思 我們專案有好幾個介面,呼叫公司中颱的介面,包括定時器的分片執行還有本人的多執行緒強行壓榨,哈哈。最後加上使用者的瘋狂請求,導致中颱的介面偶爾出現問題,主要是資料庫cpu達到100 昨晚專門做了個限流,那麼技術定型使用什麼呢?ratelimiter?這好像是單機才能玩,sentinel?這個...
分布式限流演算法
一 限流的作用 有高併發的系統中,由於api介面無法控制呼叫發的行為,因此如果遇到瞬時請求數量遞增,就會導致介面占用過多的伺服器子u,導致響應速度降低或者超時,甚至可能英雌導致伺服器宕機,尤其是資料庫伺服器。所以就有限流的思想,限制客戶端對伺服器端端的請求限制,如果在單位時間內超過該請求限制,就會執...