Sentinel斷路器沒有半開狀態,所謂的半開狀態是指系統自動去檢測請求是否有異常,沒有異常就關閉斷路器恢復使用,有異常則繼續打開斷路器不可用。
<br/>
Sentinel熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級后,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行為是拋出`DegradeException`)。
<br/>
:-: 
**設置降級規則的地方**

**降級策略**
* 資源名:降級規則的作用對象,唯一名稱,默認為請求路徑。
下面演示降級策略的效果。
**1. RT(秒級平均響應時間)**
觸發RT降級需要同時滿足兩個條件:<mark>在1s時間內對同一個資源請求大于等于5次</mark>且<mark>在RT時間內如果還沒有將請求處理完</mark>,則會觸發RT降級。過了這1s,再過時間窗口(單位s)后方可取消RT降級。
<br/>
(1)降級規則:如果在1s時間內請求`/testC`的次數大于等于5,并且在RT(200ms)的時間內沒有將這1s內的請求處理完成,則觸發RT降級。只有過了這1s的時間后,再過時間窗口的4s時間才會取消RT降級。
:-: 
(2)設置處理一次`/testC`請求需要1s的時間。
```java
@RestController
public class FlowLimitController {
@RequestMapping("testC")
public String testC() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "testC 測試RT-------";
}
}
```
(3)演示效果:我用jmeter在1s的時間內向`/testC`請求10次(已經超過Sentinel設定的5次了),并且在上一步規定處理每個請求需要1s的時間,但是10次請求我總共只給了200ms的時間,根本就處理不了,所以會觸發RT降級,過了這1s,再過時間窗口的4s后才取消RT降級。

<br/>
**2. 異常比例**
觸發異常比例降級需要同時滿足兩個條件:<mark>在1s時間內對同一個資源請求大于等于5次</mark>且<mark>這1s時間內通過異常請求的比例大于設置的異常比例</mark>(異常比例范圍在`[0.0, 1.0]`,對應`[0%, 100%]`),則會觸發異常比例降級。過了這1s,再過時間窗口(單位s)后方可取消異常比例降級。
<br/>
(1)降級規則:如果在1s的時間內對`/testD`請求次數大于等于5,并且通過異常請求的比例大于設置的異常比例(0.2)則觸發異常比例降級,過了這1s后,再過時間窗口的4s才取消異常比例降級。

(2)設置通過異常請求的比例為100%。
```java
@RestController
public class FlowLimitController {
@RequestMapping("/testD")
public String testD() {
//除數不能為0,這里會發生異常的
//如果異常被try/catch捕獲不會觸發異常比例降級
int age = 10 / 0;
return "testD 測試異常比例降級-------";
}
}
```
(3)演示效果:我用jmeter在1s時間內向`/testD`發送10次請求(已經超過Sentinel設定的5次了),并且每次請求都發生異常,即通過異常請求的比例為100%,已經超過設置的異常比例0.2了,所以異常比例降級被觸發,當過了這1s,再過時間窗口的4s后,異常比例降級被取消。

<br/>
**3. 異常數**
觸發異常數降級的條件是:1min內對同一資源請求通過的異常次數大于設置的異常數,則會觸發異常數降級。從這1min內最后一次請求開始計算,過了時間窗口(單位s)后才取消異常數降級。
<br/>
異常數降級的時間窗口以min計算,所以設置的時間窗口小于60s的話,可能會導致已經被取消異常數降級后又自動觸發異常數降級。
<br/>
(1)降級規則:如果1min內對`/testE`請求通過的異常次數大于設置的異常數5,則觸發異常數降級。從這1min內的最后一次請求開始計算,過了時間窗口70s后異常數降級才被取消。

(2)`/testE`請求。
```java
@RestController
public class FlowLimitController {
@RequestMapping("/testE")
public String testE() {
//除數不能為0,這里會發生異常的
//如果異常被try/catch捕獲不會觸發異常比例降級
int age = 10 / 0;
return "testE 測試異常數降級";
}
}
```
(3)演示效果:在1min內向`/testE`發出超過5次請求,每次請求都發生異常,超過了設置的異常數5,異常數降級被觸發。從這1min內的最后一次請求開始計算,過了時間窗口70s后異常數降級才被取消。
- 微服務
- 微服務是什么?
- 微服務架構
- 微服務優缺點
- 微服務技術棧
- 微服務框架對比
- SpringCloud
- SpringCloud是什么
- SpringCloud與SpringBoot對比
- SpringCloud與Dubbo對比
- Rest微服務案例
- 總體介紹
- 父工程構建步驟
- 公共模塊構建步驟
- 服務端模塊構建步驟
- 消費端模塊構建步驟
- Eureka服務注冊與發現
- Eureka是什么
- Eureka原理
- Eureka注冊服務中心構建
- 向Eureka注冊已有微服務
- Eureka的自我保護機制
- Eureka服務發現
- Eureka集群配置
- Eureka與Zookeeper對比
- Ribbon負載均衡
- Ribbon是什么
- Ribbon負載均衡演示
- 構建服務端模塊
- 構建消費端模塊
- Ribbon核心組件IRule
- 自定義負載均衡策略
- Ribbon均衡策略優先級
- 輪詢策略算法
- OpenFeign負載均衡
- OpenFeign是什么
- 負載均衡演示
- 日志打印功能
- 導出功能
- Hystrix斷路器
- Hystrix是什么
- 服務熔斷
- Hystrix服務端構建
- 服務熔斷演示
- 服務熔斷類型
- HystrixProperty配置匯總
- 服務降級
- Hystrix客戶端構建
- 服務降級演示
- fallbackFactory
- 熔斷與降級
- 服務監控
- 網關服務Zuul
- Zuul是什么
- Zuul路由服務構建
- 設置訪問映射規則
- Config分布式配置中心
- Config分布式配置中心是什么
- Config服務端與Git通信
- Config客戶端獲取配置
- Config客戶端動態刷新
- Bus消息總線
- Bus消息總線是什么
- Bus消息總線原理
- 廣播通知設計思想
- 廣播通知演示
- 定點通知演示
- Stream消息驅動
- 為什么要引入Stream
- Stream消息驅動是什么
- Stream設計思想
- Stream流程和注解
- Stream案例演示
- 重復消費問題
- 消息持久化
- Sleuth分布式鏈路跟蹤
- Sleuth是什么
- 搭建鏈路監控
- SpringCloud Alibaba
- Nacos注冊與配置中心
- Nacos是什么
- 安裝并運行Nacos
- Nacos注冊中心
- 服務端入住Nacos
- 消費端入住Nacos
- Nacos負載均衡演示
- 服務注冊中心對比
- Nacos的AP和CP轉化
- Nacos配置中心
- 基礎配置演示
- Nacos分類配置
- Nacos集群搭建
- Sentinel實現熔斷與限流
- Sentinel是什么
- Sentinel環境搭建
- Sentinel監控微服務演示
- Sentinel流控規則
- 流量監控的作用
- 設置流控規則
- Sentinel降級規則
- 熔斷降級作用
- 設置降級規則
- Sentinel熱點限流
- 什么是熱點
- 設置熱點限流
- Sentinel系統限流
- @SentinelResource
- @SentinelResource屬性
- @SentinelResource限流演示
- @SentinelResource熔斷演示
- 規則持久化
- 熔斷框架比較
- Seata分布式事務
- 分布式事務問題
- Seata是什么
- Seata分布式事務過程
- Seata環境搭建
- 演示示例
- 業務說明
- 數據庫環境準備
- 微服務環境準備
- 測試
- Consul服務注冊與發現
- Consul是什么
- Consul能做什么
- 環境搭建
- Windows平臺
- 服務端入住Consul
- 消費端入住Consul
- 注冊中心對比
- Zookeeper服務注冊與發現
- Zookeeper是什么
- 環境搭建
- 服務端入住Zookeeper
- 消費端入住Zookeeper
- 網關服務Gateway
- Gateway是什么
- Gateway能做什么
- Gateway對比Zuul
- 三大核心概念
- Gateway工作流
- 環境搭建
- 網關路由配置方式
- 配置文件配置
- 代碼中配置
- 動態路由
- Predicate斷言
- 斷言是什么
- 常用斷言
- Filter過濾器
- 過濾器是什么
- 過濾器種類
- 自定義過濾器