Sentinel 规则持久化,基于Redis持久化【附带源码】
输入“/”快速插入内容
Sentinel 规则持久化,基于Redis持久化【附带源码】
上一篇讲Sentinel的时候,是用dashboard直接和服务进行交互,实时的新增/删除限流规则,所有的规则都存储在应用服务的内存中,每次重启服务之后再刷新dashboard就没有对应规则信息了。
这当然不是我们希望看到的,如果想要长久的保存规则,有且只有一个办法,那就是规则数据持久化。
一、理论
1.
既然dashboard可以把规则推送到服务端,那服务端就可以拿到规则去持久化到硬盘上(文件、MySQL...),怎么说呢?这看起来不是个好办法,首先它很low,其次也不好解决分布式系统数据一致性的问题。
2.
那换一种思路,dashboard先把规则推送给A,再由A把规则下发到各个具体的应用服务。这样A就相当于一种中心存储,解决了数据存储的问题,同时A实时下发给应用服务解决了数据一致性的问题。
这个A,官方给出了几种实现
Nacos、ZooKeeper、Apollo、Redis。(理论上是可以自己去重写做到任何实现)
第一种方式就不推荐了,下面基于方式二来做实践,这里选用Redis来,主要是目前电脑只安装了Redis,原理是一样的。
下面是官方给出的图,要理解,
是先把规则给到A,再由A去下发规则
。(所以需要修改dashboard源码,让它先请求A)
想深入了解的可以参看下面的文档:
1.
https://github.com/alibaba/Sentinel/wiki/
动态规则扩展
2.
https://github.com/alibaba/Sentinel/wiki/
在生产环境中使用-Sentinel
二、实践
基于上面的分析,需要分两步改造
1.
让dashboard把规则数据推送给Redis
2.
应用服务接受Redis的下发(基于Redis的发布订阅功能)
注:会在Redis定义一个Key用来存储最终的规则数据,还会定义一个通道用来实时推送规则数据
2-1、dashboard 请求Redis
从Github下载dashboard源码:
https://github.com/alibaba/Sentinel/releases
默认情况下,dashboard限流策略请求的是这个 v1 接口,官方还提供了一个 v2,这个v2就是持久化的接口,基于不同的持久化策略,只需要在 v2的版本里面替换对应的 DynamicRuleProvider、DynamicRulePublisher