trpc.group/trpc-go/trpc-go@v1.0.3/docs/user_guide/metadata_transmission.zh_CN.md (about) 1 [English](metadata_transmission.md) | 中文 2 3 # tRPC-Go 链路透传 4 5 ## 前言 6 7 全链路透传:框架支持在 client 和 server 之间透传字段,并在整个调用链路自动透传下去。 8 字段以 key-value 的形式存在,key 是 string 类型,value 是 `[]byte` 类型,value 可以是任何数据,透传字段对于 RPC 请求来说是透明的,提供了关于本次 RPC 请求的额外信息。框架通过 `context`` 来透传字段。 9 10 下面文档描述怎么样在框架中实现字段透传。 11 12 ## 原理及实现 13 14 tRPC-Go 框架使用 tRPC 协议头部中的 transinfo 字段来透传数据,用户把需要透传的字段通过框架的 API 设置到 context 里面,框架在打解包的时候,会把用户设置的字段设置到协议相应的字段上面,然后进行透传,收到数据的一方会把对应的透传字段解析出来,用户可以通过接口获取到透传的数据。 15 16 ## 示例 17 18 #### client 透传数据到 server 19 20 client 发起请求时,通过增加 option 来设置透传字段,可以增加多个透传字段。 21 22 ```go 23 options := []client.Option{ 24 client.WithMetaData("key1", []byte("val1")), 25 client.WithMetaData("key2", []byte("val2")), 26 client.WithMetaData("key3", []byte("val3")), 27 } 28 29 rsp, err := proxy.SayHello(ctx, options...) // 注意:使用框架传过来的 ctx 30 ``` 31 32 下游 server 通过框架的 ctx 可以获取到 client 的透传字段 33 34 ```go 35 // 注意使用框架的 ctx,上面 client 设置了 key1 的值为 val1, 36 // 这里将会得到 val1 的返回值,如果 client 没有设置对应的值,则返回空数据。 37 trpc.GetMetaData(ctx, "key1") 38 ``` 39 40 #### server 透传数据到 client 41 42 server 在回包的时候可以通过 ctx 设置透传字段返回给上游调用方 43 44 ```go 45 // 注意使用框架的 ctx,通过这个 api 设置了透传字段 key1 的值为 []byte("val1") 46 trpc.SetMetaData(ctx, "key1", []byte("val1")) 47 ``` 48 49 上游 client 可以通过设置各协议的 rsp head 获取 50 51 ```go 52 head := &trpc.ResponseProtocol{} 53 options := []client.Option{ 54 client.WithRspHead(head), 55 } 56 57 rsp, err := proxy.SayHello(ctx, options...) // 注意:使用框架传过来的 ctx 58 head.TransInfo // 框架透传回来的 metadata 59 ```