SpringBoot整合canal实现数据同步的示例代码

作者:郑清 时间:2022-05-07 19:51:24 

一、前言

canal:阿里巴巴 MySQL binlog 增量订阅&消费组件
https://github.com/alibaba/canal

tips: 环境要求和配置参考 https://github.com/alibaba/canal/wiki/AdminGuide

这里额外提下Redis缓存和MySQL数据一致性解决方案

  • 延时双删策略

  • 异步更新缓存(基于订阅binlog的同步机制)

  • …

我们的canal即可作为MySQL binlog增量订阅消费组件+MQ消息队列将增量数据更新到redis

二、docker-compose部署canal

tips: 详情可查看 https://gitee.com/zhengqingya/docker-compose

# 准备
git clone https://gitee.com/zhengqingya/docker-compose.git
cd docker-compose/Liunx

# 导入初始化SQL
Liunx/canal/canal_admin/canal_manager.sql

# 运行  (tips:先修改配置文件信息)
docker-compose -f docker-compose-canal.yml -p canal up -d

相关配置文件

SpringBoot整合canal实现数据同步的示例代码

docker-compose-canal.yml

# 可参考 https://github.com/alibaba/canal/wiki/QuickStart

version: '3'

# 网桥canal -> 方便相互通讯
networks:
 canal:

services:
 canal_admin:
   image: registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-admin:v1.1.5      # 原镜像`canal/canal-admin:v1.1.5`
   container_name: canal_admin               # 容器名为'canal_admin'
   restart: unless-stopped                   # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
   volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
     - "./canal/canal-admin/bin/startup.sh:/home/admin/canal-admin/bin/startup.sh"
     - "./canal/canal-admin/logs:/home/admin/canal-admin/logs"
   environment: # 设置环境变量,相当于docker run命令中的-e
     TZ: Asia/Shanghai
     LANG: en_US.UTF-8
     canal.adminUser: admin
     canal.adminPasswd: 123456
     spring.datasource.address: www.zhengqingya.com:3306
     spring.datasource.database: canal_manager
     spring.datasource.username: root
     spring.datasource.password: root
   ports:
     - "8089:8089"
   networks:
     - canal

canal_server:
   image: registry.cn-hangzhou.aliyuncs.com/zhengqing/canal-server:v1.1.5      # 原镜像`canal/canal-server:v1.1.5`
   container_name: canal_server              # 容器名为'canal_server'
   restart: unless-stopped                   # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
   volumes:                                  # 数据卷挂载路径设置,将本机目录映射到容器目录
     - "./canal/canal-server/logs:/home/admin/canal-server/logs"
   environment:                              # 设置环境变量,相当于docker run命令中的-e
     TZ: Asia/Shanghai
     LANG: en_US.UTF-8
     canal.register.ip: www.zhengqingya.com
     canal.admin.manager: canal_admin:8089
     canal.admin.port: 11110
     canal.admin.user: admin
     canal.admin.passwd: 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
   ports:
     - "11110:11110"
     - "11111:11111"
     - "11112:11112"
   depends_on:
     - canal_admin
   links:
     - canal_admin
   networks:
     - canal

访问地址:http://ip地址:8089
默认登录账号密码:admin/123456

SpringBoot整合canal实现数据同步的示例代码

SpringBoot整合canal实现数据同步的示例代码

三、canal-admin可视化管理

tips: 页面使用自行多点点就会了^_^
将数据投递到RabbitMQ配置为例,附带些其中重要的配置信息
mq的交换机和队列可通过后面java代码自动生成,无需自己手动建立

1、canal.properties

# canal admin config
#canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

# tcp, kafka, rocketMQ, rabbitMQ
canal.serverMode = rabbitMQ

rabbitmq.host = www.zhengqingya.com:5672
rabbitmq.virtual.host = my_vhost
rabbitmq.exchange = canal.exchange
rabbitmq.username = admin
rabbitmq.password = admin

2、example/instance.propertios

canal.instance.master.address=www.zhengqingya.com:3306
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8

# table regex 只同步test数据库下的t_user表
canal.instance.filter.regex=test\\.t_user
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*

# mq config
canal.mq.topic=canal_routing_key

四、springboot整合canal实现数据同步

1、pom.xml引入mq依赖

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、application.yml配置

# RabbitMQ配置
spring:
 rabbitmq:
   addresses: www.zhengqingya.com:5672,www.zhengqingya.com:5673 # 指定client连接到的server的地址,多个以逗号分隔
   # 填写自己安装rabbitmq时设置的账号密码,默认账号密码为`guest`
   username: admin
   password: admin
   virtual-host: my_vhost # 填写自己的虚拟机名,对应可查看 `127.0.0.1:15672/#/users` 下Admin中的`Can access virtual hosts`信息

3、mq监听canal消息数据

