⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.tianshouzhi.com/api/tutorials/canal 「田守枝」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

canal是阿里巴巴开源的mysql数据库binlog的增量订阅&消费组件。项目github地址为:https://github.com/alibaba/canal

本教程是从源码的角度来分析canal,适用于对canal有一定基础的同学。本教程使用的版本是1.0.24,这也是笔者写这篇教程时的最新稳定版,关于canal的基础知识可以参考:https://github.com/alibaba/canal/wiki

下载项目源码

下载

git clone https://github.com/alibaba/canal.git

切换到canal-1.0.24这个tag

git checkout canal-1.0.24

源码模块划分

canal是基于maven构建的,总共分成了14个模块,如下所示:

Image.png

模块虽多,但是每个模块的代码都很少。各个模块的作用如下所示:

**common模块:**主要是提供了一些公共的工具类和接口。

**client模块:**canal的客户端。核心接口为CanalConnector

**example模块:**提供client模块使用案例。

**protocol模块:**client和server模块之间的通信协议

**deployer:**部署模块。通过该模块提供的CanalLauncher来启动canal server

**server模块:**canal服务器端。核心接口为CanalServer

**instance模块:**一个server有多个instance。每个instance都会模拟成一个mysql实例的slave。instance模块有四个核心组成部分:parser模块、sink模块、store模块,meta模块。核心接口为CanalInstance

**parser模块:**数据源接入,模拟slave协议和master进行交互,协议解析。parser模块依赖于dbsync、driver模块。

**driver模块和dbsync模块:**从这两个模块的artifactId(canal.parse.driver、canal.parse.dbsync),就可以看出来,这两个模块实际上是parser模块的组件。事实上parser 是通过driver模块与mysql建立连接,从而获取到binlog。由于原始的binlog都是二进制流,需要解析成对应的binlog事件,这些binlog事件对象都定义在dbsync模块中,dbsync 模块来自于淘宝的tddl。

**sink模块:**parser和store链接器,进行数据过滤,加工,分发的工作。核心接口为CanalEventSink

**store模块:**数据存储。核心接口为CanalEventStore

**meta模块:**增量订阅&消费信息管理器,核心接口为CanalMetaManager,主要用于记录canal消费到的mysql binlog的位置,

下面再通过一张图来说明各个模块之间的依赖关系:

Image.png

​ 通过deployer模块,启动一个canal-server,一个cannal-server内部包含多个instance,每个instance都会伪装成一个mysql实例的slave。client与server之间的通信协议由protocol模块定义。client在订阅binlog信息时,需要传递一个destination参数,server会根据这个destination确定由哪一个instance为其提供服务。

在分析源码的时候,本人也是按照模块来划分的,基本上一个模块对应一篇文章。

文章目录
  1. 1. 下载项目源码
  2. 2. 源码模块划分