写点什么

【深入理解 TcaplusDB 技术】TcaplusDB Go SDK 手册(一)

作者:数据人er
  • 2022 年 4 月 27 日
  • 本文字数:4070 字

    阅读完需:约 13 分钟

【深入理解TcaplusDB技术】TcaplusDB Go SDK手册(一)

【深入理解 TcaplusDB 技术】TcaplusDB Go SDK 手册(一)

1 使用准备

本 API 是 Tcaplus API 的 Go 封装,支持 Generic 表的增删改查

1.1 各代码目录

  • pack 为打包脚本

  • example 为示例

  • aurotest 为测试工具

  • 其他目录为 Tcaplus Go API 的源码

  • vendor 中为依赖库的代码,需要使用 git submodule init 和 git submodule update 拉取

1.2 编译 example

example/generic_table 展示了对 service_info 表的 insert get replace update delete 操作


  1. Go 环境安装 https://golang.org/

  2. 将 service_info.xml 加入 Tcaplus

  3. 修改 main.go 的开头的 AppId ZoneId DirUrl Signature 为相应的 Tcaplus 配置信息

  4. make 之后执行

1.3 打包脚本

pack/pack.sh 展示了对源码及依赖库的打包,方便用户移植到无法使用 go mod 的场景


  1. cd pack && sh pack.sh

2 API 的使用

2.1 vendor 方式使用

Tcaplus API 的依赖库及其源码都在打包后的 src/vendor 目录下,用户只需将 vendor 放入自己的工程目录即可使用 Tcaplus Go API 的接口


vendor 依赖介绍:


  • github.com/tencentyun/tcaplusdb-go-sdk/tdr 是 Tcaplus Go API 源码

  • github.com/tencentyun/tsf4g/TdrCodeGen 是 tdr 工具,可将 tdr 的 xml 转换为 go 源码

  • github.com/tencentyun/tsf4g/tdrcom 是 tdr go 源码打解包的依赖库

  • go.uber.org/zap 是日志库

  • github.com/natefinch/lumberjack 是日志文件切割库

2.2 mod 方式使用

mod 模式需要在能连内网及公网环境下使用


  • 在工程中建立 go.mod

  • 开启 module 模式

  • 执行命令 go clean --modcache

  • 执行命令 go mod edit -require="github.com/tencentyun/tcaplusdb-go-sdk/tdr@v0.1.0"

3 接口使用步骤

对表中的 record 的操作有两套接口:


  • 一套使用 SetKey SetValue 接口对 record 赋值,由用户指定 key 字段和 value 字段的内容,响应消息只能通过 GetKey,GetValue 接口读取

  • 另一套使用 SetData 接口对 record 赋值,用户赋值 Tdr 结构体,SetData 通过反射对 record 赋值,响应消息只能通过 GetData 接口读取

3.1 SetKey 和 SetValue 方式使用

1 通过 tcaplus.NewClient()创建一个 tcaplus 客户端指针


client := tcaplus.NewClient()
复制代码


2 指定操作表的 AppId, ZoneIdList, DirUrl,Signature,Timeout(秒)连接 tcaplus


err := client.Dial(2, []uint32{3,4}, "tcp://x.x.x.x:9999", "xxxx",60)if err != nil {        log.ERR("dial failed %s", err.Error())        return}
复制代码


3 指定 zoneId,表名,命令字,client.NewRequest 创建一个请求


req, err := client.NewRequest(3, "service_info", cmd.TcaplusApiInsertReq)if err != nil {        log.ERR("NewRequest TcaplusApiInsertReq failed %s", err.Error())        return}
复制代码


4 req.AddRecord 为 request 添加一条记录 record,(index 为 list 表的记录所在编号,generic 不支持设为 0 即可)


rec, err := req.AddRecord(0)if err != nil {        log.ERR("AddRecord failed %s", err.Error())        return}
复制代码


5 通过 record 的 SetKey 和 SetValue 接口对记录进行赋值


err := rec.SetKeyInt8("keyName", int8(1))if err != nil {        log.ERR("SetKeyInt8 failed %s", err.Error())        return}
err := rec.SetValueInt8("valueName", int8(1))if err != nil { log.ERR("SetKeyInt8 failed %s", err.Error()) return}
复制代码


6 client.SendRequest 将请求发送出去


if err := client.SendRequest(req); err != nil {        log.ERR("SendRequest failed %s", err.Error())        return}
复制代码


7 client.RecvResponse 为异步接收请求响应接口,通过如下方式可阻塞接收响应


func recvResponse(client *tcaplus.Client) (response.TcaplusResponse, error){        //5s超时        timeOutChan := time.After(5 * time.Second)        for {                select {                case <-timeOutChan:                        return nil, errors.New("5s timeout")                default:                        resp,err := client.RecvResponse()                        if err != nil {                                return nil, err                        } else if resp == nil {                                time.Sleep(time.Microsecond * 1)                        } else {                                return  resp, nil                        }                }        }}
复制代码


8 操作 response 的 GetResult 获取响应结果,GetRecordCount,FetchRecord 获取响应消息中的记录 record,通过 record 的 GetKey,GetValue 接口获取响应记录的字段信息


tcapluserr := resp.GetResult()if tcapluserr != 0 {    fmt.Printf("response ret errCode: %d, errMsg: %s", tcapluserr, terror.GetErrMsg(tcapluserr))    return}
for i := 0; i < resp.GetRecordCount(); i++ { record, err := resp.FetchRecord() if err != nil { log.ERR("FetchRecord failed %s", err.Error()) return }
keyNameData, err := rec.GetKeyInt8("keyName") if err != nil { log.ERR("GetKeyInt8 failed %s", err.Error()) return }
valueNameData, err := rec.GetValueInt8("valueName") if err != nil { log.ERR("GetValueInt8 failed %s", err.Error()) return } }
复制代码

3.2 TDR SetData 方式使用

1 将要操作的 tdr 的表 xml 转换成 GO 源码


cd vendor/github.com/tencentyun/tsf4g/TdrCodeGen/python tdr.py table.xml得到相应表的go源码目录table/table.go将table放到自己的go的工程目录即可使用
复制代码


2 通过 tcaplus.NewClient()创建一个 tcaplus 客户端指针


client := tcaplus.NewClient()
复制代码


3 指定操作表的 AppId, ZoneIdList, DirUrl,Signature,Timeout(秒)连接 tcaplus


err := client.Dial(2, []uint32{3,4}, "tcp://x.x.x.x:9999", "xxxx",60)if err != nil {        log.ERR("dial failed %s", err.Error())        return}
复制代码


4 指定 zoneId,表名,命令字,client.NewRequest 创建一个请求


req, err := client.NewRequest(3, "service_info", cmd.TcaplusApiInsertReq)if err != nil {        log.ERR("NewRequest TcaplusApiInsertReq failed %s", err.Error())        return}
复制代码


5 req.AddRecord 为 request 添加一条记录 record,(index 为 list 表的记录所在编号,generic 不支持设为 0 即可)


rec, err := req.AddRecord(0)if err != nil {        log.ERR("AddRecord failed %s", err.Error())        return}
复制代码


6 通过第一步中 tdr 的 go 源码的 New 接口创建一个结构体并且赋值,通过 SetData 接口对 record 进行赋值


data := service_info.NewService_Info()data.Gameid = "dev"data.Envdata = "oa"data.Name = "com"data.Filterdata = time.Now().Format("2006-01-02T15:04:05.000000Z")data.Updatetime = uint64(time.Now().UnixNano())data.Inst_Max_Num = 2data.Inst_Min_Num = 3//数组类型为slice需要准确赋值长度,与refer保持一致data.Routeinfo_Len = uint32(len(route))data.Routeinfo = []byte("test")
//将tdr的数据设置到请求的记录中if err := rec.SetData(data); err != nil { log.ERR("SetData failed %v", err.Error()) return}
复制代码


7 client.SendRequest 将请求发送出去


if err := client.SendRequest(req); err != nil {        log.ERR("SendRequest failed %s", err.Error())        return}
复制代码


8 client.RecvResponse 为异步接收请求响应接口,通过如下方式可阻塞接收响应


func recvResponse(client *tcaplus.Client) (response.TcaplusResponse, error){        //5s超时        timeOutChan := time.After(5 * time.Second)        for {                select {                case <-timeOutChan:                        return nil, errors.New("5s timeout")                default:                        resp,err := client.RecvResponse()                        if err != nil {                                return nil, err                        } else if resp == nil {                                time.Sleep(time.Microsecond * 1)                        } else {                                return  resp, nil                        }                }        }}
复制代码


9 操作 response 的 GetResult 获取响应结果,GetRecordCount,FetchRecord 获取响应消息中的记录 record,通过 record 的 GetData 接口获取响应记录


tcapluserr := resp.GetResult()if tcapluserr != 0 {    fmt.Printf("response ret errCode: %d, errMsg: %s", tcapluserr, terror.GetErrMsg(tcapluserr))    return}
for i := 0; i < resp.GetRecordCount(); i++ { record, err := resp.FetchRecord() if err != nil { log.ERR("FetchRecord failed %s", err.Error()) return }
//通过GetData获取响应记录 data := service_info.NewService_Info() if err := record.GetData(data); err != nil { log.ERR("record.GetData failed %s", err.Error()) return } }
复制代码





TcaplusDB 是腾讯出品的分布式 NoSQL 数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB 级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。

用户头像

数据人er

关注

还未添加个人签名 2021.03.09 加入

还未添加个人简介

评论

发布
暂无评论
【深入理解TcaplusDB技术】TcaplusDB Go SDK手册(一)_数据库_数据人er_InfoQ写作社区