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