熱點(diǎn)
- 熱點(diǎn)就是經(jīng)常訪問的數(shù)據(jù);
- 比如商品接口的 QPS 限定的是 100,有一天要秒殺,帶著秒殺商品 id 的請(qǐng)求的 QPS 限制在 50,這樣還能有 50 的 QPS 用來訪問其他的商品;
- 這就提出了一個(gè)去求,要能根據(jù)請(qǐng)求的參數(shù)來做限流,比如請(qǐng)求帶的參數(shù)是熱點(diǎn)參數(shù),就對(duì)這個(gè)請(qǐng)求應(yīng)用特殊的限流規(guī)則;對(duì)攜帶非熱點(diǎn)參數(shù)的請(qǐng)求,走另一個(gè)限流規(guī)則;
Sentinel 實(shí)現(xiàn)根據(jù)參數(shù)指定不同的限流規(guī)則(熱點(diǎn)規(guī)則)
將商品查看接口看做成一個(gè) @SentinelResource
@GetMapping("/{id}")
@SentinelResource(value = "getOrder")
public OrderInfo getInfo(@PathVariable Long id, @AuthenticationPrincipal String username) {
log.info("user name " + username);
log.info("orderId is " + id);
OrderInfo info = new OrderInfo();
info.setId(id);
info.setProductId(id * 5);
return info;
}
在 sentinel-dashboard 中添加熱點(diǎn)規(guī)則
- 資源名(getOrder):
@SentinelResource(value = "getOrder")中的value值; - 參數(shù)索引(0):針對(duì)第 0 個(gè)參數(shù);
- 參數(shù)類型(long):索引位置是 0 的參數(shù)的類型是 long;
- 參數(shù)值(1):如果其值是 1;
- 限流閾值(1):允許的 QPS 就是 1;
- 單機(jī)閾值(10):不是 1 的情況下,允許的 QPS 就是 10;
- 統(tǒng)計(jì)時(shí)間窗口(1):統(tǒng)計(jì)的時(shí)間單位,一般都是 1s;
配完了之后,對(duì)于被
@SentinelResource(value = "getOrder")標(biāo)注的接口,如果參數(shù) id 帶的值是 1,那么允許它的 QPS 就是 1;對(duì)于 id 值是其他的值的請(qǐng)求,允許其 QPS 就是 10;
系統(tǒng)規(guī)則
- 系統(tǒng)規(guī)則和熱點(diǎn)規(guī)則不一樣,熱點(diǎn)規(guī)則是針對(duì)方法設(shè)定的,系統(tǒng)規(guī)則是針對(duì)一個(gè)應(yīng)用設(shè)定的;
系統(tǒng)規(guī)則的 5 中預(yù)置類型
- LOAD:只有在 Linux 系統(tǒng)的機(jī)器上才會(huì)生效,可以根據(jù)當(dāng)前操作系統(tǒng)的負(fù)載,來決定是否觸發(fā)保護(hù)(把請(qǐng)求拒絕掉);
- RT:這個(gè)應(yīng)用上,所有請(qǐng)求的平均響應(yīng)時(shí)間,如果超過某個(gè)值,就停止新的請(qǐng)求;
- 線程數(shù):這個(gè)應(yīng)用上,所有的請(qǐng)求消耗的線程數(shù)加起來,如果超過某個(gè)值,就停止新的請(qǐng)求;
- 入口 QPS:這個(gè)應(yīng)用上,所有接口的 QPS 加起來,如果超過某個(gè)值,就停止新的請(qǐng)求;
- CPU 使用率:CPU 的使用率,如果超過一個(gè)百分比,就停止新的請(qǐng)求;
發(fā)生系統(tǒng)規(guī)則中配置的情況的時(shí)候,會(huì)把整個(gè)應(yīng)用都斷掉,所有的接口對(duì)不能對(duì)外提供服務(wù)了,這個(gè)設(shè)計(jì)很少用,因?yàn)榱6忍罅?,?Sentinel 一般都是做細(xì)粒度的維護(hù),如果設(shè)置了系統(tǒng)規(guī)則,可能自己都不知道怎么回事,系統(tǒng)就用不了了;