Dubbo总体设计流程
Provider的响应流程:
1 | NettyHandler.messageReceived |
Consumer接收响应流程:
1 | NettyHandler.messageReceived |
分析DefaultFuture.doReceived()方法:
1 | private void doReceived(Response res) { |
这里是Dubbo网络通信IO异步转同步的方式。
Dubbo网络通信IO异步转同步
Dubbo是基于Netty NIO的非阻塞并行调用通信,通信方式有三种类型,参见DubboInvoker.java:
1.异步,有返回值
修改consumer-dubbo.xml
1 | <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"> |
修改Consumer调用代码:
1 | DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy |
2.异步,无返回值
修改consumer-dubbo.xml
1 | <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"> |
修改Consumer调用代码:
1 | DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy |
3.异步变同步(默认通信方式)
A.当前线程怎么让它 ”暂停,等结果回来后,再执行”?—-Future
B.socket是一个全双工的通信方式,那么在多线程的情况下,如何知道那个返回结果对应原先那条线程的调用?
—-通过一个全局唯一的ID来做consumer 和 provider 来回传输。
如DefaultFuture:
1 | // invoke id. |
其中的id就是全局通信id,Consumer调用时会设置id,响应时仍然填充返回。