一、简介
通过deployer模块,我们可以直接使用maven打出一个Canal可执行包,项目结构包括:
- bin项目启动/停止/初始化脚本
- conf项目配置文件
- lib项目依赖jar
- logs项目执行的日志目录
二、源码分析
- 1)Canal启动的类是CanalLauncher,通过解析配置文件,调用CanalStater.start(properties),这里CanalStater->CanalStarter,感觉可能是类名弄错了,这个类不复杂。
- 2)CanalStater首先会判断是否是使用MQ来接收binlog的,Canal支持将binlog直接发送的kafka或者RocketMQ中。然后启动CanalController这个类的start方法。
- 3)CanalController这个是比较复杂的类,里面包括Canal实例及嵌入式服务的启动,我在代码里加了注释方便理解。
1 | // 构造方法很长 |
接着调用start方法:
1 | public void start() throws Throwable { |
三、嵌入式服务启动
在CanalController start中调用embededCanalServer.start(destination)启动相应destination的嵌入式服务,这里在调用相应(destination)实例的start方法启动,这个实例是如果产生的?是通过CanalController中的instanceGenerator生成的,具体有两种生成方式:
- 1)ManagerCanalInstanceGenerator()
这种方式在阿里云内部使用 - 2)SpringCanalInstanceGenerator()
这种方式社区使用较多,我们以这种方式来分析
默认使用的sprint配置文件是通过canal.properties中配置的的canal.instance.global.spring.xml = classpath:spring/file-instance.xml
也就是file-instance.xml了,查找配置中id为”instance”的bean即可。
这里是CanalInstanceWithSpring这个类,原来是调用他的start的方法,他的start的方法的实现是在父类AbstractCanalInstance中。
1 | public void start() { |
Start方法很明确了,调用instance中meta、alarm、store、sink、parse的start方法,接下来一个个分析相应的模块。