【Canal源码分析】Canal Server的启动和停止过程

本文深入解析Canal Server的启动和停止过程,包括加载配置文件、构造CanalController的详细步骤,如初始化全局参数、实例配置、SocketChannel、系统目录、监控,以及启动CanalController时的工作节点创建、embeded服务、HA启动、instance文件扫描和网络接口启动等关键环节。

本文主要解析下canal server的启动过程,希望能有所收获。

一、序列图

1.1 启动

image

1.2 停止

image

二、源码分析

整个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 replace by 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值