sentinel1.8规则持久化【nacos篇】

写在前面

在1.8版本之前就已经支持规则持久化了,并且支持几种模式,这里就不一一赘述了,网上博客一搜一大片。这里只重点讲述一下1.8版本持久化sentinel规则到nacos。

示例代码

https://gitee.com/Pitta-Brachyura/sentinel-nacos.git

注意事项

sentinel持久化需要下载sentinel-dashboard源码,在源码上进行修改。

规则持久化
Dashboard规则持久化
  1. 点击前往GitHub下载sentinel-dashboard源码
  2. 建议单独创建一个项目,并把sentinel-dashboard模块copy到新建项目中[可跳过本步骤]
  3. 添加依赖sentinel-dashboard自带依赖,但是<scope>域是test,删除或注释即可
		<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
  1. 找到test工程下com.alibaba.csp.sentinel.rule.nacos查看nacos持久化源码,因为这个持久化仅支持限流规则的持久化,所以并不打算直接copy过去直接用。
    在这里插入图片描述

  2. 找到main工程下com.alibaba.csp.sentinel.rule下创建nacos包。[最终如下图]
    在这里插入图片描述

  3. 创建DynamicRuleEnums用于规则工厂

import dpi.cloud.ms.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
import dpi.cloud.ms.sentinel.dashboard.datasource.entity.rule.*;

/**
 * @author tangzedong.programmer@gamil.com
 * @apiNote
 * @since 2020/9/21 19:51
 */
public class DynamicEnums {

    public enum Type {
        Nacos("nacos");
        private String name;

        Type(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }

    public enum Rule {
        FLOW(FlowRuleEntity.class, "flow"),
        DEGRADE(DegradeRuleEntity.class, "degrade"),
        SYSTEM(SystemRuleEntity.class, "system"),
        AUTHORITY(AuthorityRuleEntity.class, "authority"),
        PARAM_FLOW(ParamFlowRuleEntity.class, "param-flow"),
        GATEWAY_FLOW(GatewayFlowRuleEntity.class, "gw-flow");
        private Class entityClass;
        private String key;

        Rule(Class entityClass, String key) {
            this.entityClass = entityClass;
            this.key = key;
        }

        public <T> Class<T> getEntityClass() {
            return entityClass;
        }

        public String getKey() {
            return key;
        }
    }
}
  1. 创建DynamicConstantsDynamicConfigUtil读取yml中的配置文件
public interface DynamicConstants {
    String CONFIG = "spring.cloud.sentinel.datasource.{rule}.{type}.{property}";

    String SERVER_ADDR = "server-addr";
    String DATA_ID = "data-id";
    String GROUP_ID = "group-id";
    String RULE_TYPE = "rule-type";
    String DATA_TYPE = "data-type";
}


public final class DynamicConfigUtil {

    public static String getProperty(Environment environment, DynamicEnums.Type type, DynamicEnums.Rule rule, String property) {
        return environment.getProperty(DynamicConstants.CONFIG
                .replace("{type}", type.getName())
                .replace("{rule}", rule.getKey())
                .replace("{property}", property));
    }
}
  1. 修改DynamicRuleProvider.getRulesDynamicRulePublisher.publish规则[看到源代码就知道怎么改了,就不详细的把整个列的代码贴出来了]
/**
 * 修改规则,增加规则枚举参数
 */
T getRules(String appName, DynamicEnums.Rule rule) throws Exception;
 
 /**
 * 修改规则,增加规则枚举参数
 */
void publish(String app, T rules, DynamicEnums.Rule rule) throws Exception;
  1. 创建DynamicRuleNacosProviderDynamicRuleNacosPublisher实现上述接口
@Component("DynamicRuleNacosProvider")
public class DynamicRuleNacosProvider<T> implements DynamicRuleProvider<List<T>> {

    @Autowired
    private ConfigService configService;
    @Autowired
    private Environment environment;

    @Override
    public List<T> getRules(String appName, DynamicEnums.Rule rule) throws Exception {
        String rules = configService.getConfig(
                DynamicConfigUtil.getProperty(environment, DynamicEnums.Type.Nacos, rule, DynamicConstants.DATA_ID),
                DynamicConfigUtil.getProperty(environment, DynamicEnums.Type.Nacos, rule, DynamicConstants.GROUP_ID),
                3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return JSONArray.parseArray(rules, rule.getEntityClass());
    }
}

@Component("DynamicRuleNacosPublisher")
public class DynamicRuleNacosPublisher<T> implements DynamicRulePublisher<List<T>> {

    @Autowired
    private ConfigService configService;
    @Autowired
    private Environment environment;

