• springboot整合canal


    该篇博客是基于前两篇的基础上来实现的,如果没有看过可以看一下前面的步骤

    使用docker搭建 MYSQL主从_极速小乌龟的博客-CSDN博客docker 上面搭建mysql主从服务器https://blog.csdn.net/qq_35771266/article/details/128101019?spm=1001.2014.3001.5501

    ShardingSphere-JDBC读写分离_极速小乌龟的博客-CSDN博客mysql主从 + redis哨兵集群 + canal + 本地缓存的实现。https://blog.csdn.net/qq_35771266/article/details/128101972?spm=1001.2014.3001.5501

    一、cannal用户创建

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

    1. create user canal@'%';
    2. ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    3. GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
    4. FLUSH PRIVILEGES;

    重启mysql容器即可

    docker restart  atguigu-mysql-master

    二、安装Canal

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

    1. docker run -p 11111:11111 --name canal \
    2. -e canal.destinations=myCannal \
    3. -e canal.instance.master.address=192.168.2.203:3306  \
    4. -e canal.instance.dbUsername=canal  \
    5. -e canal.instance.dbPassword=123456  \
    6. -e canal.instance.connectionCharset=UTF-8 \
    7. -e canal.instance.tsdb.enable=true \
    8. -e canal.instance.gtidon=false  \
    9. -e canal.instance.filter.regex=.*\\..* \
    10. -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=:要监听的表名称
    1. mysql 数据解析关注的表,Perl正则表达式.
    2. 多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
    3. 常见例子:
    4. 1. 所有表:.* or .*\\..*
    5. 2. canal schema下所有表: canal\\..*
    6. 3. canal下的以canal打头的表:canal\\.canal.*
    7. 4. canal schema下的一张表:canal.test1
    8. 5. 多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2

     三、springboot整合canal

    1.引入pom

    1. <dependency>
    2. <groupId>top.javatool</groupId>
    3. <artifactId>canal-spring-boot-starter</artifactId>
    4. <version>1.2.1-RELEASE</version>
    5. </dependency>

    2.修改配置文件

    1. #canal配置
    2. canal.destination=myCannal
    3. canal.server=192.168.2.203:11111

    3.修改实体类

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

    1. package com.atguigu.shargingjdbcdemo.entity;
    2. import com.baomidou.mybatisplus.annotation.IdType;
    3. import com.baomidou.mybatisplus.annotation.TableId;
    4. import com.baomidou.mybatisplus.annotation.TableName;
    5. import lombok.Data;
    6. import javax.persistence.Column;
    7. import javax.persistence.Id;
    8. @TableName("t_user")//逻辑表
    9. @Data
    10. public class User {
    11. @TableId(type = IdType.AUTO)
    12. @Id
    13. private Long id;
    14. @Column(name = "uname")
    15. private String uname;
    16. }

    4.实现监听处理器

    1. package com.atguigu.shargingjdbcdemo.handler;
    2. import com.atguigu.shargingjdbcdemo.entity.User;
    3. import org.springframework.stereotype.Component;
    4. import top.javatool.canal.client.annotation.CanalTable;
    5. import top.javatool.canal.client.handler.EntryHandler;
    6. /**
    7. * @author Administrator
    8. */
    9. @CanalTable("t_user")
    10. @Component
    11. public class UserHandler implements EntryHandler {
    12. @Override
    13. public void insert(User user) {
    14. System.out.println("新增用户");
    15. System.out.println("user = " + user);
    16. }
    17. @Override
    18. public void update(User before, User after) {
    19. System.out.println("修改用户");
    20. System.out.println("修改用户before:" + before);
    21. System.out.println("修改用户after:" + after);
    22. }
    23. @Override
    24. public void delete(User user) {
    25. System.out.println("删除用户user = " + user);
    26. }
    27. }

    四、整合测试

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

    测试修改

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

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

    如果文章对你有所帮助的话,能够给我个五星票吗~拜谢

    https://bbs.csdn.net/topics/611391073

  • 相关阅读:
    Kibana:摄入 GeoJSON 数据
    (vue)Js 获取剪贴板值
    线程 Pthread API
    Android 通知
    JVM相关面试题(每日一练)
    python web框架 flask基础入门教程
    D136-002-005带D138-002-002加密狗
    从JDK8升级到JDK17
    Linux线程概况
    华为机试 - 水仙花数Ⅱ
  • 原文地址:https://blog.csdn.net/qq_35771266/article/details/128102181