你的位置:Bsport体育押和技巧 > 新闻动态 >

【蓝因子教育】Dubbo 通信流程详解_netty_队列_Future

2025-05-24 新闻动态 57

我们用的 Dubbo 版本比较老,是 2.5.x 的,它使用的 netty 版本是 3.2.5,最新版的 Dubbo 在线程模型上有一些修改,我们以下的分析是以 2.5.10 为例。

以图和部分代码说明 Dubbo 协议的调用过程,代码只写了一些关键部分,使用的是 netty3,dubbo 线程池无队列,同步调用,以下代码包含了 Dubbo 和 Netty 的代码。

整个 Dubbo 一次调用过程如下:

1. 请求入队

我们通过 Dubbo 调用一个 rpc 服务,调用线程其实是把这个请求封装后放入了一个队列里。这个队列是 netty 的一个队列,这个队列的定义如下,是一个 Linked 队列,不限长度。

主线程经过一系列调用,最终通过 NioClientSocketPipelineSink 类里的方法把请求放入这个队列,放入队列的请求,包含了一个请求 ID,这个 ID 很重要。

展开剩余37%

2. 调用线程等待

入队后,netty 会返回给调用线程一个 Future,然后调用线程等待在 Future 上。这个 Future 是 Dubbo 定义的,名字叫 DefaultFuture,主调用线程调用 DefaultFuture.get (timeout),等待通知,所以我们看与 Dubbo 相关的 ThreadDump,经常会看到线程停在这,这就是在等后台返回。

3.IO 线程读取队列里的数据

这个工作是由 netty 的 IO 线程池完成的,也就是 NioWorker,对应的类叫 NioWorker。它会死循环的执行 select,在 select 中,会一次性把队列中的写请求处理完,select 的逻辑

发布于:湖南省
话题标签