博客 / 詳情

返回

騰訊 tRPC-Go 教學——(1)搭建服務

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 可以實現兩個功能:

  1. 服務之前使用 protobuf 互相進行網絡 RPC 調用
  2. 給 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.goecho.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。

CC BY-NC-SA 4.0 DEED.png

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.