準備 Golang 開發(fā)環(huán)境
在完成環(huán)境準備后,本章節(jié)將幫助你快速上手 Kitex
首先,我們需要安裝使用本示例所需要的命令行代碼生成工具:
1、確保 ?GOPATH
?環(huán)境變量已經被正確地定義(例如 ?export GOPATH=~/go
?)并且將?$GOPATH/bin
?添加到 ?PATH
?環(huán)境變量之中(例如 ?export PATH=$GOPATH/bin:$PATH
?);請勿將 ?GOPATH
?設置為當前用戶沒有讀寫權限的目錄
2、安裝 kitex:?go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
?
3、安裝 thriftgo:?go install github.com/cloudwego/thriftgo@latest
?
安裝成功后,執(zhí)行 ?kitex --version
? 和 ?thriftgo --version
? 應該能夠看到具體版本號的輸出(版本號有差異,以 ?x.x.x
? 示例):
$ kitex --version
vx.x.x
$ thriftgo --version
thriftgo x.x.x
4、如果在安裝階段發(fā)生問題,可能主要是由于對 Golang 的不當使用造成,請依照報錯信息進行檢索
1、若將代碼放置于 ?$GOPATH/src
? 下,需在 ?$GOPATH/src
? 下創(chuàng)建額外目錄,進入該目錄后再獲取代碼:
mkdir -p $(go env GOPATH)/src/github.com/cloudwego
cd $(go env GOPATH)/src/github.com/cloudwego
2、若將代碼放置于 GOPATH 之外,可直接獲取
你可以直接點擊 此處 下載示例倉庫
也可以克隆該示例倉庫到本地 ?git clone https://github.com/cloudwego/kitex-examples.git
?
方式一:直接啟動
?cd kitex-examples/hello
?
?go run .
?
另起一個終端后,?go run ./client
?
方式二:使用 Docker 快速啟動
?cd kitex-examples
?
?docker build -t kitex-examples .
?
?docker run --network host kitex-examples ./hello-server
?
另起一個終端后,?docker run --network host kitex-examples ./hello-client
?
恭喜你,你現(xiàn)在成功通過 Kitex 發(fā)起了 RPC 調用。
打開 ?hello.thrift
?,你會看到如下內容:
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Hello {
Response echo(1: Request req)
}
現(xiàn)在讓我們?yōu)樾路椒ǚ謩e定義一個新的請求和響應,?AddRequest
?和 ?AddResponse
?,并在 ?service Hello
? 中增加 ?add
?方法:
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
struct AddRequest {
1: i64 first
2: i64 second
}
struct AddResponse {
1: i64 sum
}
service Hello {
Response echo(1: Request req)
AddResponse add(1: AddRequest req)
}
完成之后 ?hello.thrift
? 的內容應該和上面一樣。
運行如下命令后,?kitex
?工具將根據(jù) ?hello.thrift
? 更新代碼文件。
kitex -service a.b.c hello.thrift
# 若當前目錄不在 $GOPATH/src 下,需要加上 -module 參數(shù),一般為 go.mod 下的名字
kitex -module "your_module_name" -service a.b.c hello.thrift
執(zhí)行完上述命令后,?kitex
?工具將更新下述文件
./handler.go
?,在里面增加一個 ?Add
?方法的基本實現(xiàn)
./kitex_gen
?,里面有框架運行所必須的代碼文件
上述步驟完成后,?./handler.go
? 中會自動補全一個 ?Add
?方法的基本實現(xiàn),類似如下代碼:
// Add implements the HelloImpl interface.
func (s *HelloImpl) Add(ctx context.Context, req *api.AddRequest) (resp *api.AddResponse, err error) {
// TODO: Your code here...
return
}
讓我們在里面增加我們所需要的邏輯,類似如下代碼:
// Add implements the HelloImpl interface.
func (s *HelloImpl) Add(ctx context.Context, req *api.AddRequest) (resp *api.AddResponse, err error) {
// TODO: Your code here...
resp = &api.AddResponse{Sum: req.First + req.Second}
return
}
服務端已經有了 ?Add
?方法的處理,現(xiàn)在讓我們在客戶端增加對 ?Add
?方法的調用。
在 ?./client/main.go
? 中你會看到類似如下的 ?for
?循環(huán):
for {
req := &api.Request{Message: "my request"}
resp, err := client.Echo(context.Background(), req)
if err != nil {
log.Fatal(err)
}
log.Println(resp)
time.Sleep(time.Second)
}
現(xiàn)在讓我們在里面增加 ?Add
?方法的調用:
for {
req := &api.Request{Message: "my request"}
resp, err := client.Echo(context.Background(), req)
if err != nil {
log.Fatal(err)
}
log.Println(resp)
time.Sleep(time.Second)
addReq := &api.AddRequest{First: 512, Second: 512}
addResp, err := client.Add(context.Background(), addReq)
if err != nil {
log.Fatal(err)
}
log.Println(addResp)
time.Sleep(time.Second)
}
關閉之前運行的客戶端和服務端之后
?go run .
?
另起一個終端后,?go run ./client
?
現(xiàn)在,你應該能看到客戶端在調用 Add 方法了。
更多建議: