Deliver,意味着客户端通过 gRPC 接口从 Ordering 服务获取数据(例如指定区块的数据)。
Orderer 节点收到请求消息,会首先交给 orderer.common.server
包中 server 结构体的 Deliver(srv ab.AtomicBroadcast_DeliverServer) error
方法处理。该方法进一步调用 orderer.common.deliver
包中 deliverServer 结构的 Handle(srv ab.AtomicBroadcast_DeliverServer) error
方法进行处理。
deliverServer 结构体十分重要,完成对 Deliver 请求的处理过程。
type deliverServer struct { sm SupportManager}func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error
整体过程
整体处理过程如下图所示。
Handle(srv ab.AtomicBroadcast_DeliverServer) error
方法会开启一个循环来从 srv 中不断读取请求消息并进行处理,直到结束。
核心代码如下所示,包括提取消息和对消息进行处理两个步骤。
for { envelope, err := srv.Recv() // 从请求中提取一个 Envelope 消息 ds.deliverBlocks(srv, envelope) // 对消息进行处理并答复,核心过程}