@Slf4j
@Component
public class CanalRabbitMqListener {

@RabbitListener(bindings = {
           @QueueBinding(
                   value = @Queue(value = MqConstant.CANAL_QUEUE, durable = "true"),
                   exchange = @Exchange(value = MqConstant.CANAL_EXCHANGE),
                   key = MqConstant.CANAL_ROUTING_KEY
           )
   })
   public void handleCanalDataChange(String message) {
       log.info("[canal] 接收消息: {}", JSON.toJSONString(message));
   }

}
public interface MqConstant {

String CANAL_EXCHANGE = "canal.exchange";
   String CANAL_QUEUE = "canal_queue";
   String CANAL_ROUTING_KEY = "canal_routing_key";

}

4、测试

先启动项目让程序自动建立所需mq中的交换机和队列

SpringBoot整合canal实现数据同步的示例代码

再修改canal监听的表数据

SpringBoot整合canal实现数据同步的示例代码

查看程序监听的mq消息数据如下,拿到数据就可以进行数据解析处理了&hellip;

SpringBoot整合canal实现数据同步的示例代码

五、canal-spring-boot-starter

tips: 可参考 https://github.com/NormanGyllenhaal/canal-client

此方式需将canal.properties配置文件中的canal.serverMode属性值修改为tcp

SpringBoot整合canal实现数据同步的示例代码

1、pom.xml中引入依赖

<!-- https://mvnrepository.com/artifact/top.javatool/canal-spring-boot-starter -->
<dependency>
   <groupId>top.javatool</groupId>
   <artifactId>canal-spring-boot-starter</artifactId>
   <version>1.2.1-RELEASE</version>
</dependency>

2、application.yml配置

canal:
 server: www.zhengqingya.com:11111
 destination: example # tips:canal-admin中Instance管理下需存在example实例配置

3、监听canal数据 &ndash; 订阅数据库增删改操作

@Slf4j
@Component
@CanalTable(value = "t_user")
public class UserHandler implements EntryHandler<User> {

@Override
   public void insert(User user) {
       log.info("insert message  {}", user);
   }

@Override
   public void update(User before, User after) {
       log.info("update before {} ", before);
       log.info("update after {}", after);
   }

@Override
   public void delete(User user) {
       log.info("delete  {}", user);
   }

}
@Data
@Table(name = "t_user")
public class User implements Serializable {

/**
    * 主键
    */
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "user_id")
   private Integer userId;

/**
    * 用户名
    */
   @Column(name = "username")
   private String username;

/**
    * 密码
    */
   @Column(name = "password")
   private String password;

/**
    * 性别
    */
   @Column(name = "sex")
   private Integer sex;

/**
    * 备注
    */
   private String remark;

/**
    * 时间
    */
   private Date date;

}

经测试发现这个jar存在一些bug,ex:针对表字段,数据原本为空,修改为有值的时候,如果java这边用非String字段类型去接收会报错!

SpringBoot整合canal实现数据同步的示例代码

本文案例demo源码

https://gitee.com/zhengqingya/java-workspace

来源:https://blog.csdn.net/qq_38225558/article/details/122587532

标签:SpringBoot,canal,数据同步
0
投稿

猜你喜欢

  • Spring启动过程中实例化部分代码的分析之Bean的推断构造方法

    2022-08-26 02:00:07
  • Android实现登录注册功能

    2023-07-31 09:35:44
  • Java项目开发中实现分页的三种方式总结

    2021-08-25 21:36:36
  • Java中BigDecimal的舍入模式解析(RoundingMode)

    2021-10-16 15:28:16
  • Java设计模式之备忘录模式

    2023-08-24 06:17:05
  • android使用PullToRefresh实现下拉刷新和上拉加载

    2023-08-06 11:06:58
  • Java算法实战之排一亿个随机数

    2022-11-22 02:47:26
  • C++string中的insert()插入函数详解

    2023-11-02 14:05:51
  • Flutter路由传递参数及解析实现

    2023-06-22 11:48:45
  • Java 把json对象转成map键值对的方法

    2023-08-25 01:58:14
  • Java非侵入式API接口文档工具apigcc用法详解

    2023-11-24 10:01:00
  • java设计模式学习之工厂方法模式

    2023-10-12 17:19:04
  • Java金额大小写的转换方法

    2023-08-23 00:26:11
  • Android 如何实现动态申请权限

    2023-07-30 00:51:31
  • Springboot详解实现食品仓库管理系统流程

    2023-11-10 18:33:15
  • 解决mybatis update并非所有字段需要更新问题

    2022-12-09 10:20:55
  • 详解springboot和vue前后端分离开发跨域登陆问题

    2023-08-07 00:48:38
  • Android仿简书搜索框效果的示例代码

    2023-06-18 16:02:58
  • Java实现简单QQ聊天工具

    2023-11-25 05:54:52
  • Java读取.properties配置文件方法示例

    2023-08-24 16:32:56
  • asp之家 软件编程 m.aspxhome.com