6-CloudAlibaba-Sentinel(规则持久化)学习笔记2020.10.25

36 篇文章 2 订阅
13 篇文章 0 订阅

6-CloudAlibaba-Sentinel(规则持久化)学习笔记2020.10.25

前言: (官网动态规则)

之前我们学习配置的规则都是临时的, 只要微服应用重启后, 规则就消失了, 需要重新配置。

这样服务多了只后, 后续麻烦的事情会越来越多, 下面进行配置Push 模式规则持久化解决规则是临时的问题。

规则管理及推送

一般来说,规则的推送有下面三种模式:

推送模式说明优点缺点
原始模式API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource简单,无任何依赖不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
Pull 模式扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等简单,无任何依赖;规则持久化不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
Push 模式扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。规则持久化;一致性;快速引入第三方依赖

1.0 将规则持久化配置进Nacos的配置中心

1.1 引入依赖

 <!--SpringCloud ailibaba sentinel-datasource-nacos  sentinel规则持久化-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

1.2 application.yml配置文件中配置nacos数据源配置

server:
  port: 8080
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 119.xx.xx.xxx:8848 # Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8090 # 配置Sentinel dashboard地址
        port: 8719
      datasource:
        # 名称随意 (但见名思意最好)
        flow:
          nacos:
            server-addr: 119.xx.xx.xx:8868
            dataId: ${spring.application.name}-flow-rules #默认 Nacos 适配的 dataId约定
            groupId: SENTINEL_GROUP #默认 Nacos 适配的groupId约定
            ## 规则类型,取值见: org.springframework.cloud.alibaba.sentinel.datasource.RuleType
            rule-type: flow
        degrade:
          nacos:
            server-addr: 119.xx.xx.xx:8868
            dataId: ${spring.application.name}-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade
        param-flow:
          nacos:
            server-addr: 119.xx.xx.xx:8868
            dataId: ${spring.application.name}-param-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: param-flow

1.3 控制台改造 (官网)

控制台改造主要是为规则实现,需要修改源码,从https://github.com/alibaba/Sentinel/releases 地址下载源码,进入sentinel-dashboard目录进行修改

从 Sentinel 1.4.0 开始,我们抽取出了接口用于向远程配置中心推送规则以及拉取规则:

  • DynamicRuleProvider: 拉取规则
  • DynamicRulePublisher: 推送规则
1.3.1 修改pom.xml文件【sentinel-dashboard模块下】

C:\Users\Administrator\Desktop\Sentinel-1.8.0\Sentinel-1.8.0\sentinel-dashboard

中的pom.xml文件, 去掉范围 <scope>test</scope>

		<!-- for Nacos rule publisher sample -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <scope>test</scope>
        </dependency>
1.3.2 提取出相关的类

找到sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目录,将整个目录拷贝到 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXEZbTKE-1603695589612)(https://s1.ax1x.com/2020/10/26/BnYqBQ.jpg)]

1.3.3 需在 FlowControllerV2 中指定对应的 bean 即可开启 Nacos 适配

然后只需在 FlowControllerV2 中指定对应的 bean 即可开启 Nacos 适配。前端页面需要手动切换,或者修改前端路由配置(sidebar.html 流控规则路由从 dashboard.flowV1 改成 dashboard.flow 即可,注意簇点链路页面对话框需要自行改造)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Io2x3SYO-1603695589616)(https://s1.ax1x.com/2020/10/26/Bntb26.jpg)]

默认 Nacos 适配的 dataId 和 groupId 约定如下:

  • groupId: SENTINEL_GROUP
  • 流控规则 dataId: {appName}-flow-rules,比如应用名为 appA,则 dataId 为 appA-flow-rules

用户可以在 NacosConfigUtil 修改对应的 groupId 和 dataId postfix。用户可以在 NacosConfig 配置对应的 Converter,默认已提供 FlowRuleEntity 的 decoder 和 encoder。

1.3.4 修改前端路由配置(sidebar.html)

修改: 文件路径位于sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html

sidebar.html 流控规则路由从 dashboard.flowV1 改成 dashboard.flow 即可,注意簇点链路页面对话框需要自行改造

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heROmymW-1603695589619)(https://s1.ax1x.com/2020/10/26/Bndede.jpg)]

自此,流控规则更改为Push持久化,其他规则等照修改

1.3.5 修改簇点链路页面对话框

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4xG7z7Mx-1603695589623)(https://s1.ax1x.com/2020/10/26/Bn0wrV.jpg)]

1.3.6 application.yml配置文件增加nacos地址参数与后台进行读取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zCouFe50-1603695589625)(https://s1.ax1x.com/2020/10/26/BnBaJH.jpg)]

1.3.7 重新编译打包

回到项目C:\Users\Administrator\Desktop\Sentinel-1.8.0\Sentinel-1.8.0主目录(有pom.xml),执行 mvn clean package -Dmaven.test.skip=true

在项目的 target 目录找到sentinel-dashboard.jar ,执行 java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

参考了: https://www.cnblogs.com/fx-blog/p/11726189.html

1.4 进行重启微服应用测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZCB1lQl-1603695589627)(https://s1.ax1x.com/2020/10/26/Bn5UzV.jpg)]

上面配置完成后, 重启应用规则还是存在会生效的。

但是只配置了限流的持久化。

扩展:

1.0 增加降级持久化

在修改好的控制台源码包仿造DegradeController, 配置一个DegradeControllerV2

1.1 重写一个DegradeControllerV2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DeYDLeI2-1603695589630)(https://s1.ax1x.com/2020/10/26/BuVlC9.jpg)]

1.2 增加DegradeRuleNacosProvider提供者与发布者DegradeRuleNacosPublisher

@Component("degradeRuleNacosProvider")
public class DegradeRuleNacosProvider implements DynamicRuleProvider<List<DegradeRuleEntity>> {

    @Autowired
    private ConfigService configService;
    @Autowired
    private Converter<String, List<DegradeRuleEntity>> converter;

    @Override
    public List<DegradeRuleEntity> getRules(String appName) throws Exception {
        								修改生成配置中心的文件名
        String rules = configService.getConfig(appName + NacosConfigUtil.DEGRADE_DATA_ID_POSTFIX,
            NacosConfigUtil.GROUP_ID, 3000);
        if (StringUtil.isEmpty(rules)) {
            return new ArrayList<>();
        }
        return converter.convert(rules);
    }
}
 //------------------------------------------------------------------------------------
@Component("degradeRuleNacosPublisher")
public class DegradeRuleNacosPublisher implements DynamicRulePublisher<List<DegradeRuleEntity>> {

    @Autowired
    private ConfigService configService;
    @Autowired
    private Converter<List<DegradeRuleEntity>, String> converter;

    @Override
    public void publish(String app, List<DegradeRuleEntity> rules) throws Exception {
        AssertUtil.notEmpty(app, "app name cannot be empty");
        if (rules == null) {
            return;
        }
        										//修改生成配置中心的文件名
        configService.publishConfig(app + NacosConfigUtil.DEGRADE_DATA_ID_POSTFIX,
            NacosConfigUtil.GROUP_ID, converter.convert(rules));
    }
}

1.4 添加Converter<List<DegradeRuleEntity>, String>转换器

@Configuration
public class NacosConfig {
	
	
	@Value("${spring.cloud.config.nacos.server-addr}")
    private String serviceAddr;
	

    @Bean
    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter<List<DegradeRuleEntity>, String> degradeEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
        return s -> JSON.parseArray(s, FlowRuleEntity.class);
    }

    @Bean
    public Converter<String, List<DegradeRuleEntity>> degradeRuleEntityDecoder() {
        return s -> JSON.parseArray(s, DegradeRuleEntity.class);
    }

    @Bean
    public ConfigService nacosConfigService() throws Exception {
      //return ConfigFactory.createConfigService("localhost");
        return ConfigFactory.createConfigService(serviceAddr);
    }
}

1.5 NacosConfigUtil 增加常量名

public static final String DEGRADE_DATA_ID_POSTFIX = "-degrade-rules";

1.6 进行启动控制台进行测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pz8bQtat-1603695589632)(https://s1.ax1x.com/2020/10/26/Bue5n0.jpg)]

在次进行重启应用后进行测试规则还是存在。

个人学习配置的demo

1

也可以使用阿里云提供的在线托管Sentinel控制台:AHAS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值