    @Override
    public void publish(String app, List<T> rules, DynamicEnums.Rule rule) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        configService.publishConfig(
                DynamicConfigUtil.getProperty(environment, DynamicEnums.Type.Nacos, rule, DynamicConstants.DATA_ID),
                DynamicConfigUtil.getProperty(environment, DynamicEnums.Type.Nacos, rule, DynamicConstants.GROUP_ID),
                JSON.toJSONString(rules));
    }
}
  1. 代码逻辑就已经修改完毕,增加yml或者property配置
spring:  
  cloud:
    sentinel:
      nacos-addr: ${ip}:${poer}      
      nacos-group-id: dpi-cloud-dev
      data-type: json
      datasource:
        flow:
          nacos:
            server-addr: ${spring.cloud.sentinel.nacos-addr}
            data-id: ${spring.application.name}-${spring.cloud.sentinel.datasource.flow.nacos.rule-type}-rules
            group-id: ${spring.cloud.sentinel.nacos-group-id}
            # 规则类型,取值见:org.springframework.cloud.alibaba.sentinel.datasource.RuleType
            rule-type: flow
            data-type: ${spring.cloud.sentinel.data-type}
        degrade:
          nacos:
            server-addr: ${spring.cloud.sentinel.nacos-addr}
            data-id: ${spring.application.name}-${spring.cloud.sentinel.datasource.degrade.nacos.rule-type}-rules
            group-id: ${spring.cloud.sentinel.nacos-group-id}
            rule-type: degrade
            data-type: ${spring.cloud.sentinel.data-type}
        system:
          nacos:
            server-addr: ${spring.cloud.sentinel.nacos-addr}
            data-id: ${spring.application.name}-${spring.cloud.sentinel.datasource.system.nacos.rule-type}-rules
            group-id: ${spring.cloud.sentinel.nacos-group-id}
            rule-type: system
            data-type: ${spring.cloud.sentinel.data-type}
        authority:
          nacos:
            server-addr: ${spring.cloud.sentinel.nacos-addr}
            data-id: ${spring.application.name}-${spring.cloud.sentinel.datasource.authority.nacos.rule-type}-rules
            group-id: ${spring.cloud.sentinel.nacos-group-id}
            rule-type: authority
            data-type: ${spring.cloud.sentinel.data-type}
        param-flow:
          nacos:
            server-addr: ${spring.cloud.sentinel.nacos-addr}
            data-id: ${spring.application.name}-${spring.cloud.sentinel.datasource.param-flow.nacos.rule-type}-rules
            group-id: ${spring.cloud.sentinel.nacos-group-id}
            rule-type: param-flow
            data-type: ${spring.cloud.sentinel.data-type}
        gw-flow:
          nacos:
            server-addr: ${spring.cloud.sentinel.nacos-addr}
            data-id: ${spring.application.name}-${spring.cloud.sentinel.datasource.gateway-flow.nacos.rule-type}-rules
            group-id: ${spring.cloud.sentinel.nacos-group-id}
            rule-type: gw-flow
            data-type: ${spring.cloud.sentinel.data-type}
client端持久化
  1. 引入maven依赖,参考#dashboard持久化第3步[注:sentinel包本身需要引入,持久化则不额外说明]
  2. 增加yml配置,参考#dashboard持久化第11步
### 回答1: b'sentinel规则持久化nacos'的意思是将Sentinel规则持久化Nacos中,使得在规则发生变化时,可以自动同步至Nacos中,保证系统的稳定性和可靠性。这样做也便于管理和维护规则信息。 ### 回答2: Sentinel规则持久化是指将在Sentinel配置规则信息保存到外部存储器中,以便于在应用启动时,可以从外部存储器中加载规则,从而实现规则的自动化配置Nacos是一款开源的动态服务发现、配置管理和服务管理平台。它可以用于管理应用程序的配置信息、服务发现和服务注册。Sentinel是阿里巴巴开源的一款微服务框架。它可以用于在分布式系统中实现流量控制、熔断降级和系统负载保护等功能。 在分布式环境中,由于存在多个节点,这些节点之间需要共享配置信息和规则信息。传统的配置规则信息的管理方式比较繁琐,需要手动配置,而且容易出现人为错误。因此,将规则信息持久化Nacos中,可以实现自动化配置和管理,从而提高规则信息的管理效率和运维效率。 具体来说,Sentinel可以通过配置文件的方式将规则信息持久化Nacos中。首先需要在Nacos中创建一个配置集群,然后在Sentinel中进行配置,指定配置的数据源为Nacos。这样就可以将Sentinel中的规则信息保存到Nacos中。 在系统运行时,Sentinel可以从Nacos中加载规则信息,并根据规则信息对流量进行控制。如果规则信息发生变化,Sentinel也可以及时地更新规则信息。因此,利用Nacos持久化规则信息,可以实现规则的动态管理和自动化配置,提高系统的稳定性和可靠性。 总之,Sentinel规则持久化Nacos中,可以实现规则的自动化管理和动态配置。它具有管理效率高、运维效率高、稳定性好等优点。因此,在分布式环境中,将规则信息持久化Nacos中,是一种非常值得推广的做法。 ### 回答3: Sentinel规则持久化Nacos是为了让Sentinel控制台中配置规则在重启后仍能够保留,避免重启后规则丢失需要重新手动配置的问题。Nacos是一个开源的注册中心和配置中心,支持分布式场景下的服务注册、配置管理和服务发现。在Sentinel中,我们可以通过将规则持久化Nacos中来实现持久化的功能。 首先,我们需要在控制台中配置Nacos的相关信息,包括Nacos Server地址、Data ID和Group信息等。其中,Data ID和Group信息用于标识Sentinel规则的唯一性。 接下来,我们需要通过编写代码来实现将Sentinel规则持久化Nacos中。具体实现方式可以参考官方文档中提供的示例代码,主要包括以下几个步骤: 1. 创建Nacos配置管理客户端,可以通过NacosFactory.createConfigService()方法获取。 2. 将Sentinel规则序列化成JSON字符串,可以通过Jackson等工具实现。 3. 调用Nacos的API,将JSON字符串保存到Nacos中,例如使用configService.publishConfig()方法。 4. 在Sentinel应用启动时,需要从Nacos中读取保存的规则信息,并将其解析成Sentinel规则对象,例如使用configService.getConfig()方法获取Nacos中的配置信息,之后再调用SentinelRuleParser.parseRules()方法将其转换为Sentinel规则对象。 5. 在控制台中修改或删除规则时,需要通过调用Nacos的API来更新或删除相应的配置信息,例如使用configService.publishConfig()和cconfigService.removeConfig()方法实现。 通过以上步骤,我们就可以实现将Sentinel规则持久化Nacos中的功能,保证了应用重启后规则仍能够得到保留。同时,使用Nacos作为规则持久化的中心,还能够实现多节点之间的规则同步和分布式配置的管理。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值