SpringCloud 整合 Canal+RabbitMQ+Redis 实现数据监听
1Canal介绍
Canal 指的是阿里巴巴开源的数据同步工具,用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
Canal是如何同步数据库数据的呢?
Canal通过伪装成mysql从服务向主服务拉取数据,所以先来了解一下MySQL的主从复制吧
2MySQL主从复制原理

1、从库(slave)会生成两个线程,I/O线程(IOthread),SQL线程(SQLthread)。
2、当slave的I/O线程连接到master后,会去请求master的二进制日志(binlog), 此时master会通过logdump(将主库的二进制日志文件内容传输给从库的过程) 给从库传输binlog。
3、 然后slave将拿到的binlog日志依次写入Relaylog(中继日志)的最末端,同时将读取到的Master 的bin-log的文件名和位置记录到master- info文件中,作用为了让slave知道它需要从哪个位置和哪 个日志文件开始同步数据,以保证数据的一致性,并且能够及时获取到master的新的更新操作, 开始数据同步过程。slave不仅在启动时读取 master-info 文件,而且会定期更新该文件中的记 录,以确保记录都是最新的。
4、最后SQL线程会读取Relaylog,并解析为具体操作(比如DDL这种),来实现主从库的操作一致, 最终实现数据一致;
大致了解完了MySQL的主从复制,接着我们看Canal就简单啦。
3Canal工作原理

1、Canal Server与MySQL建立连接后,会通过模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议获取数据库的 binlog(二进制日志)文件。
2、Canal Server解析binlog文件,通过网络将解析后的事件传输给消息中间件(Kafka,RabbitMQ等),实现数据的实时同步。
了解完canal的原理后,我们就正式开始RabbitMQ+Canal+Redis实现缓存和数据库数据一致的功能。
4RabbitMQ+Canal+redis工作原理

通过上图很好理解:
-
APP向数据库进行写操作(比如我们更新商品信息啥的)
-
Canal监听到数据库发生变化,便会向rabbitMQ传递数据库发生变化的消息。
-
消费者就可以从rabbitMQ获取这些消息,然后进行删除缓存操作。
下面通过实战让我们更好地理解是如何实现缓存和数据库数据一致性的。
5实战配置
Canal 配置
修改 conf/canal.properties 配置
# 指定模式
canal.serverMode = rabbitMQ
# 指定实例,多个实例使用逗号分隔: canal.destinations = example1,example2
canal.destinations = example # rabbitmq 服务端 ip
rabbitmq.host = 你的ip(注意不要加端口号哦)
# rabbitmq 虚拟主机
rabbitmq.virtual.host = /
# rabbitmq 交换机
rabbitmq.exchange = canal.exchange (这是本例子用的交换机)
# rabbitmq 用户名
rabbitmq.username = 你的用户名
# rabbitmq 密码
rabbitmq.password = 你的密码
rabbitmq.deliveryMode =
修改实例配置文件
conf/example/instance.properties
#配置 slaveId,自定义,不等于 mysql 的 server Id 即可
canal.instance.mysql.slaveId=10 # 数据库地址:配置自己的ip和端口
canal.instance.master.address=你的IP:端口号# 数据库用户名和密码
canal.instance.dbUsername=用户名
canal.instance.dbPassword=密码# 指定库和表
canal.instance.filter.regex=.*\..* # 这里的 .* 表示 canal.instance.master.address 下面的所有数据库# mq config
# rabbitmq 的 routing key
canal.mq.topic=canal.routing.key(这是本例子用的key)
然后重启 canal 服务。
RabbitMQ 配置



