写点什么

将 Sentinel 熔断限流规则持久化到 Nacos 配置中心

  • 2023-02-28
    湖南
  • 本文字数:2474 字

    阅读完需:约 8 分钟

在实际操作的过程中你会发现,每次项目重启后,配置的限流规则都没有了!


这是因为,在 Sentinel DashBoard 上配置的规则只存在缓存中,当项目重启,这些规则自然就消失了。


实际生产环境中,我们是不允许这种情况存在的,那么如何进行 Sentinel 配置规则的持久化呢?Sentinel 提供多种不同的数据源来持久化规则配置,包括 File ,Redis 、Nacos 、ZooKeeper 等。


本文将演示如何持久化 Sentinel 规则到 Nacos 中

Nacos 配置中心配置持久化规则

将 Sentinel 规则持久化到 Nacos 中保存,只要请求了某个微服务的资源,Sentinel 控制台的规则就能感应到,同时只要 Nacos 里面的配置不删除,针对该微服务上资源的 Sentinel 流控规则就持续有效。


只要实现了 Nacos 和 Sentinel 之间的通信,就能从持久化的 Nacos 中获取 Sentinel 流控规则。


Tips: 在 Nacos 控制台上修改流控制,虽然可以同步到 Sentinel Dashboard,但是 Nacos 此时应该作为一个流控规则的持久化平台。正常操作过程应该是我们在 Sentinel Dashboard 上修改流控规则后同步到 Nacos ,但是目前并不能从 Sentinel Dashboard 配置完之后主动同步到 Nacos —— 需要我们在 Nacos 配置中心配置限流/熔断等 Sentinel 规则。

集成到 Spring Cloud Alibaba 微服务项目

沿用前面文章的案例,在微服务项目 cloud-sentinel-service 中,增加内容:将 Sentinel 流控规则放到 Nacos 配置中心进行持久化。

在 Nacos 中配置流控规则

进入到 Nacos 控制台,进入到 配置管理 新建一个配置文件:


接下来输入 dataId , 文件类型选择 json :


然后点击发布即可。


这里需要说明一下,具体的规则怎么配,配置项的含义说明:

流量控制规则(FlowRule)

  • resource :资源名,资源名是限流规则的作用对象,比如请求资源 getUser 。

  • grade :限流阈值类型,QPS 或线程数模式。0 表示线程数,1 表示 QPS。默认为 1,即 QPS 模式

  • count :限流阈值。比如值为 2 表示 1 秒超过 2 个请求就限流。

  • strategy :流控模式:直接、链路、关联,默认 直接 。0 表示直接,1 表示关联,2 表示链路。

  • controlBehavior :流控效果(直接拒绝 / 排队等待 / 慢启动模式),0 表示快速失败,1 表示 Warm Up,2 表示排队等待。

  • limitApp :流控针对的调用来源。默认就是 default ,代表不区分调用来源.


熔断降级规则 (DegradeRule)

  • resource :资源名,资源名是限流规则的作用对象,比如请求资源 getUser 。

  • grade :熔断策略,支持慢调用比例/异常比例/异常数策略。1:慢调用比例,2:异常比例,3:异常数。默认为 1,慢调用比例。

  • count :慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值。

  • timeWindow :熔断时长,单位为秒。

  • minRequestAmount :熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断。默认为 5 。

  • statIntervalMs :统计时长(单位为 ms),如 60*1000 代表分钟级。默认为 1000 ms。

  • slowRatioThreshold :慢调用比例阈值,仅慢调用比例模式有效


Tip:同一个资源可以同时有多个降级规则。

Spring Cloud Alibaba 微服务项目中设置 Sentinel 数据源

首先,需要引入相关依赖包:

<!-- 引入 Sentinel 数据源 --><dependency>    <groupId>com.alibaba.cloud</groupId>    <artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId></dependency><!-- Sentinel数据源之 Nacos --><dependency>    <groupId>com.alibaba.csp</groupId>    <artifactId>sentinel-datasource-nacos</artifactId></dependency>
复制代码

然后,配置 application.yml :

server:  port: 7072
spring: application: name: cloud-sentinel-service
cloud: nacos: discovery: server-addr: 192.168.242.112:81 sentinel: transport: dashboard: localhost:8080 port: 8719 # https://github.com/alibaba/Sentinel/issues/1213 web-context-unify: false datasource: nacos: nacos: serverAddr: 192.168.242.112:81 groupId: DEFAULT_GROUP dataId: sentinelFlowRule.json ruleType: flow
management: endpoints: web: exposure: include: '*'
复制代码

增加了配置项: spring.cloud.sentinel.datasource ,配置项指定了数据源为 Nacos,并且配置 Nacos 的 IP 地址以及 dataId 等。


根据前面在 Nacos 配置的流控规则:

[  {    "resource": "getUser",    "limitApp": "default",    "grade": 1,    "count": 2,    "strategy": 0,    "controlBehavior": 0,    "clusterMode": false  },  {    "resource": "getOrder",    "limitApp": "default",    "grade": 1,    "count": 2,    "strategy": 0,    "controlBehavior": 0,    "clusterMode": false  }]
复制代码

该规则说明:

资源 getUser 和 getOrder 的限流类型是 1:QPS,限流阈值时 2,即当 1 秒大于 2 个请求就进行限流,限流策略时直接,流控效果是直接拒绝。


下面在 Controller 中写两个资源:

@GetMapping("/getUser")@SentinelResource("getUser")public String getUser() {    return "getUser success!";}
@GetMapping("/getOrder")@SentinelResource("getOrder")public String getOrder() { return "getOrder success!";}
复制代码

OK,至此就可以验证了。

验证限流规则

当我们访问 /getUser 和 /getOrder 后,Sentinel DashBoard 会自动出现流控规则:


这和在 Nacos 中配置的规则一致。


根据限流规则,访问请求资源测试:


当正常访问时:


快速刷新应该会限流:


这样就表示限流了,规则生效!


PS:这样的限流直接返回了 500 错误,这里我先填一个坑,下次再说如何优雅的进行限流和降级。

小结

生产环境中,我们可以将 Sentinel 限流规则、熔断规则等配置到 Nacos 中进行持久化。


规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,使用 Nacos 配置中心有更好的实时性和一致性保证。


作者:行百里 er

链接:https://juejin.cn/post/7127817180728524830

来源:稀土掘金

用户头像

还未添加个人签名 2021-07-28 加入

公众号:该用户快成仙了

评论

发布
暂无评论
将 Sentinel 熔断限流规则持久化到 Nacos 配置中心_Java_做梦都在改BUG_InfoQ写作社区