【深入理解TcaplusDB技術】GO實現PB表的增刪查改操作
Protobuf說明
PROTO表是基於PROTOBUF協議設計的TcaplusDB表,PROTOBUF協議是Google開源的通用RPC通訊協議,用於TcaplusDB儲存資料的序列化、反序列化等操作,具體關於PROTO表的定義說明可參考章節:表定義語言(PB,TDR)。PROTO表定義以protobuf格式來定義表結構,支援豐富的資料型別,請參考章節:資料型別(PB, TDR)。
入門
快速入手PROTOBUF協議表的開發涉及幾個步驟,下面介紹如何基於TcalusDB本地Docker版環境,快速上手基於Golang進行PROTO表的增刪查改操作。所有操作均在申請的開發測試機或雲主機進行。
Docker環境準備
在開始示例程式碼演示之前,需要提前準備好TcaplusDB本地Docker環境及tcapluscli工具,具體請參考資料:TcaplusDB入門-Docker部署篇.md。 Docker部署好後,對於命令列工具需要授權所有IP訪問Docker環境,授權方式:
#access-id指定業務id, 2: tdr業務,3: pb業務,這裡是pb業務所以預設為3
./tcapluscli privilege --endpoint-url=http://localhost --access-id=3--allow-all-ip
Go環境準備
GO SDK示例依賴GO環境的部署,對於Centos系統可以直接安裝通過:
yum install golang
建議版本:1.13
以上。
protoc工具準備
對於protobuf定義檔案,需要藉助protoc
工具來生成介面程式碼,如果要生成Go的介面程式碼,還需要藉助protoc-gen-go
外掛來輔助。這裡需要準備下載對應OS平臺的這兩個工具:
工具名 | 下載 |
---|---|
protoc | Download |
protoc-gen-go | Download |
備註:
-
protoc下載後,直接拷貝到/usr/bin目錄
-
protoc-gen-go下載後,進入相應目錄,直接
go build -o protoc-gen-go main.go
,可得到二進位制檔案,把其拷貝到/usr/bin系統目錄
TcaplusDB表準備
準備PROTO表示例檔案
這裡以示例中的game_players.proto舉例,表名: game_players
, 表型別: GENERIC
。檔案具體內容如下:
syntax = "proto3"; // Specify the version of the protocol buffers language
import "tcaplusservice.optionv1.proto"; // Use the public definitions of TcaplusDB by importing them.
message game_players { // Define a TcaplusDB table with message
// Specify the primary keys with the option tcaplusservice.tcaplus_primary_key
// The primary key of a TcaplusDB table has a limit of 4 fields
option(tcaplusservice.tcaplus_primary_key) = "player_id, player_name, player_email";
// Specify the primary key indexes with the option tcaplusservice.tcaplus_index
option(tcaplusservice.tcaplus_index) = "index_1(player_id, player_name)";
option(tcaplusservice.tcaplus_index) = "index_2(player_id, player_email)";
// Value Types supported by TcaplusDB
// int32, int64, uint32, uint64, sint32, sint64, bool, fixed64, sfixed64, double, fixed32, sfixed32, float, string, bytes
// Nested Types Message
// primary key fields
int64 player_id = 1;
string player_name = 2;
string player_email = 3;
// Ordinary fields
int32 game_server_id = 4;
repeated string login_timestamp = 5;
repeated string logout_timestamp = 6;
bool is_online = 7;
payment pay = 8;
}
message payment {
int64 pay_id = 1;
uint64 amount = 2;
int64 method = 3;
}
將上述檔案內容儲存為game_players.proto
。
TcaplusDB叢集準備
對於TcaplusDB,在建立表之前需要建立對應的表叢集。對於Docker本地版,叢集已經預設建立好一個供大家使用,所以不用再建立叢集。對於PROTO叢集,已經預設建立一個pb_app
的業務,叢集接入ID (AccessID) 預設為3
。叢集密碼(AccessPassword)檢視可開啟TcaplusDB運維平臺,開啟方式:直接瀏覽器輸入部署docker的機器ip即可,預設埠80
。預設登入方式:
使用者名稱: tcaplus密碼: tcaplus
登入後,進入業務管理->業務維護->選擇業務名稱
,這裡預設選pb_app業務,在對應行的右側點選檢視密碼即可。
TcaplusDB表格組準備
TcaplusDB表在叢集的基礎上還依賴於表格組,相當於遊戲裡的邏輯分割槽,使用工具建立表格組命令如下:
#查看錶格組幫助命令
./tcapluscli tablegroup -h
#建立一個表格組,id指定為2, endpoint-url為上面docker暴露的80埠,access-id為叢集接入ID(業務ID,3表示PROTO叢集), 用於docker環境連線使用, group name由字母、數字和下劃線組成
./tcapluscli tablegroup create --endpoint-url=http://localhost --access-id=3 --group-id=2 --group-name=zone_2
TcaplusDB表建立
現在正式進入表建立環節,在上述表格組基礎上建立一個PROTO表,執行建立表命令,如下所示:
#查看錶建立命令提示幫助
./tcapluscli table -h
#建立一個表, 指定endpoint-url, 表格組id: group-id, 表型別: PROTO, 表定義檔案: game_players.proto, 放當前路徑
./tcapluscli table create create --endpoint-url=http://localhost --access-id=3 --group-id=2 --schema-type=PROTO --schema-file=game_players.proto
示例程式碼
以Golang示例程式碼為例,介紹如何使用PROTOBUF介面進行TcaplusDB表資料操作,這裡主要介紹Generic型別表操作。GO示例程式碼以go mod
方式進行編譯,GO版本以1.15
舉例.
示例程式碼下載
目前示例程式碼放在github路徑,直接下載即可。
git clone https://github.com/tencentyun/tcaplusdb-go-examples.git
示例程式碼目錄結構:
[root@VM-48-13-centos tcaplusdb-go-examples]# tree
.
|-- pb
| |-- example.go
| |-- go.mod
| |-- go.sum
| |-- logconf.xml
| |-- Makefile
| |-- table
| | |-- game_players.proto
| | |-- tcaplusservice
| | | |-- game_players.pb.go
| | | `-- tcaplusservice.optionv1.pb.go
| | `-- tcaplusservice.optionv1.proto
| `-- test.go
`-- README.md
示例程式碼說明:
檔案 | 檔案說明 |
---|---|
example.go | 示例程式碼主檔案,包含CRUD介面 |
test.go | 示例壓測檔案,壓測讀寫介面,開協程併發壓測 |
logconf.xml | 日誌配置檔案,預設級別ERROR, 如果需要更詳細的,可開DEBUG, 如果壓測的話用ERROR既可,避免效能損耗 |
Makefile | 編譯檔案,直接執行make可編譯得到示例二進位制檔案 |
table | 表介面定義目錄,包含表相關定義檔案,及生成的表介面定義程式碼檔案 |
game_players.proto | 示例表定義檔案 |
tcaplusservice.optionv1.proto | tcaplusdb pb協議定義檔案 |
tcaplusservice | 用protoc生成的表定義介面程式碼目錄 |
game_players.pb.go | 生成的表定義介面程式碼 |
tcaplusservice.optionv1.pb.go | 生成的pb協議介面程式碼 |
表介面程式碼生成
如果不想用示例程式碼中的示例表,參照game_players.proto定義好後,可以用如下命令生成:
cd table mkdir tcaplusservice #生成pb協議介面程式碼 protoc --go_out=./tcaplusservice tcaplusservice.optionv1.proto #生成表定義介面程式碼 protoc --go_out=./tcaplusservice mytable.proto
備註:
-
需要同時安裝protoc-gen-go外掛才行
-
需要在proto檔案中指定package, 如預設的package tcaplusservice
公共連線環境配置
下載示例程式碼後,找到example.go檔案,並修改如下引數,改成業務方申請的tcaplusdb連線資訊或本地部署的tcaplusdb資訊;
//叢集訪問地址,本地docker版:配置docker部署機器IP, 埠預設:9999, 騰訊雲線上環境配置為連線地址IP和埠 DirUrl = "tcp://x.x.x.x:xxxx" //叢集接入ID, 預設為3,本地docker版:直接填3,雲上版本:根據實際叢集接入ID填寫 AppId = 3 //叢集訪問密碼,本地docker版:參考叢集準備階段獲取叢集密碼步驟,需要藉助tcaplusdb web運維平臺檢視; 雲上版本:根據實際申請叢集詳情頁檢視 Signature = "xxxxx" //表格組ID,替換為自己建立的表格組ID ZoneId = 2 //表名稱 TableName = "game_players"
編譯程式碼
在示例程式碼目錄,已經集成了Makefile
, 方便使用者用make方式進行編譯。Makefile檔案中把GO執行的一系列命令放在裡面,使用者無需再單獨執行
#進示例程式碼目錄 cd tcaplusdb-go-examples/pb #直接執行make make #生成example, test可執行檔案,直接執行即可進行相關操作 #體驗CRUD介面 ./example #體驗讀寫壓測 ./test -t 10 -n 10