天天看點

sentinel 學習文檔實習中總結的sentinel的文檔

實習中總結的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支援的熔斷降級次元更多,可對多種名額進行流控、熔斷,且提供了實時監控和控制台,功能更為強大。