Dubbo的通信机制
buffer:主要是针对NIO的Buffer做了一些封装。
exchange:信息交换层,这也是整个通信过程的核心层。
telnet:主要是针对telnet提供编解码转换。
transport:网络传输层(Transport),抽象Mina和Netty为统一接口,以Message为中心,扩展接口为Channel、Transporter、Client、Server和Codec等。在Dubbo中具体的传输功能实现都继承自Transporter接口,此接口只包含bind和connect两个方法接口。通过SPI的adaptive注解方式进行注解,默认为Netty。主要包括两大部分,一个是基于Codec2的数据编码和解码,还有一个是基于Transport的数据传输封装。
我们在使用Netty进行消息通信的时候,ChannelHandler的send方法只负责不断地发送消息,而received方法只负责不断地接收消息,整个过程是异步的。我们在实际使用Dubbo进行通信的时候感受到的往往是同步的过程,客户端发送消息然后得到返回结果,这个过程是如何实现的呢?
如果不需要返回值则直接使用send方法将信息发送出去。
如果需要异步通信(isAsync为true),则使用request方法构建一个ResponseFuture,然后将ResponseFuture封装成FutureAdapter,再绑定RpcContext中。
如果需要同步通信(isAsync为false),则使用request方法构建一个ResponseFuture,阻塞等待请求完成。
在异步通信的情况下,代码中一个关键的类是ResponseFuture,将其和当前线程绑定在RpcContext对象中,如果我们要获取异步结果,则需要通过RpcContext来获取当前线程绑定的RpcContext,然后就可以获取Future对象了。