前言:
因为网上rabbitmq整合canal的教程较少,几乎没有,所以我自己摸索了一下,并成功整合,并分享一下详细步骤,期间遇到的bug蛮多的。
第一步,安装mysql并编写配置
安装完创建好用户之后,在my.cnf文件中添加以下配置:
[mysqld] log-bin=mysql-bin binlog-format=ROW server_id=1
在数据库下执行以下语句可查询是否开启:
SHOW VARIABLES LIKE 'binlog_format'; SHOW VARIABLES LIKE 'log_bin';
第二步,安装canal并编写配置
1、修改conf目录下的canal.properties
canal.serverMode = rabbitMQ rabbitmq.host = 127.0.0.1 rabbitmq.virtual.host = / # rabbitmq中新建的 Exchange rabbitmq.exchange = canal_exchange rabbitmq.username = guest rabbitmq.password = guest
2、修改conf/example下的instance.properties
canal.instance.master.address=127.0.0.1:3306 # mysql中配置的用于同步的canal用户 canal.instance.dbUsername=root canal.instance.dbPassword=123456 # rabbitmq中配置的 绑定的 routingkey canal.mq.topic=canal_key
第三步、安装rabbitmq并用创建交换机及队列
这里我们直接用java代码,执行程序之前会自动创建exchange和queue并绑定它们
import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CanalConfig { @Bean Queue queue(){ return new Queue("canal_queue"); } @Bean DirectExchange directExchange(){ return new DirectExchange("canal_exchange01"); } @Bean Binding binding(){ return BindingBuilder.bind(queue()).to(directExchange()).with("canal_key"); } }
第四步、创建boot项目并添加依赖
<!--canal依赖--> <dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.6</version> </dependency> <!--rabbitmq依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
第五步、编写rabbitmq监听器
import org.springframework.amqp.rabbit.annotation.*; import org.springframework.stereotype.Component; /** * Canal消息消费者 */ @Component public class CanalComsumer { @RabbitHandler @RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "canal_queue"), exchange = @Exchange(value = "canal_exchange01"), key = "canal_key")}) public void process(String testMessage) { System.out.println("++++++++++++++++++++++"); System.out.println("testMessage = " + testMessage); } }
注意:canal 1.1.5版本之前是不能使用rabbitmq的,所以我们这次使用的是1.1.6版本的