一.基于Canal, 开发数据监控微服务
1. Canal: 阿里开源, java开发, 监控数据库 -> 双机房数据同步
(1) 工作原理: canal -> 伪装成mysql备份机 -> mysql数据改变 -> 数据写入 binary log -> 日志发送到Canal -> canal提取mysql更新数据
(2) Canal 环境部署 - LINUX虚拟机:
1) mysql开启binlog模式, 值ON已开启, OFF未开启
SHOW VARIABLES LIKE '%log_bin%'
2) 修改 /etc/my.cnf 开启binlog模式
[mysql]
log-bin=mysql-bin
binlog-format=ROW
server_id=1
3) 重启mysql: mysql -h localhost -u root -p
4) 使用root账号 -> 创建用户 -> 授予权限
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION, SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
5) canal服务端安装:
a. 下载地址: https://github.com/alibaba/canal/releases/tag/canal-1.0.24
b. 上传到linux系统, 解压到目录 /usr/local/canal
c. 修改exmaple下的实例配置:
#position info
canal.instance.master.address=192.168.200.128:3306
#username/password
canal.instance.dbusername=canal
canal.instance.dbpassword=canal
#注释掉这个参数, 开启扫描全库
#canal.instance.defaultDatabaseName=
6) 启动服务: [root@localhost canal]# ./bin/startup.sh
7) 查看日志: cat /usr/local/canal/logs/canal/canal.log
(3) 整合Canal+springboot源码包 -> 添加到maven仓库
1) 下载canal整合包spring-boot-start-canal:
https://github.com/chengqian56131/spring-starter-canal
2) 解压进入starter-canal: cmd
3) cd spring-boot-starter-canal-master/starter-canal
4) mvn指令: mvn clean install -DskipTest
5) 进入本地仓库 -> 搜索xpand -> 已安装在目录 repository/com
2. 数据监控微服务 changgou_canal:
(1) 添加依赖: start-canal / spring-rabbit
(2) 启动类CanalApplication:
@EnableCanalClient //声明是canal的客户端
@SpringBootApplication
(3) 配置application.properties:
canal.client.instances.example.host=192.168.200.128 //连接主机
canal.client.instances.example.port=11111
canal.client.instances.example.batchSize=1000 //批大小,每次数据库交互处理1000条数据
spring.rabbitmq.host=192.168.200.128 //连接rabbitmq
(4) 测试监听类 -> com.changgou.canal.listener.BusinessListener
@CanalEventListener //声明当前类是canal监听类
public class BusinessListener{
@ListenPoint(schema="changgou_business", table="tb_ad")//监听方法注解, 监听的库名和表名
public void addUpdate(CanalEntry.EventType e, CanalEntry.RowData r) //监听方法
//eventType: 当前操作数据库的类型
//rowData : 当前操作数据库的数据
rowData.getBeforeColumnslist(); //改变前的数据
rowData.getAfterColumnsList(); //改变后的数据
二. 基于Canal, 更新首页广告缓存
1. 需求: 广告表tb_ad数据改变 -> canal获取binlog数据 -> changgou_canal微服务获取字段"position" -> 发送消息到rabbitmq -> 运营微服务获取消息"position" -> 调用nginx中的ad_update.lua脚本 -> 更新缓存
2. 第一部分代码: tb_ad数据改变 -> canal监控 -> 发送到mq
(1) canal微服务->添加 config包