上一篇 <<<服務(wù)的隔離冯丙、降級(jí)和熔斷
下一篇 >>>服務(wù)限流之滑動(dòng)窗口計(jì)數(shù)
最簡(jiǎn)單最容易的一種算法,比如我們要求某一個(gè)接口,1分鐘內(nèi)的請(qǐng)求不能超過10次携御,我們可以在開始時(shí)設(shè)置一個(gè)計(jì)數(shù)器斑鼻,每次請(qǐng)求,該計(jì)數(shù)器+1穿肄;
如果該計(jì)數(shù)器的值大于10并且與第一次請(qǐng)求的時(shí)間間隔在1分鐘內(nèi)脖祈,那么說明請(qǐng)求過多肆捕,如果該請(qǐng)求與第一次請(qǐng)求的時(shí)間間隔大于1分鐘刷晋,并且該計(jì)數(shù)器的值還在限流范圍內(nèi)盖高,那么重置該計(jì)數(shù)器。
缺陷:在臨界點(diǎn)會(huì)存在問題
/**
* 功能說明: 純手寫計(jì)數(shù)器方式<br>
*/
public class LimitService {
private int limtCount = 60;// 限制最大訪問的容量
AtomicInteger atomicInteger = new AtomicInteger(0); // 每秒鐘 實(shí)際請(qǐng)求的數(shù)量
private long start = System.currentTimeMillis();// 獲取當(dāng)前系統(tǒng)時(shí)間
private int interval = 60;// 間隔時(shí)間60秒
public boolean acquire() {
long newTime = System.currentTimeMillis();
if (newTime > (start + interval)) {
// 判斷是否是一個(gè)周期
start = newTime;
atomicInteger.set(0); // 清理為0
return true;
}
atomicInteger.incrementAndGet();// i++;
return atomicInteger.get() <= limtCount;
}
static LimitService limitService = new LimitService();
public static void main(String[] args) {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for (int i = 1; i < 100; i++) {
final int tempI = i;
newCachedThreadPool.execute(new Runnable() {
public void run() {
if (limitService.acquire()) {
System.out.println("你沒有被限流,可以正常訪問邏輯 i:" + tempI);
} else {
System.out.println("你已經(jīng)被限流呢 i:" + tempI);
}
}
});
}
}
}
推薦閱讀:
<<<高并發(fā)架構(gòu)的整體思路
<<<一個(gè)網(wǎng)站訪問慢的真正原因
<<<高并發(fā)情況下眼虱,接口的代碼會(huì)存在哪些問題
<<<壓縮靜態(tài)資源減少帶寬傳輸?shù)姆绞?/a>
<<<動(dòng)靜分離架構(gòu)模式
<<<緩存策略匯總
<<<后端服務(wù)的雪崩效應(yīng)及解決思路
<<<服務(wù)的隔離喻奥、降級(jí)和熔斷
<<<服務(wù)限流之滑動(dòng)窗口計(jì)數(shù)
<<<服務(wù)限流之令牌桶算法
<<<服務(wù)限流之漏桶算法
<<<漏桶算法和令牌桶算法的區(qū)別
<<<自定義封裝限流算法
<<<應(yīng)用級(jí)限流
<<<接入層限流