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

通过前面:

服务容错的必要性与Spring Cloud Alibaba Sentinel 限流配置实战

Spring Cloud Alibaba Sentinel 熔断降级策略实战

两篇关于如何使用 Sentinel 的介绍,我们已经知道如何从 Sentinel 控制台配置限流、熔断规则,但是实际操作的过程中你会发现,每次项目重启后,配置的限流规则都没有了!

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

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

前面我已经整过 Nacos数据持久化 相关的内容,详见:

Nacos的数据持久化

本文将演示如何持久化 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微服务项目

本章代码仓库:https://github.com/iweidujiang/spring-cloud-alibaba-lab

示例模块:05-sentinel-nacos-datasource,服务名 sentinel-nacos-service。

沿用前面章节的案例思路,在微服务模块中增加内容:将 Sentinel 流控规则放到 Nacos 配置中心进行持久化。

在 Nacos 中配置流控规则

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

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

然后点击发布即可。

完整 JSON 示例见仓库 05-sentinel-nacos-datasource/config/sentinelFlowRule.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 数据源

首先,需要引入相关依赖包(模块 05-sentinel-nacos-datasource/pom.xml):

xml 复制代码
<parent>
    <groupId>io.github.iweidujiang</groupId>
    <artifactId>spring-cloud-alibaba-lab</artifactId>
    <version>1.0.0</version>
</parent>

<artifactId>05-sentinel-nacos-datasource</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    <!-- 引入 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>
</dependencies>

然后,配置 application.yml :

yaml 复制代码
server:
  port: 7072

spring:
  application:
    name: sentinel-nacos-service

  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER:127.0.0.1:8848}
    sentinel:
      transport:
        dashboard: ${SENTINEL_DASHBOARD:localhost:8080}
        port: 8721
      web-context-unify: false
      datasource:
        flow:
          nacos:
            server-addr: ${NACOS_SERVER:127.0.0.1:8848}
            groupId: DEFAULT_GROUP
            dataId: sentinelFlowRule.json
            rule-type: flow

management:
  endpoints:
    web:
      exposure:
        include: '*'

TIP: 本地开发默认连接 127.0.0.1:8848 的 Nacos;若使用 Nacos 集群,可通过环境变量 NACOS_SERVER 指定地址。

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

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

json 复制代码
[
  {
    "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 中写两个资源:

java 复制代码
package io.github.iweidujiang.lab05.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Sentinel 流控规则测试接口,规则从 Nacos 配置中心加载。
 *
 * @author 苏渡苇
 */
@RestController
public class RuleTestController {

    /**
     * getUser 资源。
     *
     * @return 响应内容
     */
    @GetMapping("/getUser")
    @SentinelResource("getUser")
    public String getUser() {
        return "getUser success!";
    }

    /**
     * getOrder 资源。
     *
     * @return 响应内容
     */
    @GetMapping("/getOrder")
    @SentinelResource("getOrder")
    public String getOrder() {
        return "getOrder success!";
    }
}

OK,至此就可以验证了。

验证限流规则

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

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

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

当正常访问时:

快速刷新应该会限流:

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

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

小结

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

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

点个赞再走吧~

本次导航结束。

先赞后看,养成习惯。

举手之劳,赞有余香。


本文创作于 2022-08-04 。

代码仓库已更新:https://github.com/iweidujiang/spring-cloud-alibaba-lab

相关推荐
沐欣工作室_lvyiyi几秒前
基于SpringBoot的博物馆预约系统设计与实现(论文+源码)
java·spring boot·后端·计算机毕业设计
这个DBA有点耶10 分钟前
MySQL字符集与排序规则深入:索引失效的隐蔽场景与排查方法
数据库·mysql·代码规范
zl_dfq11 分钟前
Redis 之 【持久化 与 事务】
数据库·redis
闲云自留地1 小时前
从下载到登录:MySQL 在两大系统上的完整安装教程
数据库·mysql
SelectDB技术团队1 小时前
Apache Doris 高性能 Open Lake Variant 读写技术解析(含对比数据)
数据结构·数据库·clickhouse·日志·apache doris·selectdb·湖仓架构升级
一 乐1 小时前
博客管理系统|基于springboot + vue博客管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕设
茉莉玫瑰花茶2 小时前
GO [ 类型 ]
开发语言·数据库·golang
凤山老林2 小时前
Spring Boot DDD 分层架构落地:领域模型、聚合根与事件驱动的业务实战
java·spring boot·架构
ClouGence2 小时前
开源数据库管理工具 CloudDM 4.3.0 发布,支持 SQL 收藏,多数据源语法支持大幅增强
数据库·oracle·sql server