写点什么

springboot 整合 canal

作者:@下一站
  • 2022-11-30
    陕西
  • 本文字数:1818 字

    阅读完需:约 6 分钟

springboot整合canal

一、cannal 用户创建

在原来搭建的主库 3306 上面新创建一个用户,给 canal 使用。

create user canal@'%'; ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
复制代码

重启 mysql 容器即可

docker restart  atguigu-mysql-master
复制代码

二、安装 Canal

这里没有设置密码,如果需要设置密码自己加上就行了。

docker run -p 11111:11111 --name canal \-e canal.destinations=myCannal \-e canal.instance.master.address=192.168.2.203:3306  \-e canal.instance.dbUsername=canal  \-e canal.instance.dbPassword=123456  \-e canal.instance.connectionCharset=UTF-8 \-e canal.instance.tsdb.enable=true \-e canal.instance.gtidon=false  \-e canal.instance.filter.regex=.*\\..* \-d canal/canal-server:v1.1.5
复制代码

注意:IP 需要替换为自己的 IP

说明:

-p 11111:11111:这是 canal 的默认监听端口

-e canal.instance.master.address=ip:3306:数据库地址和端口,如果不知道 mysql 容器地址,可以通过 docker inspect 容器 id 来查看

-e canal.instance.dbUsername=canal:数据库用户名

-e canal.instance.dbPassword=123456 :数据库密码

-e canal.instance.filter.regex=:要监听的表名称

mysql 数据解析关注的表,Perl正则表达式.多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\) 常见例子:1.  所有表:.*   or  .*\\..*2.  canal schema下所有表: canal\\..*3.  canal下的以canal打头的表:canal\\.canal.*4.  canal schema下的一张表:canal.test15.  多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2 
复制代码

 三、springboot 整合 canal

1.引入 pom

<dependency>    <groupId>top.javatool</groupId>    <artifactId>canal-spring-boot-starter</artifactId>    <version>1.2.1-RELEASE</version></dependency>
复制代码

2.修改配置文件

#canal配置canal.destination=myCannalcanal.server=192.168.2.203:11111
复制代码

3.修改实体类

加上了主键 @Id 和对应的   @Column(name = "uname") 其实如果此处的命名与数据库一致的 haul 是可以不用写的。

package com.atguigu.shargingjdbcdemo.entity; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data; import javax.persistence.Column;import javax.persistence.Id;  @TableName("t_user")//逻辑表@Datapublic class User {     @TableId(type = IdType.AUTO)    @Id    private Long id;    @Column(name = "uname")    private String uname;}
复制代码

4.实现监听处理器

package com.atguigu.shargingjdbcdemo.handler; import com.atguigu.shargingjdbcdemo.entity.User;import org.springframework.stereotype.Component;import top.javatool.canal.client.annotation.CanalTable;import top.javatool.canal.client.handler.EntryHandler; /** * @author Administrator */@CanalTable("t_user")@Componentpublic class UserHandler implements EntryHandler<User> {     @Override    public void insert(User user) {        System.out.println("新增用户");        System.out.println("user = " + user);    }     @Override    public void update(User before, User after) {        System.out.println("修改用户");        System.out.println("修改用户before:" + before);        System.out.println("修改用户after:" + after);    }     @Override    public void delete(User user) {        System.out.println("删除用户user = " + user);    } }
复制代码


四、整合测试


 启动以后控制台会打印一下语句,说明客户端在监听服务端了,等待服务端发送的消息。如果此时 mysql 数据发生了改变,那么 canal 服务端就能通过 binlog 进行监控感知,而后会给我们的客户端发送监听到的变化消息。

测试修改

我在主库修改了用户数据,这里就监听到了变化之前和变化之后的数据。这样我们后面就能够通过 canal 来保证缓存数据的一致行了。

OK,到这一步,我们的 canal 就算整合进来了。下一步就是 redis 哨兵集群搭建以及本地缓存开启来实现多级缓存,以及通过 canal 来保证数据的一致性了。

发布于: 刚刚阅读数: 3
用户头像

@下一站

关注

懒人 2020-11-22 加入

都是黄泉预约客,何必难为每一天,执念太强,无法豁然。

评论

发布
暂无评论
springboot整合canal_Java_@下一站_InfoQ写作社区