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  ```