在上一篇中 Spring Cloud for Alibaba 之 简单集成 Sentinel (4),我只是在Demo 里面,简单的引入了Sentinel组件,Dashboard控制台。
这些数据都是保存在内存中,一旦应用重启,之前配置的规则、监控数据 都会重置。
生产实践中,运用Sentinel ,要解决2个问题:1. 规则管理与推送 ,2. 监控数据的保存与展示。
因为资源问题(个人没有机器部署kafaka 与elasticsearch集群),本次主要展示规则管理。
一、 规则推送模式
官方推荐使用Push模式,将配置规则,存放在远程的配置中心,比如阿里的nacos,
具体为使用建议见官方wiki: 在生产环境中使用 Sentinel
规则流向为:配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel
如下图:
二、Sentinel 客户端改造
sentinel 接入nacos 存储比较方便,在 可以参考官方的另外 wiki:动态规则扩展
1. jar引入pom
我采用简单一点的方式,直接引入 spring-cloud-starter-alibaba-sentinel 与sentinel-datasource-nacos 组件
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>${sentinel.version}</version> </dependency>
2. 新增配置 文件
引入组件后,在bootstrap 配置文件(应该也可以将配置放入nacos,未实验),新增如下配置:
#sentinel 配置 spring.cloud: sentinel: transport: port: 7083 #本地端口,用于dashboard 推送规则 dashboard: 127.0.0.1:7070 # dashboard 控制台 datasource.ds.nacos: server-addr: ${nacos.server-address}:${nacos.port} #nacos地址,根据实际配置 dataId: ${spring.application.name}-flow-rules #规则配置 dataId 参见: dashboard 的 NacosConfigUtil.java 源码 groupId: SENTINEL_GROUP #规则的groupId 参见: dashboard 的 NacosConfigUtil.java 源码 rule-type: flow #规则类型
以上配置说明一下:
dataId: 建议以 ${spring.application.name}-flow-rules 模式, 如果是flow规则,后缀用 -flow-rules ,不同的ruleType,用不同的后缀,这个是 dashboard推送规则的时候定死的,建议与dashboard一致。
groupId: SENTINEL_GROUP 这个也是dashboard定的, 建议保持一致。
ruleType: 取值 可以见sentinel-datasource 的RuleType 枚举
每个ds 数据源只能配置一种规则, 如果多种规则,根据源码,应该是可以 配置多个ds,如ds1,ds2(这个后续用实际证实理论)
3. nacos 新增规则配置
配置好之后,我们再打开nacos,添加配置信息,如下:
dataId: order-demo-flow-rules
groupId: SENTINEL_GROUP
配置内容:
[ { "clusterMode": false, "controlBehavior": 0, "count": 2, "grade": 1, "resource": "/test/testProductByName/哈哈", "strategy": 0 } ]
4. 启动 应用,dashboard查看结果
启动Sentinel 应用,访问几次后,刷新dashboard 控制台,可以看到规则出现在控制台里面:
可以多次调用资源,查看限流确实生效了,在控制台修改、删除规则,虽然能生效,但是nacos上面配置时没有变动的,Sentinel应用重启后,还是使用nacos上的配置。
以上 操作,完成了: 配置中心控制台 → 配置中心 → Sentinel 数据源 → Sentinel 的数据流向,
已基本可以用于生产,只是有1个问题,就是每次手工,可能会出错 ,因此生产最好是 接入图形界面操作。
三、 Dashboard 控制台改造
目前Sentinel 的控制台,用于 生产还需要很多改造,官方对于改造的各种情况都提供了api 与范例,剩下的就是需要各位对开源做出贡献,去改造了!
控制台的改造 参考官方wikii :Sentinel 控制台(集群流控管理)
1. 下载源码,导入IDE
控制台改造,需要修改源码示范,我们先从github 上面下载源码,导入ide:Sentinel源码 https://github.com/alibaba/Sentinel
2. 修改pom,导入组件
Dashboard 是自带了需要的组件,只是被放入测试包目录。
找到sentinel-dashboard 模块的pom, 将 sentinel-datasource-nacos 的引用范围改成compile ,去掉 test 即好。
<!-- for Nacos rule publisher sample --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <!-- <scope>test</scope>--> </dependency>
3. 修改源码
源码有好几处地方需要修改:
a) 将 test 包下文件,剪贴至 java 目录。
test 下package 路径:com.alibaba.csp.sentinel.dashboard.rule.nacos ,下面一共有 FlowRuleNacosProvider、FlowRuleNacosPublisher、NacosConfig、NacosConfigUtil 四个文件。
b)如果nacos部署在本机,且端口号是默认的8848,则无需修改。否则需要根据实际,修改NacosConfig 代码
@Bean public ConfigService nacosConfigService() throws Exception { return ConfigFactory.createConfigService("localhost"); //如果不是本机,localhost可以修改为nacos地址,如:IP:端口 }
c) 修改 FlowControllerV2
将 ruleProvider、rulePublisher ,修改为flowRuleNacosProvider、flowRuleNacosPublisher,如下:
@Autowired @Qualifier("flowRuleNacosProvider") private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider; @Autowired @Qualifier("flowRuleNacosPublisher") private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
d) 修改 sidebar.html
将 dashboard.flowV1 改成dashboard.flow ,如下:
<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>
做了以上改动后,重新编译源码, 启动。
4、 启动,测试
启动后,我们应该就能从流控规则里面,看到对应的规则。
现在我们修改 阀值为 3,点击保存,查看nacos上面的配置如下:
[{"app":"order-demo","clusterMode":false,"controlBehavior":0,"count":3.0,"gmtModified":1566381446083,"grade":1,"id":14,"limitApp":"default","resource":"/test/testProductByName/哈哈","strategy":0}]
我们删除这个,然后重新建1个,再测试下:
新增加的配置如下:
[ { "app": "order-demo", "clusterConfig": { "fallbackToLocalWhenFail": true, "sampleCount": 10, "strategy": 0, "thresholdType": 0, "windowIntervalMs": 1000 }, "clusterMode": false, "controlBehavior": 0, "count": 1, "gmtCreate": 1566381613072, "gmtModified": 1566381613072, "grade": 1, "id": 15, "ip": "192.168.55.1", "limitApp": "default", "port": 7083, "resource": "/test/testProductById/123", "strategy": 0 } ]
新增加的配置,比之前通过nacos控制台 手写的,是增加了不少内容。
修改后,通过访问资源,可以 看到相关请求是被拦截了的。
四、 总结
以上通过dashboard 修改nacos配置,进入的路径为 流控规则 菜单进入。 从 簇点链路 菜单,右边流控按钮新增,是无法进入的,这个按钮依然访问的是 v1/flow/rules 路径。
对于降级、热点、授权、系统 等规则保存,可以参考上面的例子,自己去修改Dashboard 代码。
对于 数据的存储与展示,存储需要结合各自公司的大数据框架,展示也有结合公司的运维平台,对于一般的小公司,感觉需求不是太紧迫,毕竟保障系统稳定运行时第一位的。
得益于Sentinel的精心设计, 核心的源码比较少, 主要包括:Context、Node组织,滑动窗口算法,各种降级规则触发都比较简单,围绕核心源码周围代码比较多,例如心跳、接收dashboard命令
对于集群流量的Cluster 与Client 模式,感觉一般也用不到,目前还没遇到场景,需要对流量进行那么精确的控制,将需要精确控制的场景,用Sentinel 来实现,也不是一个好方案。
源码地址:https://github.com/xujianguo1/alicloud-demo release-tag:Sentinel-Config
欢迎评论,如有问题欢迎提出,一起探讨。