该篇博客是基于前两篇的基础上来实现的,如果没有看过可以看一下前面的步骤
在原来搭建的主库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
这里没有设置密码,如果需要设置密码自己加上就行了。
- 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
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
{ -
- @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来保证数据的一致性了。
如果文章对你有所帮助的话,能够给我个五星票吗~拜谢