响应消息的接收入口是NettyClientHandler,包括HTTP/2 Header和HTTP/2 DATA Frame两部分,代码如下:
(点击放大图像)
如果参数endStream为True,说明Stream已经结束,调用transportTrailersReceived,通知Listener close,代码如下所示:
(点击放大图像)
读取到HTTP/2 DATA Frame之后,调用MessageDeframer的deliver对Frame进行解析,代码如下:
(点击放大图像)
将Frame 转换成InputStream之后,通知ClientStreamListenerImpl,调用messageRead(final InputStream message),将InputStream反序列化为响应对象,相关代码如下所示:
(点击放大图像)
当接收到endOfStream之后,通知ClientStreamListenerImpl,调用它的close方法,如下所示:
(点击放大图像)
最终调用UnaryStreamToFuture的onClose方法,set响应对象,唤醒阻塞的调用方线程,完成RPC调用,代码如下:
(点击放大图像)
3. 作者简介李林锋,华为软件平台开放实验室架构师,有多年Java NIO、平台中间��、PaaS平台、API网关设计和开发经验。精通Netty、Mina、分布式服务框架、云计算等,目前从事软件公司的API开放相关的架构和设计工作。
联系方式:新浪微博 Nettying 微信:Nettying
Email:neu_lilinfeng@sina.com