零、系列
歡迎來嫖從零開始SpringCloud Alibaba電商系列:
- 從零開始SpringCloud Alibaba電商系統(一)——Alibaba與Nacos服務註冊與發現
- 從零開始SpringCloud Alibaba電商系統(二)——Nacos配置中心
- 從零開始SpringCloud Alibaba電商系統(三)——Sentinel流量防衛兵介紹、流量控制demo
- 從零開始SpringCloud Alibaba電商系統(四)——Sentinel的fallback和blockHandler
- 從零開始SpringCloud Alibaba電商系統(五)——Feign Demo,Sentinel+Feign實現多節點間熔斷/服務降級
- 從零開始SpringCloud Alibaba電商系統(六)——Sentinel規則持久化到Nacos配置中心
一、Sentinel爲什麼需要規則持久化?
規則
:限流規則、降級規則等。
Sentinel Client
:存在於每一個微服務系統的client,用於保存本系統的規則。
Nacos配置中心
:一個遠程的,可存儲數據的地方。
理解了上述概念後,我們再來看Sentinel規則的創建方式,有如下三種:
-
通過API的FlowRuleManager.loadRules方法。
這種創建方式,是在某一系統啓動的過程中,調用一個init方法,在改方法中我們硬編碼了規則,故規則直接被加載在本地,也就是本地的Sentinel Client。
顯然,該系統每一次重啓都會重新加載規則。 -
Dashboard。
在之前的示範中,我們知道可以直接在Dashboard頁面去配置規則,這種方式顯然是在Dashboard端修改規則後推送到了對應系統的本地Sentinel Client。
即:
顯然,dashboard沒有保存規則,一旦Order系統或Product系統重啓,之前配置的規則就會丟失。 -
通過DataSource適配不同的數據源去修改,即規則持久化,這纔是保證規則可動態更新且不丟失的解決方案,這裏就貼一個官方的圖吧,比我畫的好看。。
二、Nacos配合Sentinel
簡述步驟:Nacos保存json格式的Sentinel規則,配置本地服務拉取Nacos中的規則。
正常來說應該是用代碼生產規則的json,然後上傳至Sentinel,不過我們知道json規則的話,自然也是可以直接去寫文件的。
- 配置pom.xml。
<!--1.7.2爲當前最新版-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.7.2</version>
</dependency>
- 配置Order項目。
# sentinel nacos 相關配置
spring.cloud.sentinel.datasource.ds.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds.nacos.dataId=${spring.application.name}-sentinel
spring.cloud.sentinel.datasource.ds.nacos.groupId=mall:order
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow
- 在Nacos控制檯增加配置規則,我這裏對前文配置的/test方法進行限流,QPS方式限流爲2,即1秒內只能訪問2次。
[
{
"resource": "/test",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
屬性簡單介紹:
resource:資源名,即限流規則的作用對象
limitApp:流控針對的調用來源,若爲 default 則不區分調用來源
grade:限流閾值類型(QPS 或併發線程數);0代表根據併發數量來限流,1代表根據QPS來進行流量控制
count:限流閾值
strategy:調用關係限流策略
controlBehavior:流量控制效果(直接拒絕、Warm Up、勻速排隊)
clusterMode:是否爲集羣模式
- Order項目配置一個數據源init類,用於項目啓動時加載Nacos配置中心存儲的規則。
package com.lele.mall.config;
import java.util.List;
import com.alibaba.cloud.sentinel.SentinelProperties;
import com.alibaba.cloud.sentinel.datasource.config.NacosDataSourceProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
@Configuration
public class DataSourceInitFunc {
@Autowired
private SentinelProperties sentinelProperties;
@Bean
public DataSourceInitFunc init() throws Exception {
sentinelProperties.getDatasource().entrySet().stream().filter(map -> {
return map.getValue().getNacos() != null;
}).forEach(map -> {
NacosDataSourceProperties nacos = map.getValue().getNacos();
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(
nacos.getServerAddr(), nacos.getGroupId(), nacos.getDataId(),
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
});
return new DataSourceInitFunc();
}
}
- 測試。在頁面快速訪問test接口:http://localhost:8081/test?name=123,發現兩次之後就會被堵塞降級。
再到dashboard查看一下/test資源的規則。
規則已經從nacos配置中心顯示到了sentinel dashboard控制檯,持久化配置成功!
三、Demo地址
https://github.com/flyChineseBoy/lel-mall/tree/master/mall06