Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

前言:如何保证redis与mysql数据一致性呢? 网上大部份答案都是延迟双删, 现在我就将另外一个解方案分享给大家,我自己也在最近项目中应有上来了。

1、开启 biglog 日志 (根据自己mysql配置文件位置更改)

vim /etc/my.cnf

添加配置

[mysqld]
log-bin=mysql-bin # 开启binlog
binlog-format=ROW # 选择ROW模式
server_id=1 # 配置MySQL replaction需要定义,不和Canal的slaveId重复即可

2、重启MySQL ,查看配置是否生效

show variables like 'log_bin';

 3. RabbitMQ 队列创建 

  • 添加交换机 canal_exchange

Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第1张图片

  • 添加队列 canal_queue

Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第2张图片

  • 队列绑定交换机

Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第3张图片

4. Canal 配置和启动

Canal Server下载

  • 官方文档:Home · alibaba/canal Wiki · GitHub
  • 项目地址:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件
  • 下载地址:Releases · alibaba/canal · GitHub

进入下载地址,选择 canal.deployer-1.1.5.tar.gz

Canal Server配置

需要配置的东西就两项,一个是监听数据库配置,另一个是 RabbitMQ 连接配置。

改动的两个文件分别是 Canal 配置文件 canal.properties 和 实例配置文件 instance.properties

㊙️:一个 Server 可以配置多个实例监听 ,Canal 功能默认自带的有个 example 实例,本篇就用 example 实例 。如果增加实例,复制 example 文件夹内容到同级目录下,然后在 canal.properties 指定添加实例的名称。

解压出来的目录信息:

canal.properties

配置 Canal 服务方式为 RabbitMQ 和连接配置

进入到conf文件,打开canal.properties

Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第4张图片

把原理tcp模式改成rabbitMQ

 Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第5张图片

到这里我们将canal连接rabbitMQ配置完成

instance.properties

监听数据库配置

cd /example 目录下

Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第6张图片

 

 5. SpringBoot 整合 Canal + RabbitMQ

引入maven依赖


    org.springframework.boot
    spring-boot-starter-amqp

RabbitMQ连接配置

spring:
  rabbitmq:
    host: ip
    port: 端口
    username: 用户名
    password: 密码

RabbitMQ 监听同步缓存

Canal 实战 | SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存_第7张图片

 返回json映射bean类 CanalMessage


/**
 * @author yueF_L
 * @version 1.0
 * @date 2022-04-10 0:30
 * Canal消息接收实体类
 */
@NoArgsConstructor
@Data
public class CanalMessage {
    @JsonProperty("type")
    private String type;

    @JsonProperty("table")
    private String table;

    @JsonProperty("data")
    private List data;

    @JsonProperty("database")
    private String database;

    @JsonProperty("es")
    private Long es;

    @JsonProperty("id")
    private Integer id;

    @JsonProperty("isDdl")
    private Boolean isDdl;

    @JsonProperty("old")
    private List old;

    @JsonProperty("pkNames")
    private List pkNames;

    @JsonProperty("sql")
    private String sql;

    @JsonProperty("ts")
    private Long ts;

}

你可能感兴趣的:(java,rabbitmq,canal)