上一篇博客講了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、登陸控制台

重點
啟動之后訪問 localhost:8282; 登錄即可用戶名和密碼默認是sentinel

登錄之后看到左側的菜單只有默認的一個;因為現在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
訪問之后我們再看控制台

我們可以看到控制台已經有 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、規則說明
點擊+流控的按鈕,出現下面彈窗。

圖中一共有6個名詞
資源名
默認是請求路徑,可⾃定義
針對來源
對哪個微服務進⾏限流,默認是不區分來源,全部限流。這個是針對 區分上游服務進⾏限流, ⽐ 如 商品服務 被 訂單服務、⽤戶服務調⽤,就可以針對來源進⾏限流。
閾值類型
其實就是通過哪種方式限流,是通過QPS呢,還是通過線程數。他們的含義我這里不在過多解釋了,具體可以看這篇文章。什么是QPS,TPS,吞吐量
單機閾值
很好理解,就是現在每秒QPS或者線程數達到這個數量就會限流。
舉例子
1)上面閾值類型設置QPS,下面單機閾值設置1。那組合的意思就是 每秒的請求數超過1會直接被限流。
2)上面閾值類型設置線程數量,下面單機閾值設置1。那組合的意思就是 當第一個線程未處理完成時,其他新開啟請求的線程都將被限流。
線程數稍微難理解點,這里再通俗的解釋下 我們對一個接口資源 閾值類型設置線程數量,下面單機閾值設置1。這個接口方法內有2秒鍾的睡眠延遲,那么,當第一個線程未
處理完成時(即2秒內),其他新開啟請求的線程都將被限流,只有第一個未限流的線程成功處理,新的請求才會進來。
並發數控制⽤於保護業務線程池不被慢調⽤耗盡Sentinel 並發控制不負責創建和管理線程池,⽽是簡單統計當前請求上下⽂的線程數⽬(正在執⾏的調⽤數⽬)
如果超出閾值,新的請求會被⽴即拒絕,效果類似於信號量隔離。並發數控制通常在調⽤端進⾏配置
流控模式
這里有三種模式 直接 關聯 鏈路,這個這里也不做過度解釋,具體看上面官方文檔。
流控效果
這里也有三種:快速失敗、Warm Up 、排隊等待。具體也看上面官方文檔說明。
總結

2、測試
我這里配置如下

閾值類型:QPS,單機閾值:1,流控模式:直接,流控效果:快速失敗

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

很明顯,如果一秒內有兩個請求就會限流。
四、降級規則說明及示例
除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。
降級規則官方文檔
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
1、規則說明

熔斷策略
Sentinel 提供以下幾種熔斷策略:慢調用比例、異常比例、異常數
慢調用比例:選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大於該值則統計為慢調用。
異常比例 :當單位統計時長內請求數目大於設置的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。
異常數 :當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。
熔斷降級規則說明
熔斷降級規則(DegradeRule)包含下面幾個重要的屬性:

2、測試
這里添加如下規則配置

然后我們新增一個接口
@RequestMapping("test-sentinel-exception")
public Object testSentinelException() {
int i = (int) (Math.random() * 100);
if(i>10){
throw new NullPointerException("隨機錯誤");
}
return "成功";
}
測試

我們可以看出 當請求超過2次異常,那么就會報熔斷的異常錯誤。有關其它的規則我這里不在闡述了,具體的都可以看官網。
參考
少說多做,句句都會得到別人的重視;多說少做,句句都會受到別人的忽視。(10)