SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储
前言
sentinel 原生版本的规则管理通过api 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境。不过官方也提供了一种 push模式,扩展读数据源readabledatasource
,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 nacos、zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。这里我们通过配置 nacos 来实现流控规则的统一存储配置。
架构
控制台推送规则至配置中心,客户端通过监听事件从配置中心获取流控规则。
客户端配置
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> 流控规则</a> </li>
如图所示,界面会多了一个回到单机页面的按钮,这里我们新增一个流控规则。
登录 nacos 后台,配置管理->配置列表:
点击进入配置详情,配置内容如下:
[{ "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