Stories

Detail Return Return

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

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 manongsir Avatar itwhat Avatar kubeexplorer Avatar dalideshoushudao Avatar lyflexi Avatar euphoria Avatar xiayifeifandewudongmian Avatar yejianfeixue Avatar xiaoal Avatar dyzs Avatar timeofsunrise Avatar digitalocean Avatar
Favorites 14 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.