数据异构 Canal-Spring-Boot-Starter的技术实现

Canal-Spring-Boot-Starter 使用

1、在spring boot 项目配置文件 application.yml内增加以下内容


spring:
  canal:
    instances:
      example:                  # 拉取 example 目标的数据
        host: 192.168.10.179    # canal 所在机器的ip
        port: 11111             # canal 默认暴露端口
        user-name: canal        # canal 用户名
        password: canal         # canal 密码
        batch-size: 600         # canal 每次拉取的数据条数
        retry-count: 5          # 重试次数,如果重试5次后,仍无法连接,则断开
        cluster-enabled: false  # 是否开启集群
        zookeeper-address:      # zookeeper 地址(开启集群的情况下生效), 例: 192.168.0.1:2181,192.168.0.2:2181,192.168.0.3:2181
        acquire-interval: 1000  # 未拉取到消息情况下,获取消息的时间间隔毫秒值
        subscribe: .*\\..*      # 默认情况下拉取所有库、所有表
prod:
  example: example
  database: books
  	

2、在spring boot 项目中的代码使用实例



import com.alibaba.otter.canal.protocol.CanalEntry;
import com.duxinglangzi.canal.starter.annotation.CanalInsertListener;
import com.duxinglangzi.canal.starter.annotation.CanalListener;
import com.duxinglangzi.canal.starter.annotation.CanalUpdateListener;
import com.duxinglangzi.canal.starter.annotation.EnableCanalListener;
import com.duxinglangzi.canal.starter.mode.CanalMessage;
import org.springframework.stereotype.Service;

import java.util.stream.Collectors;

/**
 * @author wuqiong 2022/4/12
 * @description
 */
@EnableCanalListener
@Service
public class CanalListenerTest {

    /**
     * 必须在类上 使用 EnableCanalListener 注解才能开启 canal listener
     *
     * 目前 Listener 方法的参数必须为 com.duxinglangzi.canal.starter.mode.CanalMessage
     * 程序在启动过程中会做检查
     */

    /**
     * 监控更新操作
     * 支持动态参数配置,配置项需在 yml 或 properties 进行配置
     * 目标是 ${prod.example} 的  ${prod.database} 库  users表
     */
    @CanalUpdateListener(destination = "${prod.example}", database = "${prod.database}", table = {"users"})
    public void listenerExampleBooksUsers(CanalMessage message) {
        printChange("listenerExampleBooksUsers", message);
    }

    /**
     * 监控更新操作 ,目标是 example的  books库  users表
     */
    @CanalInsertListener(destination = "example", database = "books", table = {"users"})
    public void listenerExampleBooksUser(CanalMessage message) {
        printChange("listenerExampleBooksUsers", message);
    }

    /**
     * 监控更新操作 ,目标是 example的  books库  books表
     */
    @CanalUpdateListener(destination = "example", database = "books", table = {"books"})
    public void listenerExampleBooksBooks(CanalMessage message) {
        printChange("listenerExampleBooksBooks", message);
    }

    /**
     * 监控更新操作 ,目标是 example的  books库的所有表
     */
    @CanalListener(destination = "example", database = "books", eventType = CanalEntry.EventType.UPDATE)
    public void listenerExampleBooksAll(CanalMessage message) {
        printChange("listenerExampleBooksAll", message);
    }

    /**
     * 监控更新操作 ,目标是 example的  所有库的所有表
     */
    @CanalListener(destination = "example", eventType = CanalEntry.EventType.UPDATE)
    public void listenerExampleAll(CanalMessage message) {
        printChange("listenerExampleAll", message);
    }

    /**
     * 监控更新、删除、新增操作 ,所有配置的目标下的所有库的所有表
     */
    @CanalListener(eventType = {CanalEntry.EventType.UPDATE, CanalEntry.EventType.INSERT, CanalEntry.EventType.DELETE})
    public void listenerAllDml(CanalMessage message) {
        printChange("listenerAllDml", message);
    }

    public void printChange(String method, CanalMessage message) {
        CanalEntry.EventType eventType = message.getEventType();
        CanalEntry.RowData rowData = message.getRowData();


        System.out.println(" >>>>>>>>>>>>>[当前数据库: "+message.getDataBaseName()+" ," +
                "数据库表名: " + message.getTableName() + " , " +
                "方法: " + method );

        if (eventType == CanalEntry.EventType.DELETE) {
            rowData.getBeforeColumnsList().stream().collect(Collectors.toList()).forEach(ele -> {
                System.out.println("[方法: " + method + " ,  delete 语句 ] --->> 字段名: " + ele.getName() + ", 删除的值为: " + ele.getValue());
            });
        }

        if (eventType == CanalEntry.EventType.INSERT) {
            rowData.getAfterColumnsList().stream().collect(Collectors.toList()).forEach(ele -> {
                System.out.println("[方法: " + method + " ,insert 语句 ] --->> 字段名: " + ele.getName() + ", 新增的值为: " + ele.getValue());
            });
        }

        if (eventType == CanalEntry.EventType.UPDATE) {
            for (int i = 0; i < rowData.getAfterColumnsList().size(); i++) {
                CanalEntry.Column afterColumn = rowData.getAfterColumnsList().get(i);
                CanalEntry.Column beforeColumn = rowData.getBeforeColumnsList().get(i);
                System.out.println("[方法: " + method + " , update 语句 ] -->> 字段名," + afterColumn.getName() +
                        " , 是否修改: " + afterColumn.getUpdated() +
                        " , 修改前的值: " + beforeColumn.getValue() +
                        " , 修改后的值: " + afterColumn.getValue());
            }
        }
    }


}

以上展示了在 spring boot 项目中 canal starter 的基本使用

3、源码地址

对于 canal-spring-boot-starter 源代码为楼主自己封装, github地址: https://github.com/duxinglangzi/canal-spring-boot-starter
另附国内 gitee 地址: https://gitee.com/duxinglangzi/canal-spring-boot-starter

如果有需要的同学,可以自行下载源码进行修改和自定义封装

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: b'canal-spring-boot-starter' 是一个用于在 Spring Boot 应用中集成 Canal 数据库日志订阅和消费功能的起始器。它可以帮助开发人员快速搭建 Canal 客户端并订阅对应的数据库操作日志。 ### 回答2: Canal-spring-boot-starter是一个基于Spring Boot框架的插件,用于实现Canal和Spring Boot框架的整合。Canal是阿里巴巴开源的一款基于MySQL数据库增量日志解析工具,通过监听数据库中的binlog(二进制日志),实现数据库的变更事件进行监听和捕捉,从而能够实现实时同步和分析数据库的变化。 Canal-spring-boot-starter将Canal和Spring Boot框架整合在一起,可以让开发者通过简单的配置,轻松地实现数据库变更事件的监听和处理,可以方便地实现数据同步、消息推送、数据分析等功能。同时,Canal-spring-boot-starter还提供了一些默认的配置,包括数据源、表名、过滤规则等,可以让开发者快速上手并开始使用。 Canal-spring-boot-starter的主要特点包括: 1. 便捷性:Canal-spring-boot-starter基于Spring Boot框架,可以方便地整合到Spring Boot应用中,并提供了默认配置,让开发者可以快速上手使用。 2. 功能强大:Canal-spring-boot-starter使用了Canal增量日志解析工具,可以实现数据库变更事件的监听和捕捉,并支持多种操作类型的处理。 3. 高可用性:Canal-spring-boot-starter支持多节点的部署,可以实现数据同步的高可用性。 4. 易于扩展:Canal-spring-boot-starter提供了丰富的API和插件,可以方便地扩展和定制,满足不同场景下的需求。 总之,Canal-spring-boot-starter可以让开发者轻松地实现数据库变更事件的监听和处理,提高应用的数据处理能力和效率。 ### 回答3: canal-spring-boot-starter是一个基于阿里巴巴canal客户端的Spring Boot Starter。它使得在使用Spring Boot和canal进行MySQL数据同步变得更加简单和方便。 可以将canal-spring-boot-starter集成到Spring Boot应用程序中,以便实时获取MySQL数据库更改信息。当MySQL数据库中的数据发生变化时,canal-spring-boot-starter会自动检查并发送变更事件。您可以使用canal的订阅功能订阅可以使用canal的订阅功能订阅这些事件并对它们进行相应处理。 canal-spring-boot-starter提供了一些方便的配置选项,例如: 1. 配置canal的连接参数,例如MySQL服务器和端口号以及用户名和密码。 2. 配置订阅规则,例如您可以指定您所需的数据表和列来获取相关的变更事件。 3. 在您的应用程序中定义用于处理变更事件的监听器。 canal-spring-boot-starter提供了一种可靠的方法来处理MySQL数据库中的更改。通过使用canal-spring-boot-starter,您可以很容易地将canal集成到您的Spring Boot应用程序中,以获得实时的MySQL数据库更改信息。这使得开发人员能够更快地响应数据库更改并进行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值