修改canal源码实现修改留痕功能

业务需求:用户每次修改数据,都要记录修改留痕信息;

形如:【订单号】由1001改为1002,【备注】由空改为 “客户要求修改订单号”

之前做法是业务代码主动写结合aop统一拦截写日志。

动手开始做技术预研:

简化的order数据表结构如下:

偶然看到canal后,立刻想到,可以借助canal实现这个需求,业务系统可以和修改留痕功能解耦。

首先看看canal解析binlog后封装的数据结构

可以发现里面列信息缺少【注释】这个元数据。诸如是否主键,是否为空,字段类型这些都有,说明canal后台只是取了部分原数据。

现在有两条路

1:客户端缓存数据库元数据。

2:改下canal源代码,返回注释这个元数据。

现在说下方式二

查看代码,寻找解析binlog的代码,最终定位到com.alibaba.otter.canal.parse.inbound.mysql.dbsync.LogEventConvert类的如下方法,可以看到里面有处理元数据的代码

看来是用columnBuilder来封元数据

进一步检查原数据获取方法

发现用的是desc,这个函数是不会返回注释信息的,下图1是desc,只返回6列数据,下图2可以看到有返回注释字段

 

 

 

修改代码换成show full fields语句。

 

 获取到了,现在就是怎么传回去,查看阿里定义的列数据结构,发现已经有预留扩展了。下图的props字段

修改之前的组装代码,增加如下代码,将注释放入props中,这里偷懒使用了阿里原来的extra字段来存储,一来反正是技术预研,而来这个extra对我没用,正式的肯定会增加字段的存储的。

 

 运行程序CanalLauncher,启动服务

然后运行阿里自带的实例客户端,增加输出props的值

修改数据库订单数据,查看控制台,发现已经拿到我们要的所有数据了。技术预研完成。

 

 

 留痕还要求记录操作员,可以约束所有表都固定定义操作人字段。

 

posted @ 2017-09-15 16:51  java林森  阅读(733)  评论(0)    收藏  举报