Spring cloud微服务安全实战-6-11sentinel之配置持久化
规则的持久化问题。现在的规则都是在内存里的,我们要写一些代码来编一些规则。启动以后规则在内存里了。如果你配置里面有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的存储。
所以它只是在这里写了一堆接口
这里面就是需要的所有代码,在src/test/java/repository.metric目录下
在rule包下面建个zookeeper的包,然后把src/test/java/rue/zookeeper下的代码 都复制过来。
复制过去后,就报错了。有冲突 ,把下面的 删掉。
什么都不用改,直接把代码复制过去就可以了
找到FlowControllerV2
这里默认 注入了DynamicRuleProvider和DynamicRulePublisher
把我们刚才复制过来的实现类的名字复制过来
替换DuynamicRuleprovider
publisher的名字也复制过来。
这样他就会用实现类来和zookeeper通讯,保存数据了。
配置文件的修改
修改默认的端口为8082
左边菜单栏
流控规则的页面要修改。
把flowV1里面的V1去掉
启动测试
这个项目本身也是个SpringBoot的项目,启动,启动类
可以看到控制台 输出 zookeeper的日志
看一下sentinel 端口已经修改为8082
登陆进来后,现在是一个完全空的控制台。
注册orderAPI
手工写代码的规则,这里 我们去掉,不再用了。
dashboard的端口修改为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的数据源。
找到Sentinel DataSource Zookeeper
这里用1.5.2的版本
用这个1.5.2的版本
因为,starter-alibaba-sentinel里面用的是1.5.2的版本。这样我们就有了zookeeper的datasource依赖。
重新建立配置文件
这里不再编码去写配置规则了。而是在这里去配一下 ,让sentinel去zookeeper那里去读配置。
首先配置文件把基本信息配置一下。这个是我们自定义的配置。
zookeeper的地址。
path是说去zookeeper的哪里目录下读sentinel的规则。就是是我们之前在zookeeper里面看到的
path路径前面加斜线。
/sentinel_rule_config这个目录下面存了sentinel所有的应用的配置。所以我们要根据应用的名字去拼装出一个路径来。
这个类构造出来以后,马上就去读规则。加上这个注解,@PostConstruct
声明一个zookeeper的数据源。告诉它从这个数据源里面读就可以了。
ReadableDataSource前面的String是应用的名字,后面的List<FlowRule>是一组流量的规则。每个应用对应一组流量的规则,像一个Map一样。
用阿里巴巴的fastJson把读取过来的数据 转换成FlowRule类
FlowRuleManager就知道 从这个数据源 同步流控的规则。
启动测试
快速的多点击几次访问
后台日志。说明流控规则已经生效了。
流控法规则就是从zookeeper里面同步过来的。
总结
现在的代码 之改造了流控规则。这里只写了FlowRuleManager
降级的规则如果也要从zookeeper里面拿就要再写,DegradeRuleManager
现在sentinel和dashboard已经没有关系了。都和配置中心来通讯。
现在已经把所有的规则配置已经持久化到zookeeper里面,本节结束。
结束
Spring cloud微服务安全实战-6-11sentinel之配置持久化的更多相关文章
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
- Spring cloud微服务安全实战-6-4权限控制改造
授权,权限的控制 令牌里的scope包含fly就有权限访问.根据Oauth的scope来做权限控制, 要让@PreAuthorize生效,就要在启动类里面写一个注解. 里面有一个属性叫做,就是在方法的 ...
- Spring cloud微服务安全实战-6-2JWT认证之认证服务改造
首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递 ...
- Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)
授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. ord ...
随机推荐
- 60 分钟极速入门 PyTorch
2017 年初,Facebook 在机器学习和科学计算工具 Torch 的基础上,针对 Python 语言发布了一个全新的机器学习工具包 PyTorch. 因其在灵活性.易用性.速度方面的优秀表现,经 ...
- 实验3 SQL注入原理-万能密码注入
实验目的 (1)理解[万能密码]的原理 (2)学习[万能密码]的使用 实验原理 一.访问目标网站 1.选择一个存在漏洞的论坛 http://192.168.1.3:8009 进入 2.输入用户名[ad ...
- 使用kubeadm 新加入节点(原始token过期后)---转发
kubeadm join kubeadm init 安装完成后你会得到以下的输出,使用join指令可以新增节点到集群,此token 有效期为24小时 You should now deploy a p ...
- Python +appium 封装desired_caps模块
使用python+appium做android的自动化测试时,首先需要启动appium服务,然后连接上手机,配置如下: desired_caps = {"platformName" ...
- C++学习(1)—— 初识C++
1. 变量 作用:给一段指定的内存空间起名,方便操作这段内存空间 语法:数据类型 变量名称=变量初始值 #include<iostream> using namespace std; i ...
- datagrid中的排序
sortable的属性设置为true后就能看到标志 属性名称 属性值类型 描述 默认值 sortable boolean 如果为true,则允许列使用排序. undefined order strin ...
- object store in javascript
- CodeForces - 76F:Tourist (旋转坐标系,LIS)
pro:有一个驴友,以及给定N个表演地点xi和时间ti,驴友的速度不能超过V. 问他在起点为原点和不设置起点的情况下分别最多参观多少个表演. sol:BZOJ接飞饼见过:clari也在camp的DP专 ...
- Python中实现count(distinct )
假设一个表有6个字段c1,c2,c3,c4,c5,c6,有如下的sql语句: select c1,count(distinct(c6)) from tbl where c3>1 group by ...
- node爬虫爬取中文时乱码问题 | nodejs gb2312、GBK中文乱码解决方法
iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码. 老外写了一个通过纯Javascript转换编码的模块 i ...