從零開始SpringCloud Alibaba電商系統(六)——Sentinel規則持久化到Nacos配置中心

零、系列

歡迎來嫖從零開始SpringCloud Alibaba電商系列:

  1. 從零開始SpringCloud Alibaba電商系統(一)——Alibaba與Nacos服務註冊與發現
  2. 從零開始SpringCloud Alibaba電商系統(二)——Nacos配置中心
  3. 從零開始SpringCloud Alibaba電商系統(三)——Sentinel流量防衛兵介紹、流量控制demo
  4. 從零開始SpringCloud Alibaba電商系統(四)——Sentinel的fallback和blockHandler
  5. 從零開始SpringCloud Alibaba電商系統(五)——Feign Demo,Sentinel+Feign實現多節點間熔斷/服務降級
  6. 從零開始SpringCloud Alibaba電商系統(六)——Sentinel規則持久化到Nacos配置中心

一、Sentinel爲什麼需要規則持久化?

在這裏插入圖片描述
規則:限流規則、降級規則等。
Sentinel Client:存在於每一個微服務系統的client,用於保存本系統的規則。
Nacos配置中心:一個遠程的,可存儲數據的地方。

理解了上述概念後,我們再來看Sentinel規則的創建方式,有如下三種:

  1. 通過API的FlowRuleManager.loadRules方法。
    這種創建方式,是在某一系統啓動的過程中,調用一個init方法,在改方法中我們硬編碼了規則,故規則直接被加載在本地,也就是本地的Sentinel Client。
    顯然,該系統每一次重啓都會重新加載規則。

  2. Dashboard。
    之前的示範中,我們知道可以直接在Dashboard頁面去配置規則,這種方式顯然是在Dashboard端修改規則後推送到了對應系統的本地Sentinel Client。
    即:
    在這裏插入圖片描述
    顯然,dashboard沒有保存規則,一旦Order系統或Product系統重啓,之前配置的規則就會丟失。

  3. 通過DataSource適配不同的數據源去修改,即規則持久化,這纔是保證規則可動態更新且不丟失的解決方案,這裏就貼一個官方的圖吧,比我畫的好看。。在這裏插入圖片描述

二、Nacos配合Sentinel

簡述步驟:Nacos保存json格式的Sentinel規則,配置本地服務拉取Nacos中的規則。
正常來說應該是用代碼生產規則的json,然後上傳至Sentinel,不過我們知道json規則的話,自然也是可以直接去寫文件的。

  1. 配置pom.xml。
 <!--1.7.2爲當前最新版-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.7.2</version>
        </dependency>
  1. 配置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
  1. 在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:是否爲集羣模式
  1. 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();
	}
}


  1. 測試。在頁面快速訪問test接口:http://localhost:8081/test?name=123,發現兩次之後就會被堵塞降級。
    在這裏插入圖片描述
    再到dashboard查看一下/test資源的規則。
    在這裏插入圖片描述
    規則已經從nacos配置中心顯示到了sentinel dashboard控制檯,持久化配置成功!

三、Demo地址

https://github.com/flyChineseBoy/lel-mall/tree/master/mall06

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章