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 ...
随机推荐
- Cloudera Certified Associate Administrator案例之Test篇
Cloudera Certified Associate Administrator案例之Test篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备工作(将CM升级到&qu ...
- mysql备份脚本(基础版)
#!/bin/bash #authors misery # BAK_DIR=/home/web_code1/backup/mysql_backup/`date +%Y-%m-%d` MYSQL_CMD ...
- 动态域名作为dga的做法
https://wenku.baidu.com/view/54b1df373968011ca3009183.html dga算法 import time from ctypes import c_in ...
- SpringBoot启动流程及其原理
Spring Boot.Spring MVC 和 Spring 有什么区别? 分别描述各自的特征: Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等:但他们的 ...
- Unity点击播放卡死问题的解决
Unity项目使用了github for unity 插件,用来管理项目,结果安装完后Unity卡死在播放的界面,任务管理器中显示无响应. 经过排查后发现是 git for windows这个程序引起 ...
- git提交项目到已有库
借鉴地址:https://blog.csdn.net/jerryhanjj/article/details/72777618 Git global setup git config --global ...
- 《团队作业第三、四周》五阿哥小组Scrum 冲刺阶段---Day3
<团队作业第三.四周>五阿哥小组Scrum 冲刺阶段---Day3 一.项目燃尽图 二.项目进展 20182310周烔今日进展: 主要任务一览:界面布局的设计 20182330魏冰妍今日进 ...
- c#的参数调用
c#的参数传递有三种方式:值传递,和c一样,引用传递,类似与c++,但形式不一样输出参数,这种方式可以返回多个值,这种有点像c中的指针传递,但其实不太一样.值传递不细说,c中已经很详细了引用传递实例如 ...
- 学习:c++指向指针的指针(多级间接寻址)
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置. 当一个 ...
- LeetCode 935. Knight Dialer
原题链接在这里:https://leetcode.com/problems/knight-dialer/ 题目: A chess knight can move as indicated in the ...