使用cannal+rabbitmq在springcloud下做数据监听

1.1. 开启 MySQL 的 binlog 日志

1.修改 my.cnfmy.ini(windows), 添加配置项:

# 打开binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog-format=ROW
# 配置MySQL replaction需要定义,不要和canal的slaveId重复
server_id=1

2.重启 mysql 服务后, 查看配置变量是否生效:

+---------------------------------+----------------------+
| Variable_name          | Value        |
+---------------------------------+----------------------+
| log_bin             | ON          |
| log_bin_basename        | D:\env\mysql-5    |
| log_bin_index          | D:\env\mysql-5.index |
| log_bin_trust_function_creators | OFF         |
| log_bin_use_v1_row_events    | OFF         |
| sql_log_bin           | ON          |
+---------------------------------+----------------------+
6 rows in set, 1 warning (0.00 sec)

1.2. 項目配置

1.2.1. 引入依賴


    org.springframework.cloud
    spring-cloud-starter-stream-rabbit

1.2.2. 配置文件

spring:
  cloud:
    stream:
      bindings:
        ## output
        cannal_channel:
          destination: cannal_channel
          ## 死信配置和消費group一致
          producer:
            requiredGroups: ${spring.application.name}
        ## input
        cannal_channel_input:
            destination: cannal_channel
            ## 消費分組
            group: ${spring.application.name}
            ## 重試
            consumer:
              max-attempts: 1
      rabbit:
        bindings:
          cannal_channel_input:
            consumer:
              #这个参数为true的时候会自动为当前的队列创建一个死信队列,以dlq结尾
              auto-bind-dlq: true
              # 进入死信时携带错误消息
              republish-to-dlq: true

1.2.3. 创建绑定接口


public interface CannalBinding {
​
​
    @Output("cannal_channel")
    MessageChannel channel();
​
    String CHANNEL_INPUT = "cannal_channel_input";
    @Input(CHANNEL_INPUT)
    MessageChannel channelInput();
}

1.2.4. 创建监听

@Slf4j
@EnableBinding({CannalBinding.class})
@Service("CannalService")
public class CannalService {
​
    @Autowired
    private CannalBinding cannalBinding;
​
    @StreamListener(CannalBinding.CHANNEL_INPUT)
    private void receiver(Object message) {
        System.out.println("template" + message.toString());
        JSONObject jsonObject = JSONObject.parseObject(message.toString());
//        if (Objects.nonNull(jsonObject)) {
//            throw new ApiException("特殊报错的");
//        }
    }
}

1.2.5. 启动程序 rabbitmq里就会自动创建好监听的交换机和队列

使用cannal+rabbitmq在springcloud下做数据监听_第1张图片使用cannal+rabbitmq在springcloud下做数据监听_第2张图片

1.3. 安装单机 canal

1.3.1. 下载安装

sudo wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.deployer-1.1.5-SNAPSHOT.tar.gz
sudo tar -zxvf canal.deployer-1.1.5-SNAPSHOT.tar.gz

1.3.2. 配置文件

1.3.2.1. 节点配置文件 canal.properties

canal.ip = 192.168.2.108
# register ip to zookeeper, 注册到 ZK 的 IP 地址, 如下图1.
canal.register.ip = 192.168.2.108
​
canal.zkServers = zk集群
​
# tcp, kafka, RocketMQ, 最新版本 1.1.5 可以直接连接 rabbitmq
canal.serverMode = rabbitmq
​
# destinations, 当前 server 上部署的 instance 列表, 对应各个实例文件夹(../conf/)名称
canal.destinations = example
​
# 设置 mq 服务器地址, 此处为 rabbitmq 的服务器地址
# !! 此处下载后默认的配置是有配置IP:端口的
# rabbitmq 此处则不需要配置端口
canal.mq.servers = 192.168.208.100
​
# 一下几项均为 1.1.5 新版本新增支持 rabbitmq 的配置
canal.mq.vhost=/
canal.mq.exchange=cannal_channel # 指定 rabbitmq 上的 exchange 名称
canal.mq.username=admin # 连接 rabbitmq 的用户名
canal.mq.password=**** # 连接 rabbitmq 的密码
canal.mq.aliyunuid=

1.3.2.2. 实例配置文件 instance.properties

# position info, 数据库的连接信息
canal.instance.master.address=192.168.2.108:3306
# 以下两个配置, 需要在上面配置的 address 的数据库中执行 `SHOW MASTER STATUS` 获取的 `File` 和 `Position` 两个字段值
canal.instance.master.journal.name=mysql-bin.00001
canal.instance.master.position=674996
​
# table meta tsdb info, 禁用 tsdb 记录 table meta 的时间序列版本
canal.instance.tsdb.enable=false
​
# username/password, 实例连接数据的用户名和密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
​
# table regex, 正则匹配需要监听的数据库表
canal.instance.filter.regex=ysb\\.useropcosttimes_prod
​
# mq config, 指定 rabbitmq 设置绑定的路由 #代表全部
canal.mq.topic=#

1.3.3. 启动 canal 服务

Linux 对应的启动脚本 ./bin/startup.sh, Windows 对应的启动脚本 ./bin/startup.bat

 

1.3.4. 修改数据库数据即可看到相应消费消息

 

1.4. 参考资料

1、https://www.jb51.net/article/207089.htm

你可能感兴趣的:(rabbitmq,java,mysql)