Spring Cloud微服务架构Sentinel数据双向同步
作者:Java白羊 发布时间:2021-07-16 04:17:04
Sentinel数据双向同步
上面实现了Nacos单向同步配置规则到Sentinel,但是只是单向的,没有实现Sentinel向Nacos同步规则配置;下面我们来实现Sentinel同步配置到Nacos,以及两者的双向数据同步结合使用。
我们回顾一下,首先Sentinel规则的存储默认是存储在内存的,应用重启之后规则会丢失。因此我们通过配置中心Nacos保存规则,然后通过定时拉取Nacos数据来获取规则配置,可以做到动态实时的刷新规则。但是这种方式是单向的,并且有一定的限制,我们是否可以在Sentinel和Nacos这两个中间件之间双向同步数据呢?下面我们来实现Sentinel数据双向同步。
前言
因为实现Sentinel-Nacos数据双向同步,需要使用到推(Push)模式在两边相互推送数据。那么什么是Sentinel的拉模式和推模式呢?Sentinel的规则管理有哪些模型呢?下面我们一一来进行解答:
什么是推模式和拉模式?
推模式:注册中心统一推送,客户端通过注册 * 时刻监听变化
拉模式:客户端主动向配置中心定时轮询拉取配置
Sentinel的规则管理模型
Sentinel的规则管理,主要有以下三种模型:
首先原始模式下的Sentinel Dashboard配置的规则重启应用后就会丢失,这种方式肯定是有极大风险的,生产环境不推荐使用。
其次,拉模式的确不会对Sentinel客户端造成压力,但是Sentinel客户端多了以后会对Nacos注册中心造成压力,并且也无法保证实时性。拉模式的应用场景一般是处理压力小的一方向处理压力大的一方获取数据,并且没有太高的实时性要求,比如定时拉取日志数据。
我们可以使用推模式作为Sentinel客户端的规则同步方式,通过 * 监听Nacos服务端口,来实现规则的实时更新。这就需要涉及到Sentinel Dashboard的规则管理及推送功能:集中管理和推送规则,sentinel-core
提供了 API 和扩展接口来接收和推送信息。并且这种方式,不用担心Sentinel客户端配置的规则错误会导致正确的配置丢失,因为Nacos有配置一键回滚机制,并且还有MySQL作为持久化手段。
总结:生产环境建议使用 Push模式的数据同步中间件(比如Nacos),并且可以的话最好实现数据双向同步。当然还有文件同步的方式,但是无法保证实时性和动态性,因此只是作为一种备份手段。
了解了规则双向同步的过程和原理,下面我们来实现Sentinel规则持久化到Nacos和规则数据双向同步使用测试:
准备工作
1. 版本选取
因为上面我们使用的是 Spring Cloud Alibaba 2021.0.1.0*
和 Spring Cloud 2021.0.1
,因此对应Sentinel版本为Sentinel 1.8.3,下载的使用需要注意版本。
2. 下载Sentinel源码
下载Sentinel对应客户端版本的 sentinel-dashboard
源码
源码地址如下,点击Tags选择版本为1.8.3,然后点击下载ZIP压缩包,下载地址如下:
https://github.com/alibaba/Sentinel/tree/1.8.3
3. 解压并导入项目
将压缩包解压,用IDE工具打开sentinel-dashboard项目,由于是将Sentinel控制台定义的规则持久化到Nacos,所以,只需要打开sentinel-dashboard项目即可:
然后将sentinel项目中的sentinel-dashboard子模块项目,导入到IDE中即可:
我们导入sentinel整个项目,因为会需要下载很多用不到的依赖,比较耽误时间。事实上,我们只需要导入我们需要改造的sentinel-dashboard子模块就可以了。
完成了前面的准备工作,下面我们可以正式开始改造源码了:
改造Sentinel控制台
为什么需要改造Sentinel控制台源码?
因为Sentinel源码本身只支持Nacos同步配置到Sentinel,并不支持Sentinel同步配置到Nacos(阿里的AHAS倒是提供这个功能了,所以说阿里的开源只开一半,还需要社区提供源码修改方案)。因此,我们需要改造Sentinel控制台以支持Sentinel推送规则到Nacos。
我们可以通过Sentinel扩展接口中的DynamicRuleProvider和DynamicRulePublisher接口来实现自己的拉取者(Provider)和推送者(Publisher)接口逻辑。
源码改造的过程
我们从Sentinel-Nacos规则双向同步的底层原理出发,从sentinel-dashboard源码一步步进行改造。这样在更换版本也不会出现不适配的情况,并且从底层代码一步步修改的方式比起直接用打包好的jar包的方式,即使出现了适配问题也能更好、更快的理解并分析出问题出现的原因,对于解决bug和修改任何版本的Sentinel源码都是有帮助的。
主要分为下面三大部分进行改造:
全局修改
全局依赖修改
全局配置修改
后端代码修改
配置类修改
创建规则交互层(拉取与推送实现类)
规则控制层修改
前端代码修改
前端页面调整
前端接口调整
我们这里是Sentinel 1.8.3版本,基于理解原理和实践的原因,下面我们针对 sentinel-dashboard
源码进行手动改造。
1. 全局修改
① 修改POM依赖
想要将 dashboard 的规则持久化到Nacos,需要在sentinel-dashboard子项目的pom.xml中添加一个依赖(源码中已经添加,不过只在测试环境下打包),将作用域扩大:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
② 修改properties配置文件
在resources目录下,找到配置文件 application.properties
文件,在末尾添加一下配置:
# Nacos Configurations
sentinel.nacos.serverAddr=localhost:8848
sentinel.nacos.namespace=
sentinel.nacos.group-id=SENTINEL-GROUP
全部依赖和配置就改造完成了,下面进行后端代码和前端代码的改造。
来源:https://juejin.cn/post/7153431718781779976
猜你喜欢
- java中map与实体类的相互转换1. 在 pom.xml 中引入依赖包<dependency> <grou
- 本文实例为大家分享了Android自定义View实现简易画板的具体代码,供大家参考,具体内容如下自定义VIew实现简易画板效果,功能包括清空
- 本文实例讲述了Jaxb2实现JavaBean与xml互转的方法。分享给大家供大家参考,具体如下:一、简介JAXB(Java Architec
- 本文实例为大家分享了Unity3D UGUI翻书展示的具体代码,供大家参考,具体内容如下参考大佬的,链接找不到了,找到了再加在这。下边是Sh
- 背景在工控软件的开发中很多业务场景就是使用图表控件展示设备和工艺参数。如下图案例:实现思路通常简单的做法是使用图表控件实现,常用的图表控件有
- 之前写轮播条或者指示器的时候都是UI图里面直接有,这样的效果并不好,给用户的体验比较差,所以闲暇之余自己写了个指示器,可以展现出一个优雅的效
- 一、什么是封装?封装就是将属性私有化,提供公有的方法访问私有属性。做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(g
- 本文实例讲述了Android简单实现启动画面的方法。分享给大家供大家参考,具体如下:核心代码:package com.demo.app;im
- 初级技巧 - 乐观锁乐观锁适合这样的场景:读不会冲突,写会冲突。同时读的频率远大于写。以下面的代码为例,悲观锁的实现:public Obje
- 克隆方法是原型设计模式中必须使用的方式,它将返回一个与当前对象数据一致的对象。正如其名,犹如一个模子雕刻而出。克隆类型分为两种:浅克隆、深克
- —举例(学生排课)—正常思路的处理方法和优化过后的处理方法:比如说给学生排课。学生和课程是一个多对多的关系。按照正常的逻辑 应该有一个关联表
- 这篇文章主要介绍了Spring 事件Application Event原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定
- Spring是一个非常流行的Java Web开发框架,它提供了强大的依赖注入、面向切面编程、声明式事务管理等功能,为开发者提供了高效、快速地
- 一、前往 jetbrains 官网下载 IDEA Ultimate版本https://www.jetbrains.com/idea/down
- 从服务器下载文件中文名乱码解决方案,具体文字说明不多了,直接贴代码了,具体代码如下:try { &n
- Canvas绘制文本时,使用FontMetrics对象,计算位置的坐标。public static class FontMetrics {
- 环境配置:jdk1.8mybatis3.4.1springboot2.0起始原因:编写mybatis的Demo程序时,mapper传递多参数
- ShardingSphereShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、
- 消费逻辑上文 流式图表框架搭建框架搭建好之后着手开发下kafka的核心消费逻辑,流式图表的核心消费逻辑就是实现一个消费链接池维护消
- Android 滑动监听的实例详解摘要: ScollBy,ScollTo是对内容的移动,view.ScollyBy是对view的内容的移动&