欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

程序员文章站 2023-04-05 16:44:50
前言 Sentinel 原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境。不过官方也提供了一种 Push模式,扩展读数据源 ,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时 ......

SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

前言

sentinel 原生版本的规则管理通过api 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境。不过官方也提供了一种 push模式,扩展读数据源readabledatasource,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 nacos、zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。这里我们通过配置 nacos 来实现流控规则的统一存储配置。

架构

SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

控制台推送规则至配置中心,客户端通过监听事件从配置中心获取流控规则。

客户端配置

pom.xml 引入:

<dependency>
      <groupid>com.alibaba.csp</groupid>
      <artifactid>sentinel-datasource-nacos</artifactid>
      <version>1.6.3</version>
 </dependency>

配置文件:

# nacos的访问地址,配置参考 https://blog.52itstyle.vip/archives/4174/ 
spring.cloud.sentinel.datasource.ds.nacos.server-addr=47.104.187.19:8848
#nacos中存储规则的dataid,对于dataid使用了${spring.application.name}变量,这样可以根据应用名来区分不同的规则配置
spring.cloud.sentinel.datasource.ds.nacos.dataid=${spring.application.name}-flow-rules
#nacos中存储规则的groupid
spring.cloud.sentinel.datasource.ds.nacos.groupid=sentinel_group
#定义存储的规则类型
spring.cloud.sentinel.datasource.ds.nacos.rule-type=flow

控制台配置

修改 pom.xml,原来的<scope>test</scope>去掉:

<dependency>
      <groupid>com.alibaba.csp</groupid>
      <artifactid>sentinel-datasource-nacos</artifactid>
</dependency>

src/test 下面的包 com.alibaba.csp.sentinel.dashboard.rule.nacos 拷贝到src/main/java 下面。

修改 nacosconfig:

/**
 * @author eric zhao
 * @since 1.4.0
 */
@configuration
public class nacosconfig {

    @value("${nacos.address}")
    private string address;

    @bean
    public converter<list<flowruleentity>, string> flowruleentityencoder() {
        return json::tojsonstring;
    }

    @bean
    public converter<string, list<flowruleentity>> flowruleentitydecoder() {
        return s -> json.parsearray(s, flowruleentity.class);
    }

    @bean
    public configservice nacosconfigservice() throws exception {
        properties properties = new properties();
        properties.put("serveraddr",address);
        return configfactory.createconfigservice(properties);
    }
}

application.properties 配置引入 nacos:

# nacos的访问地址,配置参考 https://blog.52itstyle.vip/archives/4174/ 
nacos.address=47.104.197.19:8848

flowcontrollerv2 指定对应的 bean 开启 nacos 适配。

@autowired
@qualifier("flowrulenacosprovider")
private dynamicruleprovider<list<flowruleentity>> ruleprovider;
@autowired
@qualifier("flowrulenacospublisher")
private dynamicrulepublisher<list<flowruleentity>> rulepublisher;

修改sidebar.html页面, 流控规则路由从 dashboard.flowv1 改成 dashboard.flow

<-- nacos 动态规则配置-->
<li ui-sref-active="active" ng-if="!entry.isgateway">
      <a ui-sref="dashboard.flow({app: entry.app})">
      <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则</a>
</li>

如图所示,界面会多了一个回到单机页面的按钮,这里我们新增一个流控规则。

SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

登录 nacos 后台,配置管理->配置列表:

SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

点击进入配置详情,配置内容如下:

[{
    "app": "blog",
    "clusterconfig": {
        "fallbacktolocalwhenfail": true,
        "samplecount": 10,
        "strategy": 0,
        "thresholdtype": 0,
        "windowintervalms": 1000
    },
    "clustermode": false,
    "controlbehavior": 0,
    "count": 2.0,
    "gmtcreate": 1568617671812,
    "gmtmodified": 1568622253889,
    "grade": 1,
    "id": 6,
    "ip": "10.136.168.88",
    "limitapp": "default",
    "port": 8720,
    "resource": "blogview",
    "strategy": 0
}]

小结

生产环境下,推送规则正确做法应该是 配置中心控制台/sentinel 控制台 → 配置中心 → sentinel 数据源 → sentinel。

案例

参考

https://github.com/alibaba/sentinel

https://github.com/alibaba/sentinel/tree/master/sentinel-dashboard