dubbo 远程调用zookeeper地址 dubbo远程调用过程_dubbo本地调用和远程调用


过程说明

  1. dubbo消费者调用接口,将请求封装为Request;

每个Request都有一个ID,是自增的,此ID会关联下面生成的Future,用于收到接口响应后的回调,对应步骤21。

2. 发送请求,直接返回ResponseFuture(实现为DefaultFuture);

dubbo调用默认为同步方式,即future.get()。

3. 此步骤默认使用Netty API,将请求发送到队列;

4. 从队列中取出请求后由Netty IO线程处理,发送TCP请求到缓冲区;

5. 发送数据到Socket缓冲区;

6. 数据传输,操作系统层面;

7. 从Socket缓冲区读取数据,IO线程进行处理;

8. 根据Dubbo配置到消息分发机制,交由对应到Dispatcher处理;

http:// dubbo.apache.org/zh-cn/ docs/dev/impls/dispatcher.html
dispatcher:这个字段代表的是IO线程池和业务线程池的边界
all:所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。对应的是AllChannelHandler
direct:所有消息都不派发到线程池,全部在IO线程上直接执行。(这种做法在绝大多数情况下都不合理,因为毕竟业务逻辑相关对IO事件都是复杂的)。具体的实现方式就是在装饰者的层级上直接下调,不再包装线程池。
message:只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。
execution:官方的说法是:只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
connection:在IO线程上,将连接建立以及断开事件放入队列,有序逐个执行,其它消息派发到线程池。

9. 以AllDispathcer为例,使用Dubbo 线程池进行处理;

10. 根据请求从Map获取之前暴露到Exporter;

11. 从Exporter中获取对应到Invoker;

12. 调用invoker.invoke,通过代理调用接口;

13. 调用接口后将返回结果发送给客户端;

步骤14-18参考步骤4-8

20. DubboClientHandler线程池处理收到到结果;

21. 通过Response的ID获取到对应到Future,执行future.doReceive来响应对应到线程结果;