企業(yè)員工管理信息系統(tǒng)上海企業(yè)優(yōu)化
Sentinel服務(wù)熔斷和流控
簡介
Sentinel
? 隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 是面向分布式服務(wù)架構(gòu)的流量控制組件,主要以流量為切入點(diǎn),從限流、流量整形、熔斷降級、系統(tǒng)負(fù)載保護(hù)、熱點(diǎn)防護(hù)等多個(gè)維度來幫助開發(fā)者保障微服務(wù)的穩(wěn)定性。
源碼地址:https://github.com/alibaba/Sentinel
官方文檔:https://github.com/alibaba/Sentinel/wiki
https://sentinelguard.io/zh-cn/docs/circuit-breaking.html
Spring Cloud Alibaba Sentinel 同時(shí)兼具了熔斷器和流控的功能。
Sentinel具有以下特征:
-
豐富的應(yīng)用場景: Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發(fā)流量控
制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷、實(shí)時(shí)熔斷下游不可用應(yīng)用等。 -
完備的實(shí)時(shí)監(jiān)控: Sentinel 同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您可以在控制臺中看到接入應(yīng)用的單臺機(jī)器秒級數(shù)據(jù),甚至 500 臺以下規(guī)模的集群的匯總運(yùn)行情況。
-
廣泛的開源生態(tài): Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、
gRPC 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡單的配置即可快速地接入 Sentinel。 -
完善的 SPI 擴(kuò)展點(diǎn): Sentinel 提供簡單易用、完善的 SPI 擴(kuò)展點(diǎn)。您可以通過實(shí)現(xiàn)擴(kuò)展點(diǎn),快速的定制邏輯。例如定制規(guī)則管理、適配數(shù)據(jù)源等。
Spring的spi是通過ClassLoader去META-INF/spring.factories加載class,然后反射實(shí)例化返回。像SpringBoot用這種方式去加載一些自動配置類,即引入xx-starter就能夠自動向spring容器中注入許多配置好的組件。
阿里云提供了 企業(yè)級的 Sentinel 服務(wù),應(yīng)用高可用服務(wù) AHAS
Sentinel和Hystrix對比
https://github.com/alibaba/Sentinel/wiki/Sentinel-%E4%B8%8E-Hystrix-%E7%9A%84%E5%AF%B9%E6%AF%94
Sentinel | Hystrix | |
---|---|---|
隔離策略 | 信號量隔離 | 線程池隔離/信號量隔離 |
熔斷降級策略 | 基于響應(yīng)時(shí)間或失敗比率 | 基于失敗比率 |
實(shí)時(shí)指標(biāo)實(shí)現(xiàn) | 滑動窗口 | 滑動窗口(基于 RxJava) |
規(guī)則配置 | 支持多種數(shù)據(jù)源 | 支持多種數(shù)據(jù)源 |
擴(kuò)展性 | 多個(gè)擴(kuò)展點(diǎn) | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于調(diào)用關(guān)系的限流 | 有限的支持 |
流量整形 | 支持慢啟動、勻速器模式 | 不支持 |
系統(tǒng)負(fù)載保護(hù) | 支持 | 不支持 |
控制臺 | 開箱即用,可配置規(guī)則、查看秒級監(jiān)控、機(jī)器發(fā)現(xiàn)等 | 不完善 |
常見框架的適配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
熔斷
微服務(wù)架構(gòu)的系統(tǒng)通常會包含多個(gè)微服務(wù),各個(gè)微服務(wù)可能部署在不同的機(jī)器上并通過網(wǎng)絡(luò)進(jìn)行通信,那么就不可避免會遇到 “網(wǎng)絡(luò)請求超時(shí)” 、“微服務(wù)不可用” 等問題,這就會進(jìn)一步引起依賴它的微服務(wù)不可用,這樣不斷引發(fā)服務(wù)故障的現(xiàn)象稱為『雪崩效應(yīng)』,最終的結(jié)果是整個(gè)應(yīng)用系統(tǒng)癱瘓。
為了解決上述問題,編程領(lǐng)域(參考現(xiàn)實(shí)生活)提出了熔斷器:
使用熔斷器模式,如果請求出現(xiàn)異常,所有請求都會直接返回,而不會等待或阻塞,這樣可以減少資源的浪費(fèi)。
熔斷器所造成的這種現(xiàn)象也叫『快速失敗(fast fall)』。
流控
限流功能指的是 Sentinel(類似于過濾器、攔截器的效果)在收到請求后,拒絕請求的放行(至 Controller),而是直接返回,從而減少對 Controller,乃至 Service 的觸發(fā)執(zhí)行。
熔斷和限流的區(qū)別在于,熔斷是確確實(shí)實(shí)發(fā)生了錯(cuò)誤,而限流是人為(根據(jù)設(shè)置)強(qiáng)行讓一部分請求被打回。
sentinel安裝
sentinel-dashboard 的下載安裝
sentinel-dashboard 是基于 Spring Boot 開發(fā)的控制臺。打包后可以直接運(yùn)行,不需要額外的 Tomcat 等應(yīng)用容器。Sentinel 控制臺不僅能展示服務(wù)流控、熔斷降級相關(guān)的數(shù)據(jù),還可以通過配置的方式動態(tài)的為 Sentinel 客戶端下發(fā)流量控制的指令
我們需要下載并安裝的是 sentinel-dashBoard ,下載地址:https://github.com/alibaba/Sentinel/releases
注意:啟動 sentinel-dashboard 需要 JDK 版本為 1.8 及以上版本。
使用如下命令啟動控制臺:
java -Dserver.port=8840 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
-
-Dserver.port=8840
用于指定 Sentinel 控制臺端口為 8840。默認(rèn)是 8080 。
-
-Dproject.name=sentinel-dashboard
指定 Sentinel 控制臺程序的名稱。
說明
如果你有多張網(wǎng)卡的話,你還需要指定使用哪張網(wǎng)卡(IP)來接受各個(gè)微服務(wù)上報(bào)的信息:
-Dcsp.sentinel.heartbeat.client.ip=192.168.xxx.xxx
訪問網(wǎng)址:[http://127.0.0.1:8840]
從 1.6.0 起,sentinel-dashboard 引入基本的登錄功能,默認(rèn)用戶名和密碼都是 sentinel 。當(dāng)然也可以通過 JVM 參數(shù)的方式進(jìn)行修改
-
-Dsentinel.dashboard.auth.username=sentinel
用于指定控制臺的登錄用戶名為 sentinel ;
-
-Dsentinel.dashboard.auth.password=123456
用于指定控制臺的登錄密碼為 123456;如果省略這兩個(gè)參數(shù),默認(rèn)用戶和密碼均為 sentinel;
-
-Dserver.servlet.session.timeout=7200
用于指定 Spring Boot 服務(wù)端 session 的過期時(shí)間,如 7200 表示 7200 秒;60m 表示 60 分鐘,默認(rèn)為 30 分鐘;
Sentinel 本身就是一個(gè) Spring Boot 應(yīng)用,所以jar 包內(nèi)部的 application.properties 文件也是可以修改配置的。
Sentinel實(shí)現(xiàn)限流
Spring Cloud Alibaba Sentinel 可以分別用在服務(wù)的 “請求發(fā)起方” 和 “請求被調(diào)方”
- 請求發(fā)起方使用的是 OpenFeign ,因此這種情況下 Sentinel 是和 OpenFeign 進(jìn)行整合;
- 請求被調(diào)用使用的是 Spring MVC,因此這種情況下 Sentinel 是和 Spring MVC 進(jìn)行整合
同時(shí)又由于 Sentinel 兼具熔斷和流控兩個(gè)功能,因此這里就有 4 種情況:
- 在服務(wù)發(fā)起方項(xiàng)目中,整合 OpenFeign 進(jìn)行實(shí)現(xiàn)熔斷功能;
- 在服務(wù)發(fā)起方項(xiàng)目中,整合 OpenFeign 進(jìn)行實(shí)現(xiàn)限流功能;
- 在服務(wù)被調(diào)方項(xiàng)目中,整合 Spring MVC 進(jìn)行實(shí)現(xiàn)熔斷功能;
- 在服務(wù)被調(diào)方項(xiàng)目中,整合 Spring MVC 進(jìn)行實(shí)現(xiàn)限流功能。
這樣以來功能上就出現(xiàn)了重疊冗余,因此在實(shí)際使用中我們是這樣安排的:
- 在服務(wù)發(fā)起方,Sentinel 整合 OpenFeign 實(shí)現(xiàn)熔斷功能;
- 在服務(wù)被調(diào)方,Sentinel 整合 Spring MVC 實(shí)現(xiàn)限流功能。
總結(jié):流控針對provider,熔斷降級針對consumer
sentinel實(shí)現(xiàn)限流
回顧前面筆記中的 “關(guān)于 Sentinel 的使用方式” 章節(jié),在這里,我們在服務(wù)的 “被調(diào)方” 使用 Sentinel 整合 Spring MVC 進(jìn)行流量控制。
在這里,Sentinel 借助 Spring MVC 框架的 “攔截器” 機(jī)制整合進(jìn)入 Spring MVC ,“搶先” 在 Controller 執(zhí)行之前進(jìn)行流控(和熔斷)的判斷,從而決定當(dāng)前請求是否被放行至 Controller
sentinel整合mvc
1.引入相關(guān)依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 其實(shí)真正起作用的是被關(guān)聯(lián)引入的 sentinel-spring-webmvc-adapter 包 -->
2.添加配置(連接到 sentinel-dashboard)
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8080port: 8719feign:sentinel:enabled: true
3.訪問 sentinel-dashboard
只需要完成上述的配置,代碼不需要有任何的調(diào)整,我們就可以通過實(shí)時(shí)監(jiān)控查看服務(wù)內(nèi)的流量 QPS(每秒查詢率) 以及平均響應(yīng)時(shí)長等信息。
只有服務(wù)接口被訪問的情況下,在 sentinel 里面才可以看到監(jiān)控信息。這可能會讓你『等』一段時(shí)間。
相關(guān)概念
- 上下文( Context )和 context-name
Context 代表調(diào)用鏈路上下文。是一個(gè)根節(jié)點(diǎn),在整個(gè)調(diào)用鏈路的開始處,Sentinel 會創(chuàng)建上下文 Context 對象,并且為它指定一個(gè) name ,相當(dāng)于根資源。在 Sentinel 中,不同的調(diào)用鏈路可能使用同一個(gè)上下文 Context 對象(共一個(gè)根節(jié)點(diǎn))。在這里( 和 Spring MVC 整合 ),我們的調(diào)用鏈路都是在 sentinel_spring_web_context 中:
- 資源(Resource)和 resource-name
在 Sentinel 中,對于每一份資源,Sentinel 會為賦予一個(gè) name(或者你手動指定),和 Spring MVC 整合時(shí),Sentinel 使用的是 URI 來作為 Controller 方法的資源名( 在這里,Controller 方法就是資源 )
流控規(guī)則
在菜單左側(cè)的 簇點(diǎn)鏈路和流控規(guī)則都可以針對 服務(wù)接口添加流控規(guī)則:
當(dāng)我們的服務(wù)接口資源被訪問的時(shí)候,就會出現(xiàn)在 簇點(diǎn)鏈路 列表中,我們可以針對該服務(wù)接口資源配置流程控制規(guī)則
說明:
-
資源名:表示我們針對哪個(gè)接口資源進(jìn)行流控規(guī)則配置,如:/test2/{id}
-
針對來源:表示針對哪一個(gè)服務(wù)訪問當(dāng)前接口資源的時(shí)候進(jìn)行限流,default 表示不區(qū)分訪問來源。如填寫服務(wù)名稱:xxx-service,表示 xxx-service 訪問前接口資源的時(shí)候進(jìn)行限流,其他服務(wù)訪問該接口資源的時(shí)候不限流,一般就是默認(rèn)為default即可。
-
閾值類型/單機(jī)閾值:QPS,每秒鐘請求數(shù)量。上圖配置表示每秒鐘超過2次請求的時(shí)候進(jìn)行限流;當(dāng)然我們可以設(shè)置線程數(shù),表示開啟 n 個(gè)線程處理資源請求,這個(gè)不是只每秒2個(gè)線程,對服務(wù)端 /test1請求,資源接口的 2 個(gè)線程都被占用的時(shí)候,其他訪問失敗!一般用的都是QPS
-
是否集群:默認(rèn)情況下我們的限流策略都是針對單個(gè)服務(wù)的,當(dāng)然sentinel 提供了集群限流的功能。
除非你的微服務(wù)規(guī)模特別大,一般不要使用集群模式。集群模式需要各節(jié)點(diǎn)與 token server 交互才可以,會增加網(wǎng)絡(luò)交互次數(shù),一定程度上會拖慢你的服務(wù)響應(yīng)時(shí)間。
上面的限流規(guī)則用一句話說:對于任何來源的請求,當(dāng)超過每秒 2 次的標(biāo)準(zhǔn)之后就直接限流,訪問失敗拋出 BlockException 異常!
流控規(guī)則高級選項(xiàng)
1.流控模式
- 直接:當(dāng)前資源達(dá)到限流標(biāo)準(zhǔn)時(shí)就直接限流,默認(rèn)值
- 關(guān)聯(lián):/important接口的重要程度要高于 /normal接口,如果,/important接口的訪問壓力很大,那么,可以『犧牲』掉 /normal` 接口,全力保證 /important 接口的正常運(yùn)行
例如:我們在resttemplate-a微服務(wù)中,創(chuàng)建兩個(gè)接口
@GetMapping("/query")
public String query(){return "ok:query";
}@GetMapping("/add")
public String add(){return "ok:add";
}
先訪問:http://localhost:9527/add和http://localhost:9527/query
我們對/query接口進(jìn)行限流,這個(gè)配置的意思就是,當(dāng)每秒對/add接口的請求超過2次時(shí),就對/query接口進(jìn)行限流,要注意這樣是優(yōu)先保證/add不限流,犧牲的是/query接口。10s內(nèi)對/add接口超過20次請求,那么就對/query接口限流
測試:
- 鏈路
鏈路限流和關(guān)聯(lián)限流的思路很像,假設(shè)我們要去請求某個(gè)微服務(wù),該微服務(wù)有2個(gè)接口(/query和/add),而這兩個(gè)接口又調(diào)用了同一個(gè)service層的方法(如:doSomething()方法),那么,我們可以『站在 doSomething的方法』的角度上進(jìn)行設(shè)置:如果是 /query接口在調(diào)用service層的 doSomething方法,那么就進(jìn)行限流,而 /add接口的調(diào)用就不限流,或設(shè)置為更寬松一些的流控
1.配置設(shè)置:通過配置關(guān)閉 sentinel 的 URL 收斂功能
spring:application:name: resttemplate-acloud:nacos:discovery:server-addr: localhost:8848sentinel:transport:dashboard: localhost:8840web-context-unify: false #默認(rèn)是開啟上下文整合,所有鏈路在根節(jié)點(diǎn)下,鏈路監(jiān)控就是將請求分開統(tǒng)計(jì)
2.代碼設(shè)計(jì)
controller層
@GetMapping("/query")
public String query(){return userService.doSomething();
}
@GetMapping("/add")
public String add(){return userService.doSomething();
}
//service層
@Component
public class UserService {@SentinelResource("doSomething")public String doSomething() {return "hello world";}
}
3.重新運(yùn)行,先在界面發(fā)送請求 http://localhost:9527/query和http://localhost:9527/add,然后sentinel配置
鏈路配置:
4.測試:在jmeter對/add測試時(shí)不限流(如10秒鐘對/add請求80次),但是同時(shí)在瀏覽器對/query測試時(shí),每秒只能是2次請求。
2.流控效果
- 快速失敗:很簡單的說就是達(dá)到限流標(biāo)準(zhǔn)后,請求就被攔截,直接失敗。(HTTP狀態(tài)碼:429 too many request),默認(rèn)值
- Warm up:預(yù)熱模式,也有叫冷啟動,主要是為系統(tǒng)啟動時(shí)設(shè)置預(yù)熱時(shí)間,底層有預(yù)熱因子是3,在系統(tǒng)剛啟動時(shí),使用的閾值不再是每秒多少個(gè)請求,而是設(shè)置的閾值除以預(yù)熱因子,在預(yù)熱的時(shí)間內(nèi),逐漸提升閾值,最后達(dá)到設(shè)置的閾值(也就是每秒多少個(gè)請求),好處是預(yù)防系統(tǒng)剛啟動時(shí),突發(fā)大量的請求,服務(wù)容易宕機(jī)。
1.代碼設(shè)計(jì)
@GetMapping("/test/{id}")
public ResponseEntity<String> test1(@PathVariable Integer id){return new ResponseEntity<>("ok", HttpStatus.OK);
}
2.配置設(shè)置
在10秒內(nèi),每秒允許的請求數(shù)會逐漸增加,也就是每秒的閾值逐漸提高
3.測試
- 排隊(duì)等待:也叫流量整形,它讓請求以均勻的速度通過,單機(jī)閾值為每秒通過數(shù)量,其余的在隊(duì)列排隊(duì)等待一段時(shí)間,(即我們設(shè)置的時(shí)間,單位是毫秒),沒有超過這個(gè)時(shí)間都能被及時(shí)處理,如果超過了這個(gè)等待時(shí)間針對請求的接口沒有線程來處理,則拋出異常
測試:每秒50個(gè)請求
Sentinel 和 SpringMVC 整合原理
Sentinel 和 Spring MVC 的整合利用了 Spring MVC 的攔截器機(jī)制,Sentinel 實(shí)現(xiàn)了一個(gè)名為 SentinelWebInterceptor 的攔截器,其邏輯偽代碼如下
public SentinelWebInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){try {1. 初始化上下文;2. 熔斷、流控邏輯的判斷,判斷當(dāng)前請求是否能繼續(xù)執(zhí)行;return true; // 此時(shí) Controller 方法會被調(diào)用。Controller 方法就是 3 。} catch (BlockException e) {4. 上述第 2 步未能通過,會拋出 BlockException ,表示請求被拒絕return false;}}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {} public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {if (發(fā)生了異常) {5. 業(yè)務(wù)異常。記錄、統(tǒng)計(jì)異常信息}6. 收尾工作:曾經(jīng)創(chuàng)建的資源該回收的回收,該清除的清除}
自定義限流異常信息返回
Sentinel 返回的默認(rèn)信息是 Blocked by Sentinel (flow limiting),如果你對默認(rèn)響應(yīng)信息不滿意,你可以自定義限流返回信息。
Sentinel 提供了 BlockExceptionHandler 接口。不管什么原因觸發(fā)了 Sentinel 阻斷用戶的正常請求,Sentinel 都將『進(jìn)入』到用戶自定義的 BlockExceptionHandler 接口的實(shí)現(xiàn)類中,執(zhí)行 handle 方法,并傳入當(dāng)前的請求、響應(yīng)對象以及異常對象,并以 handle 方法的執(zhí)行結(jié)果作為返回,回傳給用戶。
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception {String msg = null;if (ex instanceof FlowException) {msg = "該請求限流了,請稍后重試";} else if (ex instanceof DegradeException) {msg = "被熔斷了";} else {msg = "其它原因";// ParamFlowException "熱點(diǎn)參數(shù)限流";// SystemBlockException "系統(tǒng)規(guī)則(負(fù)載/...不滿足要求)";// AuthorityException "授權(quán)規(guī)則不通過";}// http 狀態(tài)碼response.setStatus(500);response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "application/json;charset=utf-8");response.setContentType("application/json;charset=utf-8");new ObjectMapper().writeValue(response.getWriter(), msg);}
}
需要說明的是:不僅僅是因?yàn)橄蘖骱腿蹟噙@一個(gè)原因會導(dǎo)致 BlockExceptionhandler 的 handle 方法的執(zhí)行,還有其它的原因也會調(diào)用這個(gè)handler方法,因此,需要對 handle 方法的 BlockException 參數(shù)對象進(jìn)行 instanceof 判斷
sentinel服務(wù)熔斷降級
我們在服務(wù)的 “請求發(fā)起方” 使用 Sentinel 整合 OpenFeign 進(jìn)行熔斷降級
sentinel整合feign
1.添加依賴
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.添加配置(連接到 sentinel-dashboard)
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8840
feign:sentinel:enabled: true ##啟用 Sentinel 與 OpenFeign 整合適配器
3.代碼實(shí)現(xiàn)spring-service-a-feign微服務(wù),調(diào)用spring-service-b微服務(wù)
@FeignClient(value = "spring-service-b",qualifier = "feignclient",fallback = PermFeignClientImpl.class )
public interface PermFeignClient {@GetMapping("/perms/{id}")public Perms getPermsById(@PathVariable("id") Integer id);
}
=========降級代碼==============
@Component
public class PermFeignClientImpl implements PermFeignClient {@Overridepublic Perms getPermsById(Integer id) {Perms perms = new Perms();perms.setName("服務(wù)器忙,請稍后再試");return perms;}
}
===========controller=======================
@RestController
public class PermController {@Autowired @Qualifier("feignclient")private PermFeignClient permFeignClient;@GetMapping("/perm")public Perms getPermsById(Integer id) {Perms perms = permFeignClient.getPermsById(id);return perms;}
}
spring-service-b微服務(wù)
@GetMapping("/perms/{id}")
public Perms getPermsById(@PathVariable("id") Integer id) {if(id==1){try {Thread.sleep(800); //當(dāng)id為1時(shí),800毫秒才有相應(yīng)}catch (Exception ex){ }}if(id==2){throw new RuntimeException();}return permService.getPermsById(id);
}
4.熔斷規(guī)則
在 sentinel-dashboard 上你可以看到有 降級規(guī)則,它指的就是『設(shè)置當(dāng)滿足什么條件時(shí),對服務(wù)進(jìn)行降級』
慢調(diào)用比例
如下配置:在一秒內(nèi),發(fā)5次請求,如果每次請求的響應(yīng)時(shí)間超過500毫秒,這種比例達(dá)到0.5(50%),就進(jìn)行熔斷,熔斷時(shí)長就是10秒。如:1秒內(nèi)有5次請求,其中有3次請求響應(yīng)時(shí)間超過了500毫秒,那么這個(gè)比例就是60%,大于50%,此時(shí)就熔斷,然后降級。
用jmeter測試,程序中當(dāng)id=1時(shí),每次響應(yīng)都是800毫秒。所以每次的請求都大于500毫秒,失敗率100%,這個(gè)時(shí)候去請求id=4的資源也是無法請求的,因?yàn)槿蹟嗔?#xff0c;所以也是直接降級。10s后再次請求id=4的就正常了。
異常數(shù)
如下配置:一秒內(nèi)發(fā)送5次請求,如果有3次失敗(異常),則直接熔斷,然后降級
測試:localhost:9527/perm?id=2,結(jié)果5次都失敗了,此時(shí)熔斷時(shí)長是9秒,在這9秒內(nèi),如果去請求id=4的依然是降級,9s之后試著去發(fā)送id=4的請求,如果通過則進(jìn)入閉合正常狀態(tài)。
異常比例
如下配置:1秒鐘發(fā)送5次請求,如果調(diào)用接口最終失敗的比例超過了20%,則熔斷9s。
#配置
spring:cloud:sentinel:eager: true #取消Sentinel控制臺懶加載
blockhandler fallback,blockhandler 優(yōu)先級高
}catch (Exception ex){ }
}
if(id==2){throw new RuntimeException();
}
return permService.getPermsById(id);
}
4.熔斷規(guī)則在 sentinel-dashboard 上你可以看到有 降級規(guī)則,它指的就是『**設(shè)置當(dāng)滿足什么條件時(shí),對服務(wù)進(jìn)行降級**』[外鏈圖片轉(zhuǎn)存中...(img-QwfGPW1A-1694490781354)]#### 慢調(diào)用比例如下配置:在一秒內(nèi),發(fā)5次請求,如果每次請求的響應(yīng)時(shí)間超過500毫秒,這種比例達(dá)到0.5(50%),就進(jìn)行熔斷,熔斷時(shí)長就是10秒。如:1秒內(nèi)有5次請求,其中有3次請求響應(yīng)時(shí)間超過了500毫秒,那么這個(gè)比例就是60%,大于50%,此時(shí)就熔斷,然后降級。[外鏈圖片轉(zhuǎn)存中...(img-d74m5bKk-1694490781357)] 用jmeter測試,程序中當(dāng)id=1時(shí),每次響應(yīng)都是800毫秒。所以每次的請求都大于500毫秒,失敗率100%,這個(gè)時(shí)候去請求id=4的資源也是無法請求的,因?yàn)槿蹟嗔?#xff0c;所以也是直接降級。10s后再次請求id=4的就正常了。#### 異常數(shù)如下配置:一秒內(nèi)發(fā)送5次請求,如果有3次失敗(異常),則直接熔斷,然后降級[外鏈圖片轉(zhuǎn)存中...(img-URgCSfH7-1694490781358)] 測試:localhost:9527/perm?id=2,結(jié)果5次都失敗了,此時(shí)熔斷時(shí)長是9秒,在這9秒內(nèi),如果去請求id=4的依然是降級,9s之后試著去發(fā)送id=4的請求,如果通過則進(jìn)入閉合正常狀態(tài)。#### 異常比例如下配置:1秒鐘發(fā)送5次請求,如果調(diào)用接口最終失敗的比例超過了20%,則熔斷9s。[外鏈圖片轉(zhuǎn)存中...(img-bYCdjt00-1694490781358)] ```yaml
#配置
spring:cloud:sentinel:eager: true #取消Sentinel控制臺懶加載
```blockhandler fallback,blockhandler 優(yōu)先級高