本文主要解析下canal server的启动过程,希望能有所收获。
一、序列图
1.1 启动
1.2 停止
二、源码分析
整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明。
首先程序的入口在CanalLauncher的main方法中。
2.1 加载配置文件
String conf = System.getProperty("canal.conf", "classpath:canal.properties");
Properties properties = new Properties();
if (conf.startsWith(CLASSPATH_URL_PREFIX)) {
conf = StringUtils.substringAfter(conf, CLASSPATH_URL_PREFIX);
properties.load(CanalLauncher.class.getClassLoader().getResourceAsStream(conf));
} else {
properties.load(new FileInputStream(conf));
}
从canal.properties文件中load所有的配置信息,加载到上下文中。不再赘述。
2.2 构造CanalController
根据配置文件来构造CanalController,这块的代码比较多,主要分为七个步骤,具体如下。
2.2.1 初始化全局参数配置
调用initGlobalConfig方法,过程如下:
- 判断运行模式,是从spring加载还是manager加载,目前开源版本建议使用spring
- 获取是否懒加载
- 如果是manager模式启动,获取manager的ip地址;如果是spring模式启动,获取spring xml的文件地址,加载到全部配置中
- 构造一个实例构造器CanalInstanceGenerator,我们用到的就是在spring的beanFactory中加上destination的bean,这个destination就是canal instance的名称
这块逻辑在CanalController的initGlobalConfig方法中。
2.2.2 初始化实例配置
这块的逻辑是从instance.properties里面初始化实例。
private void initInstanceConfig(Properties properties) {
String destinationStr = getProperty(properties, CanalConstants.CANAL_DESTINATIONS);
String[] destinations = StringUtils.split(destinationStr, CanalConstants.CANAL_DESTINATION_SPLIT);
for (String destination : destinations) {
InstanceConfig config = parseInstanceConfig(properties, destination);
InstanceConfig oldConfig = instanceConfigs.put(destination, config);
if (oldConfig != null) {
logger.warn("destination:{} old config:{} has rep