这样rabbitMQ就配置完啦,下面就是实战代码啦。
6实战代码
CanalMessage: Canal传来的消息
@NoArgsConstructor
@Data
public class CanalMessage<T> {private String type;private String table;private List<T> data;private String database;private Long es;private Integer id;private Boolean isDdl;private List<T> old;private List<String> pkNames;private String sql;private Long ts;
}
RabbitMQ配置类
@Configuration
@Slf4j
public class RabbitConfig {/*** 消息序列化配置*/@Beanpublic RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {// SimpleRabbitListenerContainerFactory 是 RabbitMQ 提供的一个实现了 RabbitListenerContainerFactory 接口的简单消息监听器容器工厂。// 它的作用是创建和配置 RabbitMQ 消息监听器容器,用于监听和处理消息。SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();//ConnectionFactory 是 RabbitMQ 提供的一个接口,用于创建 RabbitMQ 的连接factory.setConnectionFactory(connectionFactory);//使用了 Jackson2JsonMessageConverter 将消息转换为 JSON 格式进行序列化和反序列化factory.setMessageConverter( new Jackson2JsonMessageConverter());return factory;}
}
将消息转换为JSON格式,才能映射到CanalMessage上。
RabbitMQ+Canal监听处理类
@Component
@Slf4j
@RequiredArgsConstructor
public class CanalListener {private final SysMenuService menuService;//@RabbitListener(queues = "canal.queue")public void handleDataChange(@Payload CanalMessage message) {String tableName = message.getTable();log.info("Canal 监听 {} 发生变化;明细:{}", tableName, message);if (Arrays.asList("sys_menu", "sys_role", "sys_role_menu").contains(tableName)) {log.info("======== 清理菜单路由缓存 ========");menuService.cleanCache();}}
}
menuService的cleanCache()是把登录时的路由列表缓存清除掉,
具体可去源码查看,在最底下。
这样我们实现缓存和数据库数据一致性的功能就完成啦,接下来测试一下。
7测试
我们直接通过手动修改数据库来完成测试。

我们在菜单表修改菜单管理的内容改成菜单管理1,点击保存

可以看到更新操作已经被监听到啦。接着就完成清理缓存操作咯,然后就可以防止缓存和数据库数据不一致的问题啦。
相关文章:
SpringCloud 整合 Canal+RabbitMQ+Redis 实现数据监听
1Canal介绍 Canal 指的是阿里巴巴开源的数据同步工具,用于数据库的实时增量数据订阅和消费。它可以针对 MySQL、MariaDB、Percona、阿里云RDS、Gtid模式下的异构数据同步等情况进行实时增量数据同步。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.…...
一体机定制_工控触控一体机安卓主板方案
工控一体机是一种集成化的硬件方案,采用了联发科MT8768八核芯片和12nm制程工艺。该芯片拥有2.0GHz的主频和IMG PowerVR GE8320图形处理GPU,具备强大的视频处理能力,并且兼容大部分的视频格式和解码能力。工控一体机搭载了Android 9.0操作系统…...
Android10.0 人脸解锁流程分析
人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持,也为安全合规地启用集成交易的应用(网上银行或其他服务&am…...
P8598 [蓝桥杯 2013 省 AB] 错误票据
题目背景 某涉密单位下发了某种票据,并要在年终全部收回。 题目描述 每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造…...
【Android进阶篇】Android中PreferenceScreen的作用和详细用法介绍
1,PreferenceScreen的作用 在Android开发中,PreferenceScreen是一个非常重要的布局控件,主要用于创建设置界面(settings page)。它可以包含多个Preference子项,如CheckBoxPreference, ListPreference等&am…...
test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比
拓展阅读 test-01-java 单元测试框架 junit 入门介绍 test-02-java 单元测试框架 junit5 入门介绍 test-03-java 单元测试框架 testNG 入门介绍 junit/junit5/testNG 详细对比 test assert-01-Google Truth 断言 test 系统学习-03-TestNG Spock testng 入门使用教程 开源…...
Maven 项目依赖仓库配置详解:pom.xml 中的 repositories 与 Maven 配置文件的调用顺序
Maven 项目依赖仓库配置详解:pom.xml 中的 repositories 与 Maven 配置文件的调用顺序 Maven(Apache Maven)是一个流行的项目管理工具,广泛用于Java项目的构建、依赖管理以及项目生命周期的管理。在Maven项目中,pom.x…...
JS深浅拷贝
区分 B复制了A的值,如果A被修改,B的值也被改变,那就是浅拷贝。 如果B的值没有跟着修改,那就是深拷贝 深浅拷贝的方式 1、遍历赋值 2、Object.create() 3、JSON.parse()和JSON.stringify() 浅拷贝-遍历 let a {name:"…...
uni-app 命令行创建
1. 首先创建项目,命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错,如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法: 创建目录 C:\Users\Administrator\AppData\Roaming\n…...
ImageJ二值图像处理:形态学和分割
文章目录 二值化形态学处理分割 ImageJ系列: 安装与初步💎 灰度图像处理💎 图像滤波 二值化 在Process->Binary下有两个命令用于生成一个二值化图像,分别是 Make BinaryConvert to Mask 但当前图像是RGB或者灰度图时&…...
自动驾驶中的“雷达”
自动驾驶中有好几种雷达,新手可能会混淆,这里统一介绍一下它们。 首先,所有雷达的原理都是发射波,接收回波(可能是声波或电磁波),并通过发射和接收的时间差以及波的速度计算距离。只不过发射的…...
Web 3.0 是什么
第 1 章 明晰Web 3.0 从本章开始,就进入了本书的第一篇章,入门Web3.0,在第一篇章中将会让读者对Web3.0有一个整体的认知,为学习后面的章节打下基础。 在本章中,主要介绍的是Web的发展历史,包涵Web1.0、Web2.0、Web3.0的发展过程,以及资本为什么需要入场Web3.0、Web3.0…...
四种NAT的网络结构
四种NAT的网络结构 引言1 完全圆锥型NAT2 IP限制圆锥型NAT3 Port限制圆锥型NAT4 对称型NAT5 总结 引言 NAT是将内网地址映射转换为外网地址的一种地址转换方式,这节省了有限的IP地址资源。一般来讲,分为对称型NAT和圆锥形NAT,其中圆锥形NAT又…...
Android studio 使用greenDao根据实体类生成dao类
1.遇到的问题 使用android studio根据实体类生成dao其实也很简单,你只要实现 Parcelable Entity public class ConfigDataModel implements Parcelable {Id(autoincrement true)private Long id null; } 2.使用自带的方法生成 使用build-->make Project生成 …...
redis 从0到1完整学习 (九):SkipList 数据结构
文章目录 1. 引言2. redis 源码下载3. skipList 数据结构4. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二):redis 常用命令》 《re…...
智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…...
Isaac Sim 仿真机器人urdf文件导入
本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…...
Python 实现Excel和CSV之间的相互转换
通过使用Python编程语言,编写脚本来自动化Excel和CSV之间的转换过程,可以批量处理大量文件,定期更新数据,并集成转换过程到自动化工作流程中。本文将介绍如何使用第三方库Spire.XLS for Python 实现: 使用Python将Exc…...
【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南
前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信,通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内,SMSBoom 可以作为一种有效的测试工具,帮助开发者和系统…...
【Filament】立方体贴图(6张图)
1 前言 本文通过一个立方体贴图的例子,讲解三维纹理贴图(子网格贴图)的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下。 读者如果对 Filament 不太熟悉,请回顾以下内容。 Filament环境搭建绘制三角…...
LiveSplit终极指南:为速度跑者量身定制的精准计时神器
LiveSplit终极指南:为速度跑者量身定制的精准计时神器 【免费下载链接】LiveSplit A sleek, highly customizable timer for speedrunners. 项目地址: https://gitcode.com/gh_mirrors/li/LiveSplit LiveSplit是一款专为速度跑者打造的轻量级、高度可定制的计…...
HTML到DOCX格式转换的技术实现与解决方案
HTML到DOCX格式转换的技术实现与解决方案 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 在Web应用开发和企业文档处理流程中,HTML内容与Office文档格式之间的转换一直是一个技术难点。传…...
QuickLook.Plugin.FolderViewer:如何用空格键实现Windows文件夹零秒预览?
QuickLook.Plugin.FolderViewer:如何用空格键实现Windows文件夹零秒预览? 【免费下载链接】QuickLook.Plugin.FolderViewer Folder viewer plugin for QuickLook 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook.Plugin.FolderViewer 在W…...
ElevenLabs芬兰语TTS深度评测:9大真实场景实测,准确率92.7% vs 传统引擎差距在哪?
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs芬兰语TTS技术概览与评测背景 ElevenLabs 作为当前语音合成领域的领先平台,其多语言支持能力持续扩展,芬兰语(Finnish)于2023年第四季度正式纳…...
2026年获客成本飙升?GEO优化让线索成本降低60%
2026年获客成本飙升?GEO优化让线索成本降低60% 摘要 :传统获客方式成本越来越高,百度竞价按点击付费,展会一次花费数万,线索成本难以下降。本文介绍一种新的获客方式——GEO优化,通过AI搜索优化直接触达目标…...
C++ `dynamic_cast
1. 基础 C类型转换概览为什么需要dynamic_cast 2. dynamic_cast 的使用 基本语法与其他类型转换(如 static_cast、reinterpret_cast 和 const_cast)的对比 3. RTTI (运行时类型信息) 什么是RTTI如何在C中启用和禁用RTTI 4. dynamic_cast 与多态 使用dyna…...
VSCode+GCC+OpenOCD:打造你的STM32专属OpenHarmony 3.1开发流水线
VSCodeGCCOpenOCD:构建STM32 OpenHarmony开发的高效流水线 在嵌入式开发领域,效率往往取决于工具链的整合程度。当OpenHarmony遇上STM32,如何摆脱传统IDE的束缚,打造一套现代化、可定制的开发环境?本文将带你从零搭建基…...
别再让容器‘断网’了!Docker DNS配置保姆级教程(从全局到单容器,含8.8.8.8等常用DNS)
Docker容器网络疑难排查:全方位DNS配置指南与实战技巧 当你正在赶一个紧急项目,突然发现Docker容器无法连接外部API服务,控制台不断抛出"Name or service not known"错误——这种场景对开发者来说再熟悉不过了。容器网络问题&#…...
2026年多Agent协作实战:用CrewAI搭建5角色AI开发团队
前言上一篇我们学习了MCP协议,掌握了AI与工具交互的标准化方法。本文将更进一步,探讨如何让多个AI Agent协同工作——就像组建一个AI开发团队,每个Agent负责不同的角色,通过协作完成复杂任务。—## 一、为什么需要多Agent协作&…...
急救场景下的志愿者调度与AED就近匹配
急救场景下的志愿者调度与AED就近匹配——120急救通的设计思路 一、问题的起点:黄金4分钟 心脏骤停后,每延迟1分钟,存活率下降7%-10%。医学上公认的黄金抢救时间是4分钟。 而现实是:城市中120救护车平均到达时间超过10分钟&#x…...
