在上面两篇中,我们从基本概念理解了canal是一个哪些项目,能应用于哪些场景,之后通过一个demo体验,有了基本的体感和认识。
从这一篇开始,我们将从源码入手,深入学习canal的实现形式。了解canal相关功能的实现方法,其中有好多机制是十分值得深入了解的,从代码实现角度去学习实时数据订阅与同步的实现与核心技术点。其实,假如要在生产中使用这个开源项目,了解源码更是必不可少,是解决问题和新特点订制的前提条件。
本文使用的版本是1.1.4,这也是笔者写这篇博客时的最新稳定版。
1.打算工作
下载源码
git clone https://github.com/alibaba/canal.git
切换到1.1.4这个tag
git checkout canal-1.1.4
或则可以关注我的源码注释版本(正在不断更新中)
https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal
2.canal项目模块介绍
canal项目是基于maven建立的,将不同的功能模块界定了不同的子模块。
我们可以简单执行可执行模块deployer,也可以将模块通过maven依赖的方法,将你须要的子模块引入到你自己的项目中进行使用开发。
简单介绍下核心模块的功能:
3.模块关联
那这种模块之间是怎样组织、如何关联的呢?
我们从整体到局部来看一下。
整体构架关联,包括admin模块、server模块、client-adapter模块
1)server模块是服务端核心模块,拿来拉取binlog的实时变更,之后投递到顾客端。
2)server可以通过配置,选择投递到MQ,或则是启动一个nettygps 协议解析 源代码,让顾客端来拉取。
3)client-adapter就是一个独立布署到服务,可以直接拉取canal-server的消息(或则拉取mq的消息),转发到对应RDS/Redis/HBase,其实,你也可以自己实现一个转发到redis的adapter
4)admin模块是管理控制台,可以调度canal-server组成一个个集群实现instance的高可用、可以修改server、instance的配置信息。
Canal-server模块局部关系,包括deployer模块、server模块、instance模块、parser模块、sink模块、store模块、meta模块、client模块。
1)deployer模块是一个启动模块,可以启动canal-server。
2)一个server是一个独立应用,是一个jvm进程,上面可以有多个instance对象。
3)instance内包括了parser、sink、store、meta
4)parser负责获取binlog变更,之后sink将parser获取的binlog变更转换为event,存入store。
5)meta是元信息管理器
6)client模块可以内嵌入你的应用,拿来消费canal-server的消息风波。
基本上核心模块的关系就是这样了,后续会根据模块的维度进行源码剖析,敬请期盼。
都听到最后了,原创不易,点个关注gps 协议解析 源代码,点个赞吧~
知识碎片重新梳理,建立Java知识图谱:github.com/saigu/JavaK…(历史文章查阅十分便捷)
暂无评论内容