grpc SetHeader 和 SetTrailer 的区别和联系

问题

在使用grpc过程中发现,发送 matedata 有两种方式 一种是通过 grpc.SendHeader(ctx,md),另外一种是 grpc.SetTrailer(ctx,md)

疑问 既然可以通过 SendHeader 发送元数据,为什么还需要通过 SetTrailer 发送呢?这两个的区别和联系是什么呢?

过程

首先,我们需要知道grpc通信模式分为四种

  1. 一元RPC模式
  2. 服务器流RPC模式
  3. 客户端流RPC模式
  4. 双向流RPC模式

然后,我们看 一元RPC模式双向流RPC模式 的区别

一元RPC模式通过一发一收模式

客户端消息由 头部-内容1-EOS 构成,服务端消息由 头部-内容1-trailer 构成

grpc SetHeader 和 SetTrailer 的区别和联系_第1张图片

双向流RPC模式通过多发多收模式

客户端消息由 头部-内容3-内容1-内容2-EOS 构成,
服务端消息由 头部-内容1-内容2-内容3-trailer

grpc SetHeader 和 SetTrailer 的区别和联系_第2张图片

结论

header和trailer的接收时机不同,可以看出,在一元模式中,header和trailer是一起到达客户端的,此时客户端从header或者trailer中获取 metadata 是一样的,但是在流模式中,header是先到达,然后接收多个stream内容,最后才获取到trailer,获取的时机是不一样的,所以 grpc 提供了两种方式让我们发送 metadata

这个问题是在看 gRPC与云原生应用开发 其中的发送元数据的章节中发现的,并通过google一下找到了比较满意的回答,记录一下过程,希望可以解决同样有疑问的你!

参考资料

gRPC与云原生应用开发

你可能感兴趣的:(go,grpc,http)