控制台改造与zk接入
2019-10-23 本文已影响0人
lesline
sentinel-dashboard改造
控制台的规则推送是通过 [规则查询更改 HTTP API](https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E6%9F%A5%E8%AF%A2%E6%9B%B4%E6%94%B9%E8%A7%84%E5%88%99) 来更改规则。这也意味着这些规则*仅在内存态生效*,应用重启之后,该规则会丢失。建议通过 [动态规则](https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95) 并结合各种外部存储来定制自己的规则源。
我们推荐通过动态配置源的控制台来进行规则写入和推送,而不是通过 Sentinel 客户端直接写入到动态配置源中。在生产环境中,我们推荐*push 模式*,具体可以参考: [在生产环境使用 Sentinel](https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel) 。
注:若要使用集群流控功能,则必须对接动态规则源,否则无法正常使用。
Sentinel 同时还提供应用维度规则推送的示例页面(流控规则页面,前端路由为/v2/flow),用户改造控制台对接配置中心后可直接通过 v2 页面推送规则至配置中心。Sentinel 抽取了通用接口用于向远程配置中心推送规则以及拉取规则:
- DynamicRuleProvider<T>: 拉取规则(应用维度)
- DynamicRulePublisher<T>: 推送规则(应用维度)
用户只需实现DynamicRuleProvider和DynamicRulePublisher接口,并在 v2 的 controller 中通过@Qualifier注解替换相应的 bean 即可实现应用维度推送。我们提供了 Nacos 和 Apollo 的示例,改造详情可参考 应用维度规则推送示例 。
使用 ZooKeeper 配置规则
Sentinel 针对 ZooKeeper 作了相应适配,底层可以采用 ZooKeeper 作为规则配置数据源。使用时只需添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
<version>x.y.z</version>
</dependency>
然后创建
ZookeeperDataSource## 并将其注册至对应的 RuleManager 上即可。比如:
// remoteAddress 代表 ZooKeeper 服务端的地址
// path 对应 ZK 中的数据路径
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
详细示例可以参见 sentinel-demo-zookeeper-datasource 。
Sentinel/FlowRuleZookeeperProvider.java at master · alibaba/Sentinel · GitHub
实现原理
https://mp.weixin.qq.com/s/twMFiBfRawKLR-1-N-f1yw
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(address, digestAuthInfo, group,
flowRulePath,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
主要工作是监听zk中的消息,修改flowRules值
com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager#flowRules
- ZookeeperDataSource-> ReadableDataSource:数据源,用于监听数据变化,通知SentinelProperty
- FlowRuleManager:管理类,包含flowRules,用于限流,是操作的主题
- SentinelProperty :增加PropertyListener,触发Listener操作
- FlowPropertyListener->PropertyListener:接收监听消息后,更新flowRules
新增客户端
为了方便服务接入sentinel接入,主要功能是监听“zk的规则配置变更”消息。