从零开始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

发布了88 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35946969/article/details/105475307