實習中總結的sentinel的文檔
官方文檔:https://sentinelguard.io/zh-cn/docs/dashboard.html
1.特性
Sentinel 與 Hystrix 的對比
Sentinel | Hystrix | |
---|---|---|
隔離政策 | 基于并發數 | 線程池隔離/信号量隔離 |
熔斷降級政策 | 基于響應時間或失敗比率 | 基于失敗比率 |
實時名額實作 | 滑動視窗 | 滑動視窗(基于 RxJava) |
規則配置 | 支援多種資料源 | 支援多種資料源 |
擴充性 | 多個擴充點 | 插件的形式 |
基于注解的支援 | 即将釋出 | 支援 |
調用鍊路資訊 | 支援同步調用 | 不支援 |
限流 | 基于 QPS / 并發數,支援基于調用關系的限流 | 不支援 |
流量整形 | 支援慢啟動、勻速器模式 | 不支援 |
系統負載保護 | 支援 | 不支援 |
實時監控 API | 各式各樣 | 較為簡單 |
控制台 | 開箱即用,可配置規則、檢視秒級監控、機器發現等 | 不完善 |
常見架構的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
2、下載下傳使用
下載下傳sentinel控制台 jar包位址:https://ithub.com/alibaba/Sentinel/releases
通過java -jar啟動sentinel ,預設sentinel占用的端口是8080 ,如果有改端口需求則更改對應端口即可。這裡改為18080。
在jar包目錄下啟動指令行運作:
java -Dserver.port=18080 -jar sentinel-dashboard-1.8.0.jar
通路localhost:18080,打開本地控制台。
從 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登入功能,預設使用者名和密碼都是sentinel。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-xW7vtiQM-1628843889144)(sentinel demo文檔.assets/1628071038326.png)]
3、基礎配置
加入依賴管理和依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud-Alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--sentinel限流-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
</dependencies>
注意自己修改端口等對應的資訊,在這裡sentinel使用來自定義的18080端口
server:
port: 8080
spring:
application:
name: sentinel-demo
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:18080
eager: true
datasource:
ds1:
file:
file: classpath:flowrule.json
data-type: json
rule-type: flow
ds2:
file:
file: classpath:degraderule.json
data-type: json
rule-type: degrade
啟動類
@SpringBootApplication
public class SentinelMainApplication {
public static void main(String[] args) {
SpringApplication.run(SentinelMainApplication.class, args);
}
}
需要流控的Controller類,示例代碼
@RestController
public class DemoController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/resource")
@SentinelResource(value = "test-resource", blockHandlerClass = {ExceptionUtil.class}, blockHandler = "exHandler")
public String resource() {
return "resource";
}
}
啟動啟動類
需要注意的是sentinel是懶加載的機制,也意味着需要通路一些上面Controller中的 /hello才會在sentinel背景看到服務
浏覽器通路一下 http://localhost:8080//hello
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-3jmHhkX1-1628843889147)(sentinel demo文檔.assets/1628147140825.png)]
然後重新整理一下sentinel背景 http://localhost:18080/#/dashboard/home
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-dloDbuwH-1628843889148)(sentinel demo文檔.assets/1628128462977.png)]
出現了對/hello的監控。
4、項目結構
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-cWy7FtzQ-1628843889151)(sentinel demo文檔.assets/1628242834923.png)]
1.DemoController.java:用于測試url限流、關聯模式、按資源名稱限流
2.ConfigDemoController.java:測試檔案方式規則持久化
3.DegradeController:熔斷降級測試
4.ParamController.java,SecurityController.java:黑白名單功能測試
5.DemoUrlBlockHandler.java:攔截資訊自定義
6.ExceptionUtil.java:用于攔截資源請求的提示方法集合類
7.flowrule.json:存放本地流控規則
8.sentinel-dashboard-1.8.0.jar: sentinel控制台jar包。
5、流量控制
直接模式
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-IQWtgVwN-1628843889153)(sentinel demo文檔.assets/1628144441765.png)]
新增流量控制規則,對/hello端口進行流量控制,設定每秒最大通路次數2;這裡預設直接模式,快速失敗,其他模式選擇進階選項。
快速通路/hello,檢視結果。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-TlYGSSGw-1628843889155)(sentinel demo文檔.assets/1628144763772.png)]
系統預設的攔截資訊,也可以自定義:
config包下建立DemoUrlBlockHandler.java
@Component
public class DemoUrlBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
httpServletResponse.getWriter().println("flow is limiting");
}
}
關聯模式
新增流量控制規則,打開進階選項:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-xNWm5LiY-1628843889156)(sentinel demo文檔.assets/1628146026738.png)]
Controller包下DemoController 添加:
@GetMapping("/helloA")
public String helloA() {
return "helloA";
}
測試:
使用postman模拟密集通路/helloA接口,設定20個線程,每隔0.3秒通路一次。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-cQk90xHM-1628843889157)(sentinel demo文檔.assets/1628146750174.png)]
檢視關聯資源:/hello情況。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-4DZ40h00-1628843889158)(sentinel demo文檔.assets/1628146940863.png)]
說明:當關聯資源/helloA的QPS門檻值超過1時,就限制通路/hello。
鍊路模式
1、進入簇點鍊路下,檢視/hello的資源入口是 sentinel_spring_web_context ;
2、添加流控,配置鍊路入口資源為sentinel_web_servlet_context ;
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-1wySdvzA-1628843889159)(sentinel demo文檔.assets/1628148057148.png)]
3、當頻繁通路接口/hello時,發現報錯flow is limiting,表示被限流了。
按資源名稱限流
@SentinelResource注解:用于定義資源,并提供了AspectJ的擴充用于自動定義資源、處理BlockException等 ;
DemoController中加入以下代碼:
@GetMapping("/resource")
@SentinelResource(value = "test-resource", blockHandlerClass = {ExceptionUtil.class}, blockHandler = "exHandler")
public String resource() {
return "resource";
}
定義資源名稱:test-resource
按資源名稱添加流控規則:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-2LL5edzW-1628843889160)(sentinel demo文檔.assets/1628156027540.png)]
快速通路/resource:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-ZhkvQlyY-1628843889161)(sentinel demo文檔.assets/1628156111731.png)]
6、規則持久化
一旦我們重新開機應用,Sentinel規則将消失,生産環境需要将配置規則進行持久化 。
這裡使用本地檔案持久化規則。
1.添加yml配置:
datasource:
ds1:
file:
file: classpath:flowrule.json
data-type: json
rule-type: flow
2.resource下建立同名json儲存規則:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-u5wYhF4F-1628843889162)(sentinel demo文檔.assets/1628215679503.png)]
3.寫入規則:
[
{
"resource": "file-resource",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
},
{
"resource": "test-resource",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
- resource:資源名,即限流規則的作用對象
- count: 限流門檻值
- grade: 限流門檻值類型(QPS 或并發線程數)
- limitApp: 流控針對的調用來源,若為 default 則不區分調用來源
- strategy: 調用關系限流政策
- controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊)
4.啟動服務。打開控制台。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-jUt0xmV3-1628843889163)(sentinel demo文檔.assets/1628215759988.png)]
7、熔斷降級
建立DegradeController,産生異常進行測試。
public class DegradeController {
int i=0;
@GetMapping("/testD")
public String message1() {
i++;
// 異常比例為0.333
if (i % 3 == 0) {
throw new RuntimeException("模拟異常");
}
return "degrade is testing";
}
建立降級規則:
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-95ObZqvl-1628843889163)(sentinel demo文檔.assets/1628237532280.png)]
當異常比例大于0.25,每秒請求大于等于1;降級規則生效,熔斷時長10秒,10秒後恢複正常。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-NzCl9c70-1628843889164)(sentinel demo文檔.assets/1628237689067.png)]
與Hystrix的熔斷對比:
Hystrix常用的線程池隔離會造成線程上下切換的overhead比較大;Hystrix使用的信号量隔離對某個資源調用的并發數進行控制,效果不錯,但是無法對慢調用進行自動降級;
Sentinel通過并發線程數的流量控制提供信号量隔離的功能;此外,Sentinel支援的熔斷降級次元更多,可對多種名額進行流控、熔斷,且提供了實時監控和控制台,功能更為強大。
}
建立降級規則:
[外鍊圖檔轉存中...(img-95ObZqvl-1628843889163)]
當異常比例大于0.25,每秒請求大于等于1;降級規則生效,熔斷時長10秒,10秒後恢複正常。
[外鍊圖檔轉存中...(img-NzCl9c70-1628843889164)]
**與Hystrix的熔斷對比:**
Hystrix常用的線程池隔離會造成線程上下切換的overhead比較大;Hystrix使用的信号量隔離對某個資源調用的并發數進行控制,效果不錯,但是無法對慢調用進行自動降級;
Sentinel通過并發線程數的流量控制提供信号量隔離的功能;此外,Sentinel支援的熔斷降級次元更多,可對多種名額進行流控、熔斷,且提供了實時監控和控制台,功能更為強大。