问题
在使用grpc
过程中发现,发送 matedata
有两种方式 一种是通过 grpc.SendHeader(ctx,md)
,另外一种是 grpc.SetTrailer(ctx,md)
疑问 既然可以通过 SendHeader 发送元数据,为什么还需要通过 SetTrailer 发送呢?这两个的区别和联系是什么呢?
过程
首先,我们需要知道grpc通信模式分为四种
- 一元RPC模式
- 服务器流RPC模式
- 客户端流RPC模式
- 双向流RPC模式
然后,我们看 一元RPC模式
和 双向流RPC模式
的区别
一元RPC模式通过一发一收模式
客户端消息由 头部-内容1-EOS 构成,服务端消息由 头部-内容1-trailer 构成
双向流RPC模式通过多发多收模式
客户端消息由 头部-内容3-内容1-内容2-EOS 构成,
服务端消息由 头部-内容1-内容2-内容3-trailer
结论
header和trailer的接收时机不同
,可以看出,在一元模式中,header和trailer是一起到达客户端的,此时客户端从header或者trailer中获取 metadata 是一样的,但是在流模式中,header是先到达,然后接收多个stream内容,最后才获取到trailer,获取的时机是不一样的,所以 grpc 提供了两种方式让我们发送 metadata
这个问题是在看 gRPC与云原生应用开发
其中的发送元数据的章节中发现的,并通过google一下找到了比较满意的回答,记录一下过程,希望可以解决同样有疑问的你!
参考资料
gRPC与云原生应用开发