0
点赞
收藏
分享

微信扫一扫

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化

  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 详细入门
  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 基本流控规则
  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则
  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 熔断降级规则
  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 热点限流规则
  • 微服务系列:Sentinel 之 @SentinelResource 配置详解

在经过上面这一系列的文章学习后,我们对 Sentinel 学习也即将进入尾声,不出意外的话,这篇将会结束对 Sentinel 的学习,后面也可能会有新的相关文章,但那都是后话了。

Sentinel 的学习过程中,大家肯定注意到了一个问题,每次重启服务或者重启 Sentinel 控制台时,之前控制台中配置的各种规则都会消失,需要重新配置。本文就对这些规则的持久化进行一些探讨。

话不多说,开始今天的学习。

一、概述

Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则:

  • 通过 API 直接修改 (loadRules)
  • 通过 DataSource 适配不同数据源修改

通过 API 直接修改:这个就是直接修改代码中定义的规则。

通过 DataSource 适配不同数据源:可以整合动态配置系统,如ZooKeeperNacosApollo、Redis 等,动态地实时刷新配置规则。

DataSource 扩展常见的实现方式有:

  • 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
  • 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

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

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

二、文件配置规则

Sentinel支持通过本地文件加载规则配置,使用方式如下(限流规则作为演示)

1. 配置文件

spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          file:
            file: classpath:flowRule.json
            data-type: json
            rule-type: flow

2. flowRule.json

flowRule.json对应com.alibaba.csp.sentinel.slots.block.flow.FlowRule各属性。放在了项目中的 resource 目录下

[
  {
    "resource": "testA",
    "count": 2,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "controlBehavior": 0
  }
]

3. 测试接口

@GetMapping("/testA")
@SentinelResource(value = "testA", blockHandler = "handleException")
public String testA(){
    return "testA....";
}

public String handleException(BlockException exception){
    return "{\"code\":\"500\",\"msg\": \"" + "服务流量控制处理\"}";
}

4. 启动测试

启动项目,在控制台的流控规则下就读取到了文件中配置的这个规则

image-20220202141143595

也可以正常限流

image-20220202141232053

重启项目后,规则并不会消失。


上面这种配置方式,只是保证了规则的持久化,并不能动态的推送规则,如需动态推送规则,还需做一些额外的配置: 在生产环境中使用 Sentinel · alibaba/Sentinel Wiki · GitHub

三、Nacos配置规则

1. 添加依赖

<!-- springcloud alibaba nacos config -->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- sentinel datasource nacos -->
<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2. Nacos 控制台定义限流策略

[
  {
    "resource": "testA",
    "count": 3,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0,
    "controlBehavior": 0
  }
]

Nacos 控制台新增配置并发布

image-20220202143346639

3. 配置文件

spring:
  application:
    # 应用名称
    name: cloud-sentinel
  cloud:
    nacos:
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml
    sentinel:
      # 取消控制台懒加载
      eager: true
      transport:
        # sentinel 控制台地址
        dashboard: 127.0.0.1:8718
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: sentinel-ezhang-system
            data-type: json
            rule-type: flow

4.启动测试

启动项目,在控制台的流控规则下就读取到了 Nacos 配置的这个规则

image-20220202144233593

限流正常

image-20220202144332164

此时,我们修改 Nacos 中的这个配置

image-20220202144416561

点击发布,观察 Sentinel 控制台,读取到了最新的配置。

image-20220202144455191

但是,如果我们在 Sentinel 控制台修改此流控规则,却并不会同步到 Nacos 中。

从 Sentinel 1.4.0 开始,Sentinel 控制台提供 DynamicRulePublisherDynamicRuleProvider 接口用于实现应用维度的规则推送和拉取,并提供了相关的示例。Sentinel 提供应用维度规则推送的示例页面(/v2/flow),用户改造控制台对接配置中心后可直接通过 v2 页面推送规则至配置中心。改造详情可参考 应用维度规则推送示例。

四、其他

至此,Sentinel 相关技术文章我也学习好几篇了,其他的肯定还有东西没学到,目前就先学习到这里吧。

其他的 Ribbon、Feign整合Sentinel & 服务的熔断降级

举报

相关推荐

0 条评论