修改canal原始碼實現修改留痕功能

2022-09-13 16:06:10 字數 1686 閱讀 7830

業務需求:使用者每次修改資料,都要記錄修改留痕資訊;

形如:【訂單號】由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的值

修改資料庫訂單資料,檢視控制台,發現已經拿到我們要的所有資料了。技術預研完成。

留痕還要求記錄操作員,可以約束所有表都固定定義操作人欄位。

原始碼分析Canal專欄

canal 是阿里開源的基於 mysql binlog 資料同步元件,是網際網路架構中資料異構的重磅元件,本專欄將從原始碼的角度 其實現原理 實現細節,有利於更好的駕馭好canal。1 資料異構之 canal 初探 技巧篇 2 一文詳解 canal instance 設計理念與定製開發思路 3 ca...

記憶體修改器實現原始碼

include stdafx.h include include include includeusing namespace std dword g arlist 1024 int g nlistcnt handle g hprocess bool writememory dword dwaddr...

pppd 原始碼修改1

1.pppd撥號成功後,會將解析到的dns伺服器ip位址,寫入 etc ppp resolv.conf 這樣的話,gethostbyname r並不會識別,並且,如果有啟動兩路pppd的話,後面一路會將resolv.conf檔案重寫。因此,這塊 需要修改。在pppd ipcp.c檔案中,修改crea...