ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-18 17:32:27  阅读:183  来源: 互联网

标签:return err nil ERR TcaplusDB failed client 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 = 2
data.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
              }
      }

 


 

img

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

标签:return,err,nil,ERR,TcaplusDB,failed,client,Go,SDK
来源: https://www.cnblogs.com/tcaplusdb/p/16160742.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有