Spring Boot集成canal快速入门demo

1.什么是canal?

canal 是阿里开源的一款 MySQL 数据库增量日志解析工具,提供增量数据订阅和消费。

canal_00

 

工作原理

MySQL主备复制原理
  • MySQL master 将数据变更写入二进制日志(binary log), 日志中的记录叫做二进制日志事件(binary log events,可以通过 show binlog events 进行查看)
  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  • MySQL slave 重放 relay log 中事件,将数据变更反映到它自己的数据

mysql_replication

Canal 工作原理
  • Canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议
  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 Canal )
  • Canal 解析 binary log 对象(原始为 byte 流)

2.环境搭建

搭建mysql

version: '3'
services:mysql:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7container_name: mysql_3306restart: unless-stoppedvolumes:- "./mysql/my.cnf:/etc/mysql/my.cnf"- "./mysql/init-file.sql:/etc/mysql/init-file.sql"- "./mysql/data:/var/lib/mysql"
#      - "./mysql/conf.d:/etc/mysql/conf.d"- "./mysql/log/mysql/error.log:/var/log/mysql/error.log"- "./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d" # init sql script directory -- tips: it can be excute  when `/var/lib/mysql` is emptyenvironment:                        # set environment,equals docker run -eTZ: Asia/ShanghaiLANG: en_US.UTF-8MYSQL_ROOT_PASSWORD: root         # set root passwordMYSQL_DATABASE: root              # init database nameports:                              # port mappping- "3306:3306"

注意my.cnf在windows系统必须为只读,否则忽略

docker-compose -f docker-compose.yml -p mysql57 up -d

查看日志是否开启

show variables like 'log_%';

如果启用了,这个查询将返回log_bin的值为ON。

7219851613665

搭建canal-server

下载我canal客户端,官方地址进行相应版本的安装包进行下载(注意:如果下载翻到本文最下面联系我): https://github.com/alibaba/canal/releases

29

修改配置文件

example/instance.properties
instance.properties 基本上只用改动 dbUsername 和 dbPassword就可以了

启动

8587158

3.代码工程

实验目的

实现canal读取mysql的变更数据

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>canal</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

client

package com.et.canal.client;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.context.CanalContext;
import top.javatool.canal.client.handler.EntryHandler;
import top.javatool.canal.client.model.CanalModel;import java.util.Map;@Slf4j
@Component
@CanalTable(value = "all")
public class AllConsumer implements EntryHandler<Map<String, String>> {@Overridepublic void insert(Map<String, String> map) {log.info("add,{}", map);}@Overridepublic void update(Map<String, String> before, Map<String, String> after) {// CanalModelCanalModel canal = CanalContext.getModel();log.info("update,update before={},update after={}", before, after);}@Overridepublic void delete(Map<String, String> map) {log.info("delete,{}", map);}
}

application.yaml

canal:mode: simplefilter: # 过滤表名,可以为空batch-size: 1timeout: 1server: 127.0.0.1:11111destination: example # canal-server中定义的实例名,不可以为空user-name: rootpassword: rootasync: true # 必须是true,设为false在启动时会报MessageHandler bean找不到,具体原因没看

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo(canal)

4.测试

  • 启动springboot应用
  • 更新数据库数据
  • 观察控制台变化

5.引用

  • https://github.com/alibaba/canal
  • Spring Boot集成canal快速入门demo | Harries Blog™

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉树_堆(下卷)

前言 接前面两篇的内容&#xff0c;接着往下讲二叉树_堆相关的内容。 正文 那么&#xff0c;回到冒泡排序与堆排序的比较。 我们知道冒泡排序的时间复杂度为 O ( N 2 ) O(N^2) O(N2)&#xff0c;这个效率是不太好的。 那么&#xff0c;我们的堆排序的时间复杂度如何呢&…

017、Vue动态tag标签

文章目录 1、先看效果2、代码 1、先看效果 2、代码 <template><div class "tags"><el-tag size"medium"closable v-for"item,index in tags":key"item.path":effect"item.title$route.name?dark:plain"cl…

特征工程的自动化革新:Mojo模型中的动态应用策略

特征工程的自动化革新&#xff1a;Mojo模型中的动态应用策略 在机器学习领域&#xff0c;特征工程是提升模型性能的黄金钥匙。Mojo模型&#xff0c;作为一个代表任何机器学习模型的术语&#xff0c;其性能在很大程度上依赖于特征的有效性。随着数据的不断变化和业务需求的演进…

数据结构 - AVL树

文章目录 一、AVL树的介绍二、AVL树的实现1、基本框架2、查找3、插入4、删除5、测试6、总代码 三、AVL树的性能 一、AVL树的介绍 1、概念 AVL树&#xff08;Adelson-Velsky and Landis Tree&#xff09;是一种自平衡的二叉搜索树。它得名于其发明者G. M. Adelson-Velsky和E. M…

Vue 状态管理 Vue CLI

Vue 状态管理 & Vue CLI 1、状态管理2、集中状态管理2.1 Vuex2.1.1 Vuex核心概念2.1.2 Vuex Store实例2.1.3 Vuex Getter2.1.4 Vuex Mutation2.1.4 Vuex Actions2.1.4 Vuex Module 2.2 Pinia2.2.1功能增强 3、Vuex 实现原理4、Pinia 实现原理5、CLI5.1 实现 1、状态管理 将…

【CG】计算机图形学(Computer Graphics)基础(其贰)

0 学习视频 B站GAMES101-现代计算机图形学入门-闫令琪 ※ 接上文【CG】计算机图形学&#xff08;Computer Graphics&#xff09;基础&#xff08;其壹&#xff09; 7 光线追踪 7.1 为什么需要光线追踪&#xff1f; 光栅化无法妥善处理全局效果 &#xff08;软&#xff09;阴…

一天搞定React(5)——ReactRouter(下)【已完结】

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

excel中的时间格式通过js转化为正常时间

在JavaScript中&#xff0c;如果有一个类似44419.40592592592这样的数字&#xff0c;它通常不代表直接可用于Date对象的格式&#xff0c;因为JavaScript的Date对象期望的是从1970年1月1日UTC开始的毫秒数&#xff08;时间戳&#xff09;。 但是&#xff0c;如果知道这个数字是…

MATLAB基础:函数与函数控制语句

今天我们继续学习Matlab中函数相关知识。 API的查询和调用 help 命令是最基本的查询方法&#xff0c;可查询所有目录、指定目录、命令、函数。 我们直接点击帮助菜单即可查询所需的API函数。 lookfor 关键字用于搜索相关的命令和函数。 如&#xff0c;我们输入lookfor inpu…

初学Mybatis之 Limit 或 RowBounds 实现分页

Limit 分页&#xff1a; startIndex 起始位置&#xff0c;pageSize 每页显示个数 select * from mybatis.user limit startIndex,pageSize; 比如 limit 0,2; 从第零个开始查&#xff0c;每页显示两个&#xff08;如果第一个数字是 1&#xff0c;其实是从第二条数据开始展示…

开源物联网网关ThingsBoard IoT Gateway

前几天测试了Neuron&#xff0c;这是一个令人印象深刻的平台&#xff0c;不过它不能算是完全免费的平台&#xff0c;因为它还是有商业许可要求的&#xff0c;挺贵的&#xff0c;大几万的&#xff0c;而且它有走向闭源的趋势。所以也在寻找它的替代方案。 今天看到一个ThingsBo…

Django项目中报错:django.template.exceptions.TemplateDoesNotExist: index.html

访问127.0.0.1&#xff1a;8000访问出错 查看报错原因 到Django项目当中找到settings.py&#xff0c;找到TEMPLATES中的DIRS: 添加如下代码&#xff0c;并导入OS模块&#xff1a; "DIRS": [os.path.join(BASE_DIR,templates)] 再次访问IP地址&#xff1a;

C++(入门1)

C参考文档 Reference - C Reference C 参考手册 - cppreference.com cppreference.com 第一个C程序 #include<stdio.h> int main() {printf("Hello C\n");return 0; }由上述代码可知C是兼容C语言 第一个C标准程序 #include<iostream> using names…

【机器学习】智驭未来:机器学习如何重塑制造业的转型与升级

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习重塑制造业生产流程&#x1f338;预测性维护&#xff1a;减少停机时间&#xff0c;提高设…

C语言日常练习Day13

目录 一、设半径r1.5&#xff0c;圆柱高h3&#xff0c;求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积 二、编写程序&#xff0c;用getchar函数读入两个字符给c1,c2&#xff0c;然后分别用putchar函数和printf函数输出这两个字符 三、输入4个整数&#xff0c;要求按由小…

OD C卷 - 体育场找座位

体育场找座位 &#xff08;100&#xff09; 体育场有一排座位&#xff08;已有落座观众&#xff09;&#xff0c;观众之间必须至少一个空位才允许落座&#xff1b;在不移动现有观众座位的情况下&#xff0c;最多还能坐下多少人&#xff1f; 输入描述&#xff1a; 数组表示每个…

RHCE之seLinux和防火墙

目录 SELinux: SELinux工作原理&#xff1a; 常用的SELinux的几种文件类型&#xff1a; 1、文件类型&#xff08;file type&#xff09;&#xff1a;用于限制文件的访问。 2、进程类型&#xff08;process type&#xff09;&#xff1a;用于限制进程的行为。常见的类型包括…

测试面试宝典(三十二)—— 你是怎么测试接口的?

首先&#xff0c;在测试接口之前&#xff0c;我会仔细分析接口的需求文档和技术规格&#xff0c;明确接口的功能、输入输出参数、预期的返回结果以及可能的异常情况。 然后&#xff0c;我会使用工具如 Postman 或 Jmeter 来发送请求对接口进行测试。对于常见的 HTTP 接口&…

实现共模噪声电流相互抵消的方法

共模传导路径中噪声电流相互抵消&#xff0c;从而使总的共模电流减小&#xff0c; 终达到降噪的目的。目前为实现共模噪声电流相互抵消&#xff0c;主要是采用动点电容抵消法。 动点电容抵消法原理 动点电容抵消法就是选取合适的动点&#xff0c;添加原副边跨接电容&#xff0c…

如何判断应该设计类、子类、抽象类或接口?

如何判断应该设计类、子类、抽象类或接口&#xff1f; 1、设计新类1.1 原则1.2 解释1.3 示例 2、设计子类2.1 原则2.2 解释2.3 示例 3、设计抽象类额3.1 原则3.2 解释3.3 示例 4、设计接口4.1 原则4.2 解释4.3 示例 来源&#xff1a;《Head First Java》第二版&#xff1a;227 …