天天看點

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

上一篇部落格講了Sentinel一些概念性的東西 Spring Cloud Alibaba(9)---Sentinel概述

這篇部落客要講 Sentinel控制台搭建,和 整合SpringCloudAlibaba來實作流量控制、降級控制。至于其它比如熱點配置、系統規則和授權規則等

自己去官網詳細看,這裡就不叙述了。

一、Sentinel控制台搭建

1、下載下傳位址

官方有提供直接下載下傳位址,我們可以下載下傳自己需要的版本,我這邊下載下傳的版本是 1.8.0

https://github.com/alibaba/Sentinel/releases
           

2、啟動控制台

下載下傳之後我們發現就是一個jar包,我們就可以用jar的方式去啟動它

java -Dserver.port=8282 -Dcsp.sentinel.dashboard.server=localhost:8282 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
           

說明

這裡我通過 8282 端口來啟動它。

3、登陸控制台

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

重點

啟動之後通路 localhost:8282; 登入即可使用者名和密碼預設是

sentinel

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

登入之後看到左側的菜單隻有預設的一個;因為現在sentinel還沒有發現其他微服務,這樣一來Sentinel用戶端就搭建成功了,接下來開始整合SpringCloudAlibaba。

二、Sentinel整合SpringCloudAlibaba

這篇也是在之前搭建好的基礎上添加,這裡在mall-goods微服務上做示範

1、pom.xml

<!--引入sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
           

2、application.yml

spring:
  application:
    name: mall-goods
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8282
        port: 9999
           

3、SentinelTestController

這裡新增一個接口,來友善接下來測試限流、熔斷等。

@RestController
@RequestMapping("api/v1/sentinel")
public class SentinelTestController {

    private volatile int total = 0;
    
    @RequestMapping("test-sentinel")
    public Object findByGoodsId() {
        return total++;
    }
}
           

4、測試

這個是時候我們重新啟動 mall-goods微服務。重新開機之後我們發現Sentinel還是并沒有mall-goods服務,那是因為于

Sentinel是懶加載模式

,是以需要先通路上面這個接口後才會

在控制台出現。是以這裡我們通路下

http://localhost:6001/api/v1/sentinel/test-sentinel
           

通路之後我們再看控制台

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

我們可以看到控制台已經有 mall-goods 服務了。而且我們剛剛請求的接口這裡也有了。這說明Sentinel 預設會把接口直接當成一個資源。既然是這樣,接下來就對這個請求

進行流控、降級、授權、熱點等配置了;先來介紹如何添加流控吧。

三、流量控制規則及示例

概念

流量控制(flow control), 其原理是監控應用的QPS或并發線程數等名額,當達到指定的門檻值時對流量進行控制,以避免被瞬時的流量高峰沖垮,進而保障應用的高可用性。

流量控制官方文檔

https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
           

1、規則說明

點選+流控的按鈕,出現下面彈窗。

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

圖中一共有6個名詞

資源名

預設是請求路徑,可⾃定義

針對來源

對哪個微服務進⾏限流,預設是不區分來源,全部限流。這個是針對 區分上遊服務進⾏限流, ⽐ 如 商品服務 被 訂單服務、⽤戶服務調⽤,就可以針對來源進⾏限流。

門檻值類型

其實就是通過哪種方式限流,是通過QPS呢,還是通過線程數。他們的含義我這裡不在過多解釋了,具體可以看這篇文章。什麼是QPS,TPS,吞吐量

單機門檻值

很好了解,就是現在每秒QPS或者線程數達到這個數量就會限流。

舉例子

1)上面門檻值類型設定QPS,下面單機門檻值設定1。那組合的意思就是 每秒的請求數超過1會直接被限流。
2)上面門檻值類型設定線程數量,下面單機門檻值設定1。那組合的意思就是 當第一個線程未處理完成時,其他新開啟請求的線程都将被限流。
           

線程數稍微難了解點,這裡再通俗的解釋下 我們對一個接口資源 門檻值類型設定線程數量,下面單機門檻值設定1。這個接口方法内有2秒鐘的睡眠延遲,那麼,當第一個線程未

處理完成時(即2秒内),其他新開啟請求的線程都将被限流,隻有第一個未限流的線程成功處理,新的請求才會進來。

并發數控制⽤于保護業務線程池不被慢調⽤耗盡Sentinel 并發控制不負責建立和管理線程池,⽽是簡單統計目前請求上下⽂的線程數⽬(正在執⾏的調⽤數⽬)
如果超出門檻值,新的請求會被⽴即拒絕,效果類似于信号量隔離。并發數控制通常在調⽤端進⾏配置
           

流控模式

這裡有三種模式 直接 關聯 鍊路,這個這裡也不做過度解釋,具體看上面官方文檔。

流控效果

這裡也有三種:快速失敗、Warm Up 、排隊等待。具體也看上面官方文檔說明。

總結

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

2、測試

我這裡配置如下

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba
門檻值類型:QPS,單機門檻值:1,流控模式:直接,流控效果:快速失敗
           
Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

然後我們在來請求上面的接口

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

很明顯,如果一秒内有兩個請求就會限流。

四、降級規則說明及示例

除了流量控制以外,對調用鍊路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。

降級規則官方文檔

https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
           

1、規則說明

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

熔斷政策

Sentinel 提供以下幾種熔斷政策:慢調用比例、異常比例、異常數

慢調用比例:選擇以慢調用比例作為門檻值,需要設定允許的慢調用 RT(即最大的響應時間),請求的響應時間大于該值則統計為慢調用。

異常比例 :當機關統計時長内請求數目大于設定的最小請求數目,并且異常的比例大于門檻值,則接下來的熔斷時長内請求會自動被熔斷。

異常數 :當機關統計時長内的異常數目超過門檻值之後會自動進行熔斷。

熔斷降級規則說明

熔斷降級規則(DegradeRule)包含下面幾個重要的屬性:

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

2、測試

這裡添加如下規則配置

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

然後我們新增一個接口

@RequestMapping("test-sentinel-exception")
    public Object testSentinelException() {
        int i = (int) (Math.random() * 100);
        if(i>10){
            throw new NullPointerException("随機錯誤");
        }
        return "成功";
    }
           

測試

Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba

我們可以看出 當請求超過2次異常,那麼就會報熔斷的異常錯誤。有關其它的規則我這裡不在闡述了,具體的都可以看官網。

參考

1、分布式系統的流量防衛兵

少說多做,句句都會得到别人的重視;多說少做,句句都會受到别人的忽視。(10)