一、關於CanalSharp
CanalSharp 是阿裡巴巴開源專案 Canal 的 .NET 客戶端。為 .NET 開發者提供一個更友好的使用 Canal 的方式。Canal 是mysql資料庫binlog的增量訂閱&消費元件。
CanalSharp 是 Canal 的 .NET 客戶端,它與 Canal 是採用的Socket來進行通訊的,傳輸協議是TCP,互動協議採用的是 Google Protocol Buffer 3.0。
CanalSharp的作者是園子裡的曉晨和WithLin。
更多關於CanalSharp的資訊請瀏覽:https://github.com/CanalClient/CanalSharp
更多關於Canal的資訊請瀏覽:https://github.com/alibaba/canal
二、關於CanalSharp.AspNetCore
CanalSharp.AspNetCore是一個基於CanalSharp的適用於ASP.NET Core的一個後臺任務元件,它可以隨著ASP.NET Core實體的啟動而啟動,目前採用輪詢的方式對Canal Server進行監聽(我比較懶,目前主要是借鑒了曉晨的Demo來改寫的),獲得MySql行更改(RowChange)後寫入MySql指定的記錄表中(canal.logs,CanalSharp.AspNetCore會自動幫我們建立這張記錄表)。當然,這隻是我目前的業務需求,完全可以改為事件訂閱+自定義輸出的方式進行完善,這是後話了。
這個專案的GitHub地址為:https://github.com/XiLife-OSPC/CanalSharp.AspNetCore
三、使用前的準備工作
3.1 MySql
當前的canal開源版本支援5.7及以下的版本,針對阿裡雲RDS賬號預設已經有binlog dump許可權,不需要任何許可權或者binlog設定,可以直接跳過這一步。開啟binlog寫入功能,並且配置binlog樣式為row。
修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini的以下內容
log-bin=mysql-bin
binlog-format=Row
server-id=1
重啟資料庫服務,測試修改是否生效
show variables like 'binlog_format';
show variables like 'log_bin';
建立一個使用者Canal用於獲取binlog的使用者並授予許可權
CREATE USER canal IDENTIFIED BY canal;
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal @'%';
FLUSH PRIVILEGES;
3.2 Canal-Server
本文透過Docker方式來啟動Canal-Server,也可以不透過Docker方式來,更多內容可以參考Canal的github。
透過Docker拉取Canal映象:
docker pull canal/canal-server:v1.1.2
透過以下命令啟動Canal實體:
docker run --restart=always --name core_productservice_canal \
-e canal.instance.master.address=192.168.16.150:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.destinations=products \
-e canal.instance.defaultDatabaseName=products_dev \
-e canal.instance.filter.regex=products_dev\\..* \
-e canal.instance.filter.black.regex=products_dev\\.canal.* \
-p 8001:11111 \
-d canal/canal-server:v1.1.2
PS:其中name、destinations、defaultDatabaseName、filter根據要監聽的業務資料庫按需修改。
四、開始使用CanalSharp.AspNetCore
4.1 安裝Nuget包
透過NuGet或專案取用新增該元件,搜尋CanalSharp.AspNetCore
目前最新版本為0.0.3,支援.NET Core 2.1及以上,暫未弄成.NET Standard類庫。
4.2 新增配置檔案項
在配置檔案(appSettings.json)中新增以下配置項:
"Canal": {
"Enabled": true,
"LogSource": "Core.Product.Canal",
"ServerIP": "192.168.16.190", // Canal-Server所在的伺服器IP
"ServerPort": 8001, // Canal-Server所在的伺服器Port
"Destination": "products", // 建議與Canal-Server中配置的destination保持一致
"Filter": "products_dev\\..*", // 建議與Canal-Server中配置的filter保持一致
"SleepTime": 50, // SleepTime越短監聽頻率越高但也越耗CPU
"BufferSize": 2048, // 每次監聽獲取的資料量大小,單位為位元組
"Output": {
"ConnStr": "Server=192.168.16.150;Port=3306;Database=products_dev;Uid=dev;Pwd=xdp" // 要輸出的日誌記錄表所在的資料連線字串
}
}
4.3 在Startup類中註冊
在StartUp類中的Configure方法中加入以下程式碼行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
IApplicationLifetime appLifetime, ILogger defaultLogger)
{
......
app.RegisterCanalSharpClient(appLifetime, Configuration, defaultLogger);
}
五、效果演示
當在指定要監聽的資料庫對某張表的某行資料進行Update或Delete操作後,又或者進行Insert行操作後,canal.logs表會自動記錄變更的記錄資料如下圖:
PS:INSERT操作會記錄新增的資料行資料到CurrentValue列,DELETE操作會記錄刪除的資料行資料到PreviousValue列,UPDATE操作則會記錄修改前PreviousValue和修改後的值CurrentValue。對於INSERT和DELETE會生成JSON格式的字串,例如“{“Id”:”12312″,”Name”:”精裝主材”,”Description”:”測試描述”,….}”這種。
六、示例專案
點這裡:CanalSharp.AspNetCore.Sample
Code有點亂,還沒時間做重構和最佳化,先就這樣吧。
參考資料
李志強,《CanalSharp-mysql資料庫binlog的增量訂閱&消費元件Canal的.NET客戶端》
CanalSharp GitHub
朋友會在“發現-看一看”看到你“在看”的內容