过程说明
- 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来响应对应到线程结果;