trpc.group/trpc-go/trpc-go@v1.0.3/docs/user_guide/client/flatbuffers.zh_CN.md (about) 1 [English](flatbuffers.md) | 中文 2 3 # 前言 4 5 本节展示如何使 tRPC-Go 服务调用 flatbuffers 协议服务 6 7 # 原理 8 9 见 [tRPC-Go 搭建 flatbuffers 协议服务](/docs/user_guide/server/flatbuffers.md) 中的原理介绍 10 11 # 示例 12 13 在 [tRPC-Go 搭建 flatbuffers 协议服务](/docs/user_guide/server/flatbuffers.md) 的示例部分已经可以生成客户端代码,整体工程目录结构如下: 14 15 ```shell 16 ├── cmd/client/main.go # 客户端代码 17 ├── go.mod 18 ├── go.sum 19 ├── greeter_2.go # 第二个 service 的服务端实现 20 ├── greeter_2_test.go # 第二个 service 的服务端测试 21 ├── greeter.go # 第一个 service 的服务端实现 22 ├── greeter_test.go # 第一个 service 的服务端测试 23 ├── main.go # 服务启动代码 24 ├── stub/github.com/trpcprotocol/testapp/greeter # 桩代码文件 25 └── trpc_go.yaml # 配置文件 26 ``` 27 28 可以参考 `cmd/client/main.go` 来写客户端代码,如下(只选取单发单收的作为例子): 29 30 ```go 31 package main 32 33 import ( 34 "flag" 35 "io" 36 37 flatbuffers "github.com/google/flatbuffers/go" 38 39 trpc "trpc.group/trpc-go/trpc-go" 40 "trpc.group/trpc-go/trpc-go/client" 41 "trpc.group/trpc-go/trpc-go/log" 42 fb "github.com/trpcprotocol/testapp/greeter" 43 ) 44 45 func callGreeterSayHello() { 46 proxy := fb.NewGreeterClientProxy( 47 client.WithTarget("ip://127.0.0.1:8000"), 48 client.WithProtocol("trpc"), 49 ) 50 ctx := trpc.BackgroundContext() 51 // 一发一收 client 用法示例 52 b := flatbuffers.NewBuilder(clientFBBuilderInitialSize) 53 // 添加字段示例 54 // 将 CreateString 中的 String 替换为你想要操作的字段类型 55 // 将 AddMessage 中的 Message 替换为你想要操作的字段名 56 // i := b.CreateString("GreeterSayHello") 57 fb.HelloRequestStart(b) 58 // fb.HelloRequestAddMessage(b, i) 59 b.Finish(fb.HelloRequestEnd(b)) 60 reply, err := proxy.SayHello(ctx, b) 61 if err != nil { 62 log.Fatalf("err: %v", err) 63 } 64 // 将 Message 替换为你需要访问的字段名 65 // log.Debugf("simple rpc receive: %q", reply.Message()) 66 log.Debugf("simple rpc receive: %v", reply) 67 } 68 69 // clientFBBuilderInitialSize 为 client 端设置 flatbuffers.NewBuilder 初始化大小 70 var clientFBBuilderInitialSize int 71 72 func init() { 73 flag.IntVar(&clientFBBuilderInitialSize, "n", 1024, "set client flatbuffers builder's initial size") 74 } 75 76 func main() { 77 flag.Parse() 78 callGreeterSayHello() 79 } 80 ``` 81 82 整体结构和 protobuf 相关文件基本一致,其中 `"github.com/trpcprotocol/testapp/greeter"` 是桩代码的模块路径,管理方法可参考 protobuf 的桩代码管理 83 84 以上为纯客户端的写法,当在一个服务中写下游的客户端时,需要调用的服务信息可以通过 `trpc_go.yaml` 来进行配置,从而省去以下部分 85 86 ```go 87 proxy := fb.NewGreeterClientProxy( 88 client.WithTarget("ip://127.0.0.1:8000"), 89 client.WithProtocol("trpc"), 90 ) 91 ```