背景:
canal-adaptor的配置文件有两种方式:

一、直接使用本地配置文件的方式
总配置文件 application.yml
adapter定义配置部分

canal.conf:
  canalServerHost: 127.0.0.1:11111          # 对应单机模式下的canal server的ip:port
  zookeeperHosts: slave1:2181               # 对应集群模式下的zk地址, 如果配置了canalServerHost, 则以canalServerHost为准
  mqServers: slave1:6667 #or rocketmq       # kafka或rocketMQ地址, 与canalServerHost不能并存
  flatMessage: true                         # 扁平message开关, 是否以json字符串形式投递数据, 仅在kafka/rocketMQ模式下有效
  batchSize: 50                             # 每次获取数据的批大小, 单位为K
  syncBatchSize: 1000                       # 每次同步的批数量
  retries: 0                                # 重试次数, -1为无限重试
  timeout:                                  # 同步超时时间, 单位毫秒
  mode: tcp # kafka rocketMQ                # canal client的模式: tcp kafka rocketMQ
  srcDataSources:                           # 源数据库
    defaultDS:                              # 自定义名称
      url: jdbc:mysql://127.0.0.1:3306/mytest?useUnicode=true   # jdbc url 
      username: root                                            # jdbc 账号
      password: 121212                                          # jdbc 密码
  canalAdapters:                            # 适配器列表
  - instance: example                       # canal 实例名或者 MQ topic 名
    groups:                                 # 分组列表
    - groupId: g1                           # 分组id, 如果是MQ模式将用到该值
      outerAdapters:                        # 分组内适配器列表
      - name: logger                        # 日志打印适配器
......

二、使用远程配置的方式。使用canal_manager.sql脚本建表并初始化Demo数据,其中canal_config表id=2的数据对应adapter下的application.yml文件,canal_adapter_config表对应每个adapter的子配置文件
修改bootstrap.yml配置

canal:
  manager:
    jdbc:
      url: jdbc:mysql://127.0.0.1:3306/canal_manager?useUnicode=true&characterEncoding=UTF-8
      username: root
      password: 121212

修改mysql中的配置信息后会自动刷新到本地动态加载相应的实例或者应用

问题:
使用本地配置文件可以正常运行canal-adaptor,
但是使用远程配置文件的方式发现一直不生效

解决

主要原因:在1.1.7中远程配置的开关是默认关闭的,要打开才行,改动在startup.sh中:,主要是加上这个:-Dspring.cloud.bootstrap.enabled=true

JAVA_OPTS=" $JAVA_OPTS -Dspring.cloud.bootstrap.enabled=true -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dfile.encoding=UTF-8"
echo "JAVA_OPTS: $JAVA_OPTS" >>javaopt.txt
ADAPTER_OPTS="-DappName=canal-adapter"

for i in $base/lib/*;
    do CLASSPATH=$i:"$CLASSPATH";
done

docker启动adaptor

这里用dockerfile的方式来启动adaptor,内容如下:

FROM mirrors.tencent.com/tjdk/tencentkona8-tlinux:latest AS builder
ADD https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.adapter-1.1.7.tar.gz /opt/adapter/
RUN yum install -y which
RUN yum install -y file
RUN yum install -y procps-ng
WORKDIR /opt/adapter
RUN tar -xzf /opt/adapter/canal.adapter-1.1.7.tar.gz -C /opt/adapter/
COPY conf /opt/adapter/conf/
COPY startup.sh /opt/adapter/bin/startup.sh
COPY ["entrypoint.sh", "/"]
RUN chmod a+x /entrypoint.sh
ENTRYPOINT /entrypoint.sh
EXPOSE 9922

entrypoint.sh:

#!/bin/sh
set -e
Conf_Dir=/opt/adapter/conf


sh /opt/adapter/bin/startup.sh
tail -F /opt/adapter/logs/adapter/adapter.log

最后的远程配置内容:

canal_adaptor_config:

解决canaladaptor-1.1.7使用远程配置文件不生效的问题和用docker启动canal-adaptor_docker


content:

dataSourceKey: defaultDS2
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  database: galileo
  table: t_port_monitor_config
  targetTable: t_port_monitor_config
  targetPk:
    id: id
  mapAll: true
  commitBatch: 5000

canal_config:

解决canaladaptor-1.1.7使用远程配置文件不生效的问题和用docker启动canal-adaptor_容器_02