上一篇部落格講了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)