规则的持久化问题。现在的规则都是在内存里的,我们要写一些代码来编一些规则。启动以后规则在内存里了。如果你配置里面有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让它知道在编辑或者新建规则的时候,把这些规则都放到我刚才跑的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
登陆进来后,现在是一个完全空的控制台。
手工写代码的规则,这里 我们去掉,不再用了。
端口修改为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里面,本节结束。
Spring cloud微服务安全实战-6-11sentinel之配置持久化
原文:https://www.cnblogs.com/wangjunwei/p/11992786.html