关于Canal的入门、安装以及Java客户端操作在网上已经有许多的教程,但有关golang客户端操作的并不多。这里根据Canal的官方文档,分享一下我通过golang实现Canal客户端操作的代码。
一、搭建canal服务端
这部分内容可以参考官方文档,及其他的有关canal服务端搭建的教程,方法都是一样的,不再重复。
二、golang实现Canal客户端操作
首先导入用到的库
import (
"github.com/withlin/canal-go/client"
protocol "github.com/withlin/canal-go/protocol"
"github.com/golang/protobuf/proto"
)
直接上代码例子(参考官方文档)
package main
import (
"github.com/withlin/canal-go/client"
protocol "github.com/withlin/canal-go/protocol"
"github.com/golang/protobuf/proto"
"time"
)
func main() {
connector := client.NewSimpleCanalConnector("你的Canal服务端地址", "你的Canal服务端端口", "你的Canal服务端用户名", "你的Canal服务端密码", "你的Canal服务端destination", 60000, 60*60*1000)
err := connector.Connect()
if err != nil {
panic(err)
}
//mysql 数据解析关注的表,Perl正则表达式. 这里过滤你需要获取数据的表
err = connector.Subscribe("你的数据库\\.你的表")
if err != nil {
panic(err)
}
for {
message, err := connector.Get(100, nil, nil)
if err != nil {
panic(err)
}
messageId := message.Id
if messageId == -1 || len(message.Entries) <= 0 {
time.Sleep(300 * time.Millisecond)
continue
}
//处理信息
doMessage(message.Entries)
}
}
//处理收到的推送
func doMessage(entrys []protocol.Entry) {
for _, entry := range entrys {
if entry.GetEntryType() == protocol.EntryType_TRANSACTIONBEGIN || entry.GetEntryType() == protocol.EntryType_TRANSACTIONEND {
continue
}
rowChange := new(protocol.RowChange)
err := proto.Unmarshal(entry.GetStoreValue(), rowChange)
if err != nil {
panic(err)
}
if rowChange != nil {
eventType := rowChange.GetEventType()
header := entry.GetHeader()
if header.ExecuteTime < time.Now().UnixNano() / 1e6 {
//变动时间早于当前时间 直接抛弃这条数据
continue
}
for _, rowData := range rowChange.GetRowDatas() {
if eventType == protocol.EventType_DELETE {
//todo 收到数据库删除数据推送,执行对应处理,rowData.GetBeforeColumns() 可以获取到删除的数据
//rowData.GetBeforeColumns()
} else if eventType == protocol.EventType_INSERT {
//todo 收到数据库新增数据推送,执行对应处理,rowData.GetAfterColumns() 可以获取到新增的数据
//rowData.GetAfterColumns()
} else {
//todo 收到数据库更新数据推送,执行对应处理,rowData.GetAfterColumns() 可以获取到更新后的数据,rowData.GetBeforeColumns() 可以获取到更新前的数据
//rowData.GetBeforeColumns()
//rowData.GetAfterColumns()
}
}
}
}
}
主要内容参考官方文档
其他具体内容可以直接参考官方源码
官方go客户端源码