规则的持久化问题。现在的规则都是在内存里的,我们要写一些代码来编一些规则。启动以后规则在内存里了。如果你配置里面有sentinel的dashboard,有流量经过客户端的时候,它会把规则同步给Dashboard,同样的sentinel的dashboard页面上增加或者修改规则后。sentinel也会把规则推给相应的客户端,
我们之前在配置文件内配置了这个 sentinel的port。sentinel的客户端还会再起一个服务。一旦dashboard去改这个配置的时候,它就会调用客户端的服务把响应的配置推送过来
那么规则永远是在客户端的内存中的,同样sentinel的dashboard规则也是内存里面的。一旦dashboard或者客户端重启,这些变化过的规则就都消失了。
想要的效果是有一个远程的配置中心,这个配置中心可能是ZooKeeper或者是Nacos或者是阿波罗等,这些都是支持的。
要做两件事:
1.让sentinel的Dashboard知道,当我的配置规则变化的时候,我要把配置规则推到远程配置中心,然后把它持久化保存起来。
2.客户端也要做改造,客户端要知道我的配置规则都在远程配置中心存着,然后一旦有变化的时候,配置中心要推给我,我要能接收这个新的规则,来更新我自己的配置,
这样不管是Dashboard还是客户端他们重启后都不会丢掉现有的规则配置。
开始改造
来安装zookeeper,用其他的配置中心的话,步骤都是一样的,只是配置的细节不太一样,配置的东西也是一样的。zookeeper基本所有公司都在用,所以我们用这个最广泛的东西。
stable稳定版
现在这个最新的稳定版、
解压出来是这么个文件夹
进入conf文件
zoo_sample.cfg是一个样例的配置文件。
复制并改个名字
这里面是一些默认的配置,开始发的时候用这些默认的配置就可以了。
bin文件夹下有一些命令,因为我们已经有了配置的了。所以直接启动server就可以了。
这是已经子在跑了 ,表示已经启动过一次了。
把他停止
再start,这样就又启动起来了。
一旦启动起来,就可以用zkClient去连一下。默认的会连本机的端口, 好像是2181端口。
显示connected就表示连上 了。
改造sentinel的Dashboard
改造sentinel的Dashboard让它知道在编辑或者新建规则的时候,把这些规则都放到我刚才跑的zookeeper服务里面去。
把sentinel的源码下载下来。
用git客户端把源码下载到本地。把代码切到1.6的分支上去。
在开发工具内倒入,
代码里面有很多模块,我们值修改Dashboard
加载进来后第一步修改pom文件,有个zookeeper相关支持。
着迷默认配置的是test,打包的时候不会把依赖打进去。
把test注释掉。打包的时候真正把apache.curator打到项目里面去。它才能和zookeeper进行通讯。
其实和zookeeper通讯啊,保存规则的数据,然后从zookeeper读取数据,所有这些代码sentinel其实已经帮我们都写好了。只不过没有直接放在它的功能里面。因为它要同时支持好多种web的存储。
所以它只是在这里写了一堆接口
这里面就是需要的所有代码
在rule包下面建个zookeeper的包,然后把src/test/java/rue/zookeeper下的代码 都复制过来。
复制过去后,就报错了。有冲突 ,把下面的 删掉。
什么都不用改,直接把代码复制过去就可以了
注入了DynamicRuleProvider和DynamicRulePublisher
把实现的名字复制过来
publisher的名字也固执过来。
这样他就会用实现类来和zookeeper通讯,保存数据了。
配置文件的修改
修改默认的端口为8082
左边菜单栏
流控规则的页面要修改。
把flowV1里面的V1去掉
启动测试
这个项目本身也是个SpringBoot的项目,启动启动类
控制台 输出 zookeeper的日志
看一下sentinel 端口已经修改为8082
登陆进来后,现在是一个完全空的控制台。
注册orderAPI
手工写代码的规则,这里 我们去掉,不再用了。
端口修改为8082了
启动OrderAPI
给orderAPi流量才会在sentinel上显示,连续多点击几次。
现在应该是没有任何的限流规则的。所以都是成功的。
orderAPI已经注册过来了。流控规则现在是空的
新增流控规则
快速失败:直接拒绝掉请求
Warm Up:流量一点一点放大,
排队等待:在这等着,等流控流量有空了再把这个请求放过去,
这就有了一条createOrder资源的配置。
看下zookeeper里面的配置。zkCli.sh连进去。
根目录下的节点。sentinel_rule_config这个是sentinel默认在zookeeper上建的一个目录。sentinel所有的配置都是放在这个sentinel_rule_config节点下面的。
sentinel_rule_config下面有一个orderApi。这就说明我们刚才建的这个阵地orderApi的这个资源建的规则已经放到zookeeper里面。
把微服务都停一下。然后重启
我们已经在orderAPi里面没有写任何的规则了。规则都删了。
重新进去Dashboard
多点击几次访问,给它一点流量。
这个规则仍然在这里。规则不是在内存里面,也不是从客户端同步过来的,而是持久化在我们的zookeeper里面了。
sentinel控制台现在是和Dashboard连起来了。但是我的客户端也就是orderAPi它还没有和zookeeper连起来。
访问orderApi,快速的去点,仍然是所有的都是成功的,也就是客户端这里并没有限流,因为客户端并不知道,我要从zookeeper去接收规则。等于客户端现在还是一个没有任何规则的状态。我非常快的访问orderAPi也没有限流的效果。
改造客户端
让客户端去zookeeper拿规则。和zookeeper保持同步。
首先在pom.xml里面加依赖,让它知道我要根zookeeper通讯。
maven的仓库里面搜索sentinel的数据源。
用这个1.5.2的版本
因为,starter-alibaba-sentinel里面用的是1.5.2的版本。这样我们就有了zookeeper的datasource依赖。
重新建立配置文件
这里不再编码去写配置规则了。而是在这里去配一下 ,让sentinel去zookeeper那里去读配置。
首先配置文件把基本信息配置一下。
zookeeper的地址。
path是说去zookeeper的哪里目录下读sentinel的规则。就是是我们之前在zookeeper里面看到的
/sentinel_rule_config这个目录下面存了sentinel所有的应用的配置。所以我们要根据应用的名字去拼装出一个路径来。
这个类构造出来以后,马上就去读规则。@PostConstruct
声明一个zookeeper的数据源。告诉它从这个数据源里面读就可以了。
前面的String是应用的名字,后面的List<FlowRule>是一组流量的规则。每个应用对应一组流量的规则,像一个Map一样。
FlowRuleManager就知道 从这个数据源 同步流控的规则。
启动测试
快速的多点击几次访问
后台日志。说明流控规则已经生效了。
流控法规则就是从zookeeper里面同步过来的。
总结
现在的代码 之改造了流控规则。这里只写了FlowRuleManager
降级的规则如果也要从zookeeper里面拿就要再写,DegradeRuleManager
现在sentinel和dashboard已经没有关系了。都和配置中心来通讯。
现在已经把所有的规则配置已经持久化到zookeeper里面,本节结束。
结束