1 Nacos 入門-配置中心-集羣
2 Sentinel 入門-限流-降級(一)
3 Sentinel 熱點規則-@SentinelResource-熔斷-持久化(二)
4 Seata從入門到實戰
1 Sentinel 簡介
隨着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
Sentinel 具有以下特徵:
- 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、消息削峯填谷、集羣流量控制、實時熔斷下游不可用應用等。
- 完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集羣的彙總運行情況。
- 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
- 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。
1.1 下載
https://github.com/alibaba/Sentinel/releases/tag/1.7.1
1.2 安裝
#上傳到linux服務器
nohup java -jar sentinel-dashboard-1.7.1.jar >sentinel.log 2>&1 &
#訪問端口8080
http://192.168.0.39:8080
#賬號密碼
sentinel sentinel
2 代碼
2.1 環境準備
192.168.0.39 sentinel nacos
2.2 創建工程
2.3 pom
<dependencies>
<!--sentinel nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--spring cloud alibaba-->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--devtools熱部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
</dependencies>
2.4 application.yml
server:
port: 9004
spring:
application:
name: sentinel
cloud:
nacos:
discovery:
server-addr: 192.168.0.39:8848
sentinel:
transport:
#配置sentinel地址,端口
dashboard: 192.168.0.39:8080
port: 8719
#客戶端IP
client-ip: 192.168.0.100
#暴露自己的端點
management:
endpoints:
web:
exposure:
include: '*'
2.5 controller
@RestController
@RequestMapping("/flow")
public class FlowLimitController {
@GetMapping("/a")
public String a(){
return "Hello a";
}
@GetMapping("/b")
public String b(){
return "Hello b";
}
}
2.6 主啓動類
@EnableDiscoveryClient
@SpringBootApplication
public class SentinelApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelApplication.class);
}
}
2.7 查看結果
(1) 什麼都沒有,sentinel採用懶加載需要訪問接口
(2) 訪問接口
http://localhost:9004/flow/a
http://localhost:9004/flow/b
3 流量控制
流量控制(flow control),其原理是監控應用流量的 QPS 或併發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峯沖垮,從而保障應用的高可用性。
FlowSlot 會根據預設的規則,結合前面 NodeSelectorSlot、ClusterNodeBuilderSlot、StatisticSlot 統計出來的實時信息進行流量控制。
限流的直接表現是在執行 Entry nodeA = SphU.entry(resourceName) 的時候拋出 FlowException 異常。FlowException 是 BlockException 的子類,您可以捕捉 BlockException 來自定義被限流之後的處理邏輯。
同一個資源可以創建多條限流規則。FlowSlot 會對該資源的所有限流規則依次遍歷,直到有規則觸發限流或者所有規則遍歷完畢。
一條限流規則主要由下面幾個因素組成,我們可以組合這些元素來實現不同的限流效果:
resource:資源名,即限流規則的作用對象
count: 限流閾值
grade: 限流閾值類型(QPS 或併發線程數)
limitApp: 流控針對的調用來源,若爲 default 則不區分調用來源
strategy: 調用關係限流策略
controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊)
3.1 流控模式
(1) 默認模式
快速訪問接口時:
(2) 關聯模式
當關聯的資源達到閾值時,就限流自己
例:當接口b達到qps時會使a無法訪問
postman測試:
在postman測試期間訪問a接口:
當postman測試完:
(3) Warm Up
Sentinel的Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即預熱/冷啓動方式。當系統長期處於低水位的情況下,當流量突然增加時,直接把系統拉昇到高水位可能瞬間把系統壓垮。通過"冷啓動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被壓垮。warm up冷啓動主要用於啓動需要額外開銷的場景,例如建立數據庫連接等。
默認 coldFactor爲3,即請求QPS從 threshold/3開始,經預熱時長逐漸升至設定的QPS閾值。
配置:a接口5秒後qps會達到10,開始qps爲3 (10/3)
開始快速訪問:
後續快速訪問:
(4) 排隊等待
勻速排隊,讓請求以均勻的速度通過,閥值類型必須設成QPS,否則無效。
設置含義: a接口每秒1次請求,超過的話就排隊等待,等待的超時時間爲5毫秒。
4 降級
4.1 降級規則介紹
(1) RT(平均響應時間,秒級)
平均響應時間,超出閾值且在時間窗口內通過的請求>=5,兩個條件同時滿足後觸發降級,窗口期過後關閉斷路器,RT最大4900(更大的需要通過- Dcspsentinel statistic maxrt=XX才能生效)。
(2) 異常比列(秒級)
QPS>=5且異常比例(秒級統計)超過閾值時,觸發降級;時間窗口結束後,關閉降級
(3)異常數(分鐘級)
異常數(分鐘統計)超過閾值時,觸發降級;時間窗口結束後,關閉降級
4.2 RT
(1) 在controller新建接口
@GetMapping("/c")
public String c(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello c";
}
(2) sentinel配置
平均響應時間爲200ms,如果200ms沒有響應並且qps>=5,在未來的1s內,保護該系統。
快速訪問接口c會出現下圖。
解釋:如果超過200ms還未處理完,在未來的1s內請求數大於5個,斷路器打開,服務不可用
1秒後訪問:
4.3 異常比例
(1) 修改controller
@GetMapping("/c")
public String c(){
int a=5/0;
return "Hello c";
}
(2) 修改sentinel,要求異常比例只能佔20%並且qps>=5保護該系統。
(3) 測試
4.4 異常數
(1) sentinel修改配置,一分鐘出現5次異常,70s後才能恢復。
(2) 5次後訪問
GITHUB
#分支:Sentinel-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-alibaba