springboot整合canal

举报
torchstar 发表于 2022/11/30 22:52:18 2022/11/30
【摘要】 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.test1
5.  多个规则组合使用然后以逗号隔开: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=myCannal
canal.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")//逻辑表
@Data
public 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")
@Component
public 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来保证数据的一致性了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。