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 的逻辑
发布于:湖南省