簡介
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
sentinel相當(dāng)于hystrix的升級(jí)版,加入了web界面,能夠?qū)崟r(shí)在線的改變流量策略。
Sentinel 分為兩個(gè)部分:
- 核心庫(Java 客戶端)不依賴任何框架/庫,能夠運(yùn)行于所有 Java 運(yùn)行時(shí)環(huán)境,同時(shí)對(duì) Dubbo / Spring Cloud 等框架也有較好的支持。
- 控制臺(tái)(Dashboard)基于 Spring Boot 開發(fā),打包后可以直接運(yùn)行,不需要額外的 Tomcat 等應(yīng)用容器。
安裝
官方下載架包后運(yùn)行命令:
java -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
訪問localhost:8858 即可進(jìn)入控制臺(tái)界面,賬戶密碼都為sentinel
sentinel控制臺(tái)使用
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel
按照文檔配置后,訪問localhost:8080可以看到如下畫面。如果沒有左邊的服務(wù)名,可以嘗試注銷賬號(hào)重新登陸。
流控規(guī)則
流控模式:
- 直接:API達(dá)到限流條件時(shí),直接限流。
- 關(guān)聯(lián):當(dāng)關(guān)聯(lián)的資源達(dá)到閾值時(shí),就限流自己。
- 鏈路:只記錄指定鏈路上的流量(指定資源從入口資源進(jìn)來的流量,如果達(dá)到閾值,就進(jìn)行限流)【API級(jí)別的針對(duì)來源】。
流控效果:
- 快速失?。褐苯邮?,拋異常。
- Warm up:根據(jù)Code Factor(冷加載因子,默認(rèn)3)的值,從閾值/codeFactor,經(jīng)過預(yù)熱時(shí)長,才達(dá)到設(shè)置的QPS閾值。
- 排隊(duì)等待:勻速排隊(duì),讓請求以勻速的速度通過,閾值類型必須設(shè)置為QPS,否則無效。
熔斷(降級(jí))規(guī)則
RT(平均響應(yīng)時(shí)間,秒級(jí)):
- 平均響應(yīng)時(shí)間 超出閾值 且 在時(shí)間窗口內(nèi)通過的請求>=5,兩個(gè)條件同時(shí)滿足后觸發(fā)降級(jí)。
- 窗口期過后關(guān)閉斷路器。
- RT最大4900(更大的需要通過-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)。
異常比列(秒級(jí))
- QPS >= 5且異常比例(秒級(jí)統(tǒng)計(jì))超過閾值時(shí),觸發(fā)降級(jí);時(shí)間窗口結(jié)束后,關(guān)閉降級(jí) 。
異常數(shù)(分鐘級(jí))
- 異常數(shù)(分鐘統(tǒng)計(jì))超過閾值時(shí),觸發(fā)降級(jí);時(shí)間窗口結(jié)束后,關(guān)閉降級(jí)。
熱點(diǎn)key
何為熱點(diǎn)?熱點(diǎn)即經(jīng)常訪問的數(shù)據(jù)。很多時(shí)候我們希望統(tǒng)計(jì)某個(gè)熱點(diǎn)數(shù)據(jù)中訪問頻次最高的 Top K 數(shù)據(jù),并對(duì)其訪問進(jìn)行限制。比如:
商品 ID 為參數(shù),統(tǒng)計(jì)一段時(shí)間內(nèi)最常購買的商品 ID 并進(jìn)行限制
用戶 ID 為參數(shù),針對(duì)一段時(shí)間內(nèi)頻繁訪問的用戶 ID 進(jìn)行限制
熱點(diǎn)參數(shù)限流會(huì)統(tǒng)計(jì)傳入?yún)?shù)中的熱點(diǎn)參數(shù),并根據(jù)配置的限流閾值與模式,對(duì)包含熱點(diǎn)參數(shù)的資源調(diào)用進(jìn)行限流。熱點(diǎn)參數(shù)限流可以看做是一種特殊的流量控制,僅對(duì)包含熱點(diǎn)參數(shù)的資源調(diào)用生效。
下面的代碼中參數(shù)p1,p2就是熱點(diǎn)。deal_testHotKey為被sentinel限流后的兜底方法。
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2){
return "testHotKey";
}
public String deal_testHotKey(String p1, String p2, BlockException e){
return "deal_testHotKey 兜底方法";
}
下面設(shè)置會(huì)統(tǒng)計(jì)/testHotKey攜帶參數(shù)0(p1)的次數(shù),如果在統(tǒng)計(jì)窗口(1s)內(nèi)有超過單機(jī)閾值(1條)帶有參數(shù)p1的請求,則會(huì)限流。
注意:這里的blockHandler對(duì)應(yīng)的兜底方法只能在sentinel限流的時(shí)候才會(huì)觸發(fā),程序異常并不會(huì)走兜底方法。
參數(shù)例外項(xiàng)
- 普通 - 超過1秒鐘一個(gè)后,達(dá)到閾值1后馬上被限流
- 我們期望p1參數(shù)當(dāng)它是某個(gè)特殊值時(shí),它的限流值和平時(shí)不一樣
- 特例 - 假如當(dāng)p1的值等于5時(shí),它的閾值可以達(dá)到200
注意:參數(shù)的值應(yīng)該是基本類型or String
系統(tǒng)規(guī)則(了解)
系統(tǒng)保護(hù)規(guī)則是從應(yīng)用級(jí)別的入口流量進(jìn)行控制,從單臺(tái)機(jī)器的 load、CPU 使用率、平均 RT、入口 QPS 和并發(fā)線程數(shù)等幾個(gè)維度監(jiān)控應(yīng)用指標(biāo),讓系統(tǒng)盡可能跑在最大吞吐量的同時(shí)保證系統(tǒng)整體的穩(wěn)定性。
系統(tǒng)保護(hù)規(guī)則是應(yīng)用整體維度的,而不是資源維度的,并且僅對(duì)入口流量生效。入口流量指的是進(jìn)入應(yīng)用的流量(EntryType.IN),比如 Web 服務(wù)或 Dubbo 服務(wù)端接收的請求,都屬于入口流量。
系統(tǒng)規(guī)則支持以下的模式:
Load 自適應(yīng)(僅對(duì) Linux/Unix-like 機(jī)器生效):系統(tǒng)的 load1 作為啟發(fā)指標(biāo),進(jìn)行自適應(yīng)系統(tǒng)保護(hù)。當(dāng)系統(tǒng) load1 超過設(shè)定的啟發(fā)值,且系統(tǒng)當(dāng)前的并發(fā)線程數(shù)超過估算的系統(tǒng)容量時(shí)才會(huì)觸發(fā)系統(tǒng)保護(hù)(BBR 階段)。系統(tǒng)容量由系統(tǒng)的 maxQps * minRt 估算得出。設(shè)定參考值一般是 CPU cores * 2.5。
CPU usage(1.5.0+ 版本):當(dāng)系統(tǒng) CPU 使用率超過閾值即觸發(fā)系統(tǒng)保護(hù)(取值范圍 0.0-1.0),比較靈敏。
平均 RT:當(dāng)單臺(tái)機(jī)器上所有入口流量的平均 RT 達(dá)到閾值即觸發(fā)系統(tǒng)保護(hù),單位是毫秒。
并發(fā)線程數(shù):當(dāng)單臺(tái)機(jī)器上所有入口流量的并發(fā)線程數(shù)達(dá)到閾值即觸發(fā)系統(tǒng)保護(hù)。
入口 QPS:當(dāng)單臺(tái)機(jī)器上所有入口流量的 QPS 達(dá)到閾值即觸發(fā)系統(tǒng)保護(hù)。
@SentinelResource兜底方法配置
可以另外創(chuàng)建一個(gè)類來進(jìn)行兜底方法的配置:
public class CustomerBlockHandler {
public static CommonResult handlerException(BlockException exception){
return new CommonResult(4444,"用戶自定義全局Exception: ",new Payment(2020L,"serial003"));
}
public static CommonResult handlerException2(BlockException exception){
return new CommonResult(4444,"用戶自定義全局Exception: ",new Payment(2020L,"serial003-2"));
}
}
controller:通過blockHandlerClass指定類名,blockHandler指定選定的兜底方法。
@GetMapping("/byResource")
@SentinelResource(value = "byResource",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handlerException")
public CommonResult byResource(){
return new CommonResult(200,"按資源名稱訪問限流測試OK",new Payment(2020L,"serial001"));
}
整合nacos進(jìn)行持久化存儲(chǔ)
默認(rèn)情況下,當(dāng)我們在Sentinel控制臺(tái)中配置規(guī)則時(shí),控制臺(tái)推送規(guī)則方式是通過API將規(guī)則推送至客戶端并直接更新到內(nèi)存中。一旦我們重啟應(yīng)用,規(guī)則將消失。
配置
引入依賴
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
修改application.yml:
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
在nacos中添加配置:
[
{
"resource": "/rateLimit/byUrl",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
相關(guān)參數(shù)解釋:
resource:資源名稱;
limitApp:來源應(yīng)用;
grade:閾值類型,0表示線程數(shù),1表示QPS;
count:單機(jī)閾值;
strategy:流控模式,0表示直接,1表示關(guān)聯(lián),2表示鏈路;
controlBehavior:流控效果,0表示快速失敗,1表示W(wǎng)arm Up,2表示排隊(duì)等待;
clusterMode:是否集群。文章來源:http://www.zghlxwxcb.cn/news/detail-819362.html
之后可以發(fā)現(xiàn)Sentinel控制臺(tái)已經(jīng)有了如下限流規(guī)則:文章來源地址http://www.zghlxwxcb.cn/news/detail-819362.html
到了這里,關(guān)于springcloud alibaba sentinel熔斷降級(jí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!