2023 年底騰訊統一的 RPC 框架 tRPC 正式開源。遍觀全網,似乎大部份是對 tRPC 概念上的宣傳、架構上的設計,而如何開發、如何部署的文章鳳毛麟角。於是筆者小試牛刀撰此文,或許會成為一系列,希望能拋磚引玉。
系列文章
- 騰訊 tRPC-Go 教學——(1)搭建服務
- 騰訊 tRPC-Go 教學——(2)trpc HTTP 能力
- 騰訊 tRPC-Go 教學——(3)微服務間調用
- 騰訊 tRPC-Go 教學——(4)tRPC 組件生態和使用
- 騰訊 tRPC-Go 教學——(5)filter、context 和日誌組件
- 騰訊 tRPC-Go 教學——(6)服務發現
- 騰訊 tRPC-Go 教學——(7)服務配置和指標上報
- 騰訊 tRPC-Go 教學——(8)通過泛 HTTP 能力實現和觀測 MCP 服務
tRPC 簡介
我們先知道一點,tRPC 可以實現兩個功能:
- 服務之前使用 protobuf 互相進行網絡 RPC 調用
- 給 web 前端提供 API 接口
好了,剩下的我現在不想廢話,我們先直接上代碼,建服務!然後再來好好介紹 tRPC 的好處。
本文件不打算將服務的目錄結構應怎麼設計,這是各個團隊內部按照自己風格需要去統一規範的事情。此外,本文也假定讀者已經懂得使用 go.mod 組織和進行倉庫和版本控制。
制訂協議
我們先嚐試一下給 web 前端提供一個 API 接口。首先,我們定義一個簡單的協議 (GitHub 代碼),假設命名為 echo.proto:
syntax = "proto3";
package demo.simplest;
option go_package = "github.com/Andrew-M-C/trpc-go-demo/proto/simplest";
message HelloRequest {
string greeting = 1;
}
message HelloResponse {
int32 err_code = 1;
string err_msg = 2;
string response = 3;
double timestamp = 4;
}
service HelloWorld {
rpc Hello(HelloRequest) returns (HelloResponse); // @alias=/demo/Hello
}
很好理解,經典的 echo 功能,外加一個時間戳。我們這就定義好了一個非常簡單的服務。接下來,我們需要把這個服務轉換成 trpc 樁代碼。為此,我們需要藉助 trpc 的一個工具來實現。
其中有一個比較特別的是 // @alias=/demo/Hello。我以後會講解它的作用。
trpc 工具鏈安裝
首先,trpc 工具是基於 protoc 實現的,所以,我們首先需要安裝 protoc。假設我們的開發環境是 Linux,那麼可以執行以下命令安裝(可能需要 sudo):
wget https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protoc-25.1-linux-x86_64.zip
7z x protoc-25.1-linux-x86_64.zip -o/usr/local -y
rm protoc-25.1-linux-x86_64.zip*
chmod +x /usr/local/bin/protoc
protoc --version
上面的命令,讀者可以對應我的 demo 項目中 Makefile 文件的 installpb 規則。
接着把 trpc 工具安裝了:
go install trpc.group/trpc-go/trpc-cmdline/trpc@latest
trpc version
這個則對應 Makefile 的 make installtrpc 規則。
生成樁代碼
安裝了工具鏈之後,我們就可以進入前面我們定義的 proto 文件所在的目錄,執行以下命令:
trpc create -f --protofile=echo.proto --protocol=trpc --rpconly --nogomod --mock=false
這串命令可以對應 Makefile 的 make pb 規則。我個人覺得用上面這個參數組合是最舒服最方便的。讀者可以先不用管這些參數的意思,先照着用就可以了。隨着 trpc 輸出一串賣萌的提示之後:
[create] Create tRPC project `echo` post process: succeed! (〃'▽'〃)
可以看到,在目錄下生成了 echo.pb.go 和 echo.trpc.go 兩個文件。其中前者定義的是在 proto 文件中定義的各種數據類型;而後者則是 trpc 工具鏈的關鍵功能:HelloWorld 的客户端和服務端。
撰寫業務邏輯
我們就按照最最簡單的模式,一個 main package 搞定一切(當然正式的業務肯定要做好功能劃分)。我們新建一個 simplest_main.go 文件,輸入以下內容:
package main
import (
"context"
"fmt"
"time"
// proto package 的路徑請讀者自行調整
"github.com/Andrew-M-C/trpc-go-demo/proto/simplest"
"trpc.group/trpc-go/trpc-go"
)
func main() {
s := trpc.NewServer()
simplest.RegisterHelloWorldService(s, helloWorldImpl{})
_ = s.Serve()
}
type helloWorldImpl struct{}
func (helloWorldImpl) Hello(ctx context.Context, req *simplest.HelloRequest) (*simplest.HelloResponse, error) {
rsp := &simplest.HelloResponse{}
rsp.Response = fmt.Sprintf("%s to you, too", req.Greeting)
rsp.TimestampMsec = time.Now().UnixMilli()
return rsp, nil
}
邏輯很簡單,我就不廢話了。
啓動服務
單純編譯上面的代碼之後,還不足以實現一個完整的服務。trpc 服務還需要搭配一個配置文件,這個文件我們通常命名為 trpc_go.yaml。對於咱們這個服務,這個配置文件的內容為:
server:
service:
- name: demo.simplest.HelloWorld
nic: eth0
# ip: 127.0.0.1
port: 8000
network: tcp
protocol: http
timeout: 1800
然後,咱們就可以啓動服務了:
go run . -conf conf/trpc_go.yaml
可以看到 trpc 在標準輸出輸出以下文字:
2024-01-14 14:28:09.886 INFO client/client_linux.go:35 client is empowered with tnet! 🤩
2024-01-14 14:28:09.887 DEBUG maxprocs/maxprocs.go:47 maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
2024-01-14 14:28:09.888 INFO server/service.go:167 process:19556, http service:demo.simplest.HelloWorld launch success, tcp:172.17.0.4:8000, serving ...
這個時候,我們可以執行以下請求:
curl http://172.17.0.4:8000/demo/Hello?greeting=Morning
得到響應:
{"err_code":0, "err_msg":"", "response":"Morning to you, too", "timestamp":1705243778.669}
就這樣,一個簡單的基於 URL query 的 http 服務,搭建完成了。
難道只能支持 URL query 嗎?我們換一個調用方式:
curl http://172.17.0.4:8000/demo/Hello --header 'Content-Type:application/json'\
-d '{"greeting":"Good afternoon"}'
依然得到響應:
{"err_code":0, "err_msg":"", "response":"Good afternoon to you, too", "timestamp":1705243811.625}
下一步
由於筆者最近比較忙,文章先寫到這,給讀者一個敲門磚。下一篇文章筆者會介紹一下,咱們啓動了的這到底是個什麼樣的服務,究竟支持哪些能力?配置項裏面的那些代表了什麼?實際業務中,騰訊人是怎麼做的?不急不急,請容我歇一會兒,慢慢道來。
下一篇:《手把手 tRPC-Go 教學——(2)trpc HTTP 能力》
推薦閲讀
- tRPC 官網
- 騰訊重複造輪子?我們真的需要這麼多RPC框架嗎?
本文章採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。
原作者: amc,原文發佈於騰訊雲開發者社區,也是本人的博客。歡迎轉載,但請註明出處。
原文標題:《手把手 tRPC-Go 教學——(1)搭建服務》
發佈日期:2024-01-14
原文鏈接:https://cloud.tencent.com/developer/article/2379219。