目录
概述
sentinel没有提供规则持久化的线上实现,只是提供了实现思路。
除了api方式外,其他方案都需要添加比较多的代码修改,包括dashboard源码和应用。
为避免如此繁琐的行为,我采用了‘API+PUSH’的实现方案。
背景
sentinel提供的线上持久化方案
前往官网文档。
简述如下
API模式
PUSH模式
不足
使用API模式,应用服务器重启,规则即丢失。
使用PUSH模式,需要修改dashboard源码、添加应用端的自定义实现,个人认为比较繁琐。
我的思考
不希望规则丢失,不希望修改源码,不希望添加自定义实现。
基于这个目标,我采用API+PUSH混合方式实现sentinel zookeeper的持久化:
这种方式满足了"不希望规则丢失,不希望修改源码"。
对于“不希望添加自定义实现”,我采用spring autoconfig,将实现放到了单独的maven module中,这样以后就不用添加自定义实现,直接添加依赖即可。
实现原理
哪里实现PUSH?
com.alibaba.csp.sentinel.property.SentinelProperty#addListener
com.alibaba.csp.sentinel.property.DynamicSentinelProperty#updateValue
规则变更变更后,由listeners进行处理,我提供了服务PUSH的自定义listener。
如何保证所有应用实例都获取到数据?
- API模式
- 监听特定path,由zookeeper保证所有应用实例可获得到新数据。
如何避免规则被重复设置?
- 引入lockpath
- zookeeper保证,lockpath已存在则异常
- 延迟删除lockpath
简洁使用
- clone git地址的源码,mvn install
- 添加依赖
<dependency>
<groupId>com.chl.sentinel</groupId>
<artifactId>sentinel-zk-database</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 添加配置
sentinel:
datasource:
zk:
remoteAddress: ip:port
flowPath: /SENTINEL-RULE/projectName/FLOW-DATA
degradePath: /SENTINEL-RULE/projectName/DEGRADE-DATA
paramFlowPath: /SENTINEL-RULE/projectName/PARAMFLOW-DATA
systemPath: /SENTINEL-RULE/projectName/SYSTEM-DATA
authorityPath: /SENTINEL-RULE/projectName/AUTHORITY-DATA