Sentinel 可以簡單的分為 Sentinel 核心庫和 Dashboard。核心庫不依賴 Dashboard,但是結合 Dashboard 可以取得最好的效果。
這篇文章主要介紹 Sentinel 引入和規則配置等使用方法。 我們說的資源,可以是任何東西,服務,服務里的方法,甚至是一段代碼。
因為Sentinel控制臺配置的規則是在內存中的,所以我們需要Nacos來存儲規則實現持久化。
本文主要分為四個部分:
- Sentinel代碼方式示例效果
- Sentinel控制臺安裝
- Springboot項目接入Sentinel控制臺配置規則
- 使用Nacos存儲規則并實時更新
Sentinel代碼方式示例效果
在講解如何使用nacos存儲規則之前,我們先來看下直接代碼定義規則和資源的使用方式,這部分不是本文重點。
Sentinel的使用步驟大致可以分為三步:
- 引入依賴
- 定義資源
- 定義規則
我們先來看下Sentinel文檔上的一段代碼。
1.引入依賴
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>
2.定義資源
public static void main(String[] args) {
// 配置規則.
initFlowRules();
while (true) {
// 1.5.0 版本開始可以直接利用 try-with-resources 特性,自動 exit entry
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保護的邏輯
System.out.println("hello world");
} catch (BlockException ex) {
// 處理被流控的邏輯
System.out.println("blocked!");
}
}
}
在這里我們定義了一個“HelloWorld”的資源,不斷打印hello world。
3.定義規則
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>(); //定義規則列表
FlowRule rule = new FlowRule(); //定義一個規則
rule.setResource("HelloWorld"); //什么資源應用此規則
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20); //沒秒只能20次請求
rules.add(rule);//加入該規則
FlowRuleManager.loadRules(rules); //載入規則列表
}
這里定義了資源“HelloWorld”每秒只能通過20個請求。
運行該main方法,可以看到控制臺輸出以下內容。
Sentinel代碼方式示例效果
可以看到請求通過20次打印hello world后再請求會阻塞打印blocked!,等到下一秒才會繼續打印hello world。
這是一個簡單的示例用于說明下Sentinel的作用,下面我們會介紹Sentinel控制臺的使用以及搭配Nacos存儲規則并實時更新規則。
Sentinel控制臺安裝
Sentinel控制臺提供web可視化頁面配置規則,我們需要下載官方提供的jar包安裝啟動該服務。
1.jar包下載
可以在官網github上下載:https://github.com/alibaba/Sentinel/releases
拉到每個版本信息區塊的最下方有jar文件的下載地址。
jar文件的下載地址
2.啟動腳本:
注意根據下載的jar包修改文件名
JAVA -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
啟動Sentinel控制臺
3.訪問Sentinel控制臺
地址和賬號密碼 http://localhost:8080 賬號:sentinel 密碼:sentinel
訪問Sentinel控制臺
訪問Sentinel控制臺
控制臺已經啟動完成,可以看到左邊首頁下面顯示了一個sentinel-dashboard的項目,項目包含了監控、鏈路、各種規則配置和機器列表等菜單可以管理該項目規則,如果有新項目連接到控制臺,這里會出現新的項目菜單。
springboot項目接入Sentinel控制臺配置規則
1.引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
注意我這里沒有寫版本,因為我在父項目的pom文件中指定了阿里巴巴的依賴版本,子項目的相關依賴會自動尋找版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.配置yml
接下去我們可以在項目中連接到該控制臺,這樣項目里的資源就可以被控制臺管理了。
spring:
Application:
name: sentinel
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080 #啟動本項目后需要請求一次才能向sentinel控制臺注冊
注意:啟動項目后需要請求一次項目才能向sentinel控制臺注冊。
啟動項目后我們請求一下項目隨便一個接口,然后在控制臺可以看到多了一個新項目的菜單了。
新項目的菜單
3.控制臺配置項目資源規則
我在項目里寫了一個簡單的接口如下:
@RequestMapping("/")
public String test(){
return "ok";
}
可以在控制臺的簇點鏈路菜單看到這個接口資源。
簇點鏈路菜單
可以看到表格右邊有四個按鈕,可以對該資源進行流控、降級、熱點、授權的配置。
- 流控
流量控制,可以在流控中設置主要三塊內容:閾值類型+閾值、流控模式、流控效果。
流控
閾值類型+閾值:可以設置QPS的閾值,代表每秒最多允許請求多少次資源;可以設置線程數,代表可以同時運行的線程數量。
流控模式:有直接、關聯、鏈路三種。
--直接:代表超過閾值直接限流
--關聯:代表關聯的資源達到閾值時也進行限流(比如支付接口不行了把下單接口也限流掉)。
--鏈路:代表當服務到達閾值時,所有使用該服務的服務也限流。
流控效果:有快速失敗、Warm Up、排隊等待三種。
--快速失敗:直接限流操作。
--Warm Up:冷啟動,需要配置預熱時長,意思是當突然有大量請求時慢慢的放一些請求通過,預熱時長過后恢復到正常限流狀態,達到閾值時再進行限流。
--排隊等待:讓限流的請求排隊等待系統空閑時再通過,需要配置超時時間,過了超時時間再拒絕請求。
- 降級
降級有慢調用比例、異常比例、異常數三種熔斷策略。
降級
--慢調用比例:需要設置最大RT(最大的響應時間)和比例閾值(0.0至1.0之間),請求大于最大RT的判定為慢調用,當慢調用比例到達比例閾值時進行熔斷降級。
--異常比例:需要設置一個比例閾值,當異常比例達到該閾值時進行熔斷降級。
--異常數:需要設置一個異常數,達到該異常數時進行熔斷降級。
降級需要設置一個熔斷時長和最小請求數,代表熔斷持續的時間,當大于最小請求數時降級規則才生效。
- 熱點
熱點即經常訪問的數據, 很多時候我們希望統計某個熱點數據中訪問頻次最高的 Top K 數據,并對其訪問進行限制。對請求中攜帶的參數進行判斷是否是熱點數據,是熱點數據則根據規則限流。需要設置參數所有和閾值,參數所有從0開始代表請求的第幾個參數是熱點參數。
- 授權
授權其實就是黑白名單的設置,黑名單模式代表黑名單里的不允許訪問,白名單模式代表白名單里的才允許訪問。需要設置對應的應用名稱。
4.示例配置
我們以流控操作來做個示例,我們在根請求接口的資源上配置一個流控規則。
示例配置
設置閾值類型為QPS,閾值為1,代表每秒只能通過1個請求。我們來看看效果。
瀏覽器請求接口,然后按F5不停刷新,可以看到每秒會出現一次返回一次正確信息,其他都會返回限流信息。
返回正確信息
返回限流信息
項目接入控制臺部分就講到這了,需要注意的是這里的控制臺配置是存在內存中的,如果你的項目重新啟動配置的規則就沒了,所以我們需要一個可以持久化配置規則的地方,接下去我們介紹下Nacos來持久化存儲Sentinel配置規則。
使用Nacos存儲規則并實時更新
Sentinel提供了多種數據源的支持,包括Nacos、Zookeeper、文件數據源等。
使用Nacos存儲需要先安裝Nacos,可以看我的另外一篇Nacos安裝教程文章。
1.引入Nacos依賴
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.配置Nacos數據源
安裝完Nacos后我們首先在項目中配置Sentinel的數據源為Nacos。
spring:
application:
name: sentinel
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:8080 #啟動本項目后需要請求一次才能向sentinel控制臺注冊
datasource:
ds2:
nacos:
server-addr: 192.168.67.129:8848
data-id: sentinel
group-id: Sentinel:Demo
data-type: json
rule-type: flow
ds2是數據源名稱,其他主要配置下:
- Nacos的地址
- data-id和group-id:等會需要在Nacos控制臺新增一個同樣的配置才能生效
- data-type:配置規則數據類型
- rule-type:flow代表流控類型
3.在Nacos控制臺配置規則內容
我們在Nacos控制臺的配置列表新增一個配置。
新增一個配置
新增一個配置
配置內容部分如下:
[
{
"resource": "/",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
resource:資源名,資源名是限流規則的作用對象
count:限流閾值grade:限流閾值類型,QPS 模式(1)或并發線程數模式(0)
limitApp:流控針對的調用來源
strategy:調用關系限流策略:直接、鏈路、關聯
controlBehavior:流控效果(直接拒絕/WarmUp/勻速+排隊等待),不支持按調用關系限流
clusterMode:是否集群限流
4.效果
啟動項目,配置好Nacos后,我們可以直接在Sentinel控制臺看到nacos的配置已經同步到Sentinel控制臺了,并且規則已經生效了,以后該規則只需要在Naocs配置規則就能實時生效了。
Nacos規則同步到Sentinel控制臺
需要注意的是,目前只支持Nacos規則同步到Sentinel控制臺,不支持在Sentinel控制臺配置規則同步到Nacos。
好了,今天的內容就講到這里了,希望本文對你有所幫助。