卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

nginx啟動(dòng)時(shí)執(zhí)行l(wèi)ua腳本 nginx能夠?qū)戇壿嬇袛鄦幔?/h1>

nginx能夠?qū)戇壿嬇袛鄦幔縉ginx支持邏輯判斷語法匹配,也可以使用lua增強(qiáng)。微服務(wù)如何限制接口調(diào)用次數(shù)?這種限制接口調(diào)用次數(shù)的通常被稱為限流,那么為什么要限制流量呢?一般有兩個(gè)原因:1.首先是防

nginx能夠?qū)戇壿嬇袛鄦幔?/h2>

Nginx支持邏輯判斷語法匹配,也可以使用lua增強(qiáng)。

微服務(wù)如何限制接口調(diào)用次數(shù)?

這種限制接口調(diào)用次數(shù)的通常被稱為限流,那么為什么要限制流量呢?一般有兩個(gè)原因:

1.首先是防止服務(wù)提供者被大量的請(qǐng)求淹沒。

我們?cè)陂_發(fā)一個(gè)項(xiàng)目的時(shí)候,理想的情況是可以正常響應(yīng)很多請(qǐng)求,但是在現(xiàn)在的互聯(lián)網(wǎng)環(huán)境下,我們很難評(píng)估用戶的增長(zhǎng),訪問的數(shù)量,甚至有時(shí)候會(huì)遇到惡意攻擊;那么,與其項(xiàng)目被流量碾壓,不如限制流量,只滿足部分接入的正常響應(yīng)。

簡(jiǎn)單來說:滿足所有請(qǐng)求,滿足部分請(qǐng)求,項(xiàng)目被碾壓,所有請(qǐng)求都無法響應(yīng)。

充電

目前很多平臺(tái)開發(fā)的接口并不都是免費(fèi)的。比如普通會(huì)員一天只能調(diào)用接口1000次,高級(jí)會(huì)員一天可以調(diào)用接口10萬次,或者按調(diào)用量收費(fèi)。

那么如何限制服務(wù)接口調(diào)用的次數(shù)呢?

使用電流限制算法

通常我們可以通過限流算法來限制接口調(diào)用的次數(shù),比如計(jì)數(shù)器法、滑動(dòng)窗口法、漏桶、令牌桶算法,這里我們以令牌桶算法為例。

令牌桶算法,我們可以把它想象成一個(gè)桶,里面有n個(gè)令牌,系統(tǒng)會(huì)勻速把令牌放進(jìn)桶里。在每次處理之前,我們必須首先獲得令牌,如果可以的話。;如果得不到,我們將拒絕服務(wù)。這里我們使用Google生產(chǎn)的Guava工具庫(kù),它提供了一個(gè)開箱即用的令牌桶速率限制器。

如圖,我們寫了一個(gè)簡(jiǎn)單的接口,省略了業(yè)務(wù)邏輯,只返回一個(gè)字符串;我們?cè)O(shè)置(2),這意味著每秒提交的任務(wù)不超過2個(gè)。

讓 使用接口工具模擬并發(fā)調(diào)用:

他逼他堅(jiān)強(qiáng),我卻立場(chǎng)堅(jiān)定。因?yàn)槲覀兪褂孟蘖魉惴?,并且每秒只處?個(gè)請(qǐng)求,所以我們可以從日志中看到每秒只有2個(gè)日志的效果。

分布式架構(gòu)下的電流限制

由于使用了開源組件,限流的實(shí)現(xiàn)看起來很簡(jiǎn)單,但是這里也有一個(gè)很大的問題,就是實(shí)例是一個(gè)應(yīng)用包,但是在實(shí)際項(xiàng)目中,我們通常是通過集群部署的將我們的應(yīng)用部署在多臺(tái)機(jī)器上,那么這個(gè)時(shí)候如何限流呢?

每臺(tái)服務(wù)器上的應(yīng)用程序控制自己的響應(yīng)數(shù)量?比如一天只能調(diào)100次,如果調(diào)配10臺(tái),總數(shù)就變成1000次;

反推?因?yàn)榭偭恳惶熘荒苷{(diào)100次,調(diào)配10個(gè)單位,也就是每個(gè)單位一天只能調(diào)10次?這是一個(gè)非常糟糕的方法。更不用說流量可以平均分配到每臺(tái)機(jī)器。如果一機(jī)掛機(jī),今天只能支持90個(gè)嗎?

通常我們可以將令牌放在公共場(chǎng)所的令牌桶中,如Redis,而不是本地。每次請(qǐng)求來的時(shí)候,我們都可以計(jì)算出總量是否超過限制。如果沒有,我們會(huì)正常處理。如果是這樣,我們將返回一個(gè)錯(cuò)誤消息。

具體來說,Redis中的key-100作為令牌桶,100表示一分鐘可以調(diào)用100次,每次處理前將值減1,返回值大于0,表示可以處理;每分鐘將數(shù)值設(shè)回100;或者計(jì)數(shù)累加,從0開始,不斷累加,最后超過單位時(shí)間的總量限制;

但是,這個(gè)方法應(yīng)該有一個(gè)定時(shí)任務(wù)來設(shè)置令牌的數(shù)量。此外,這種方法可以 t應(yīng)對(duì)突發(fā)流量,比如前59秒沒有請(qǐng)求,第60秒來了100個(gè)請(qǐng)求,第61秒來了100個(gè)請(qǐng)求,實(shí)際上兩秒處理了200個(gè)請(qǐng)求。

另一種方案是使用Redis中的有序隊(duì)列排序集來存儲(chǔ)近100次的調(diào)用時(shí)間。每次有新請(qǐng)求時(shí),將隊(duì)列中第一個(gè)元素的時(shí)間與當(dāng)前時(shí)間進(jìn)行比較。如果相差超過1分鐘,說明沒有超過流量限制,然后進(jìn)行處理,把第一個(gè)元素推出隊(duì)列,把新的請(qǐng)求時(shí)間推入隊(duì)列。

我會(huì)繼續(xù)分享我對(duì)Java開發(fā)、架構(gòu)設(shè)計(jì)、程序員職業(yè)發(fā)展等方面的看法,希望得到大家的關(guān)注。