news 2026/6/25 0:48:10

Dubbo学习(三):深入 Remoting

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Dubbo学习(三):深入 Remoting

深入 Remoting:Dubbo 的“搬运工” —— 网络通信与线程模型

请关注公众号【碳硅化合物AI】

摘要

如果说 RPC 是 Dubbo 的大脑,那么 Remoting 就是 Dubbo 的四肢。它负责把 RPC 层生成的调用请求(Invocation)变成二进制流(Byte Stream),并通过网络搬运到地球的另一端。本篇将带你钻进下水道……啊不,钻进底层,看看 Netty、Mina 是如何被封装成统一的Transporter,以及那些至关重要的 IO 线程和业务线程是如何协作的。

1. 核心角色:网络通信的基石

Remoting 层位于dubbo-remoting模块,它屏蔽了底层网络框架的差异,向上层提供统一的接口。

  1. Transporter: 传输层接口。负责创建Server(服务端)和Client(客户端)。

    publicinterfaceTransporter{RemotingServerbind(URLurl,ChannelHandlerhandler);Clientconnect(URLurl,ChannelHandlerhandler);}

    这也是个 SPI 接口,默认实现是NettyTransporter(基于 Netty 4)。

  2. Channel: 通道。代表一个网络连接,可以发送和接收消息。

  3. ChannelHandler: 处理器。负责处理网络事件:连接建立(connected)、断开(disconnected)、发送消息(sent)、接收消息(received)、异常(caught)。这和 Netty 的 Handler 概念是一致的。

  4. Exchanger: 信息交换层。它在 Transporter 之上包了一层,把底层的单向消息(Message)变成了请求-响应模型(Request-Response)。

    • 底层只知道:发了一个包,收了一个包。
    • Exchanger 知道:发了一个 Request A,收到了 Response A。

核心类关系图 (PlantUML)

2. 线程模型:生死攸关的 Dispatcher

Dubbo 的高性能很大程度上归功于其精细的线程模型。Netty 的 IO 线程(NioEventLoop)负责收发包,但是千万不能在 IO 线程里执行耗时的业务逻辑,否则会阻塞整个 IO 循环,导致吞吐量暴跌。

Dubbo 通过Dispatcher接口来决定:消息派发到哪个线程池去处理?

publicinterfaceDispatcher{ChannelHandlerdispatch(ChannelHandlerhandler,URLurl);}

五种派发策略 (Dispatcher)

策略名关键词行为描述适用场景
all(默认)全都派发连接、断开、请求、响应,所有消息都扔给业务线程池(ThreadPool)。大多数场景,避免 IO 线程阻塞。
direct直接执行所有消息都在 IO 线程上直接执行。只有当业务逻辑极快(如只在内存操作)时使用,否则会卡死 IO。
message仅消息只有请求响应消息扔给业务线程池;连接断开事件在 IO 线程执行。适合心跳检测频繁的场景。
execution仅请求只有请求消息扔给业务线程池;响应消息(Consumer端)在 IO 线程执行。适合 Consumer 端,处理 Response 比较快。
connection连接有序类似 message,但连接断开事件排队串行执行。极少使用。

配置方式:<dubbo:protocol dispatcher="all" threadpool="fixed" threads="200" />

3. 请求-响应模型:如何把异步变同步?

底层的 TCP 是全双工的,我发一个包,不知道什么时候回包。Dubbo 如何让用户感觉像是同步调用方法?

答案:DefaultFuture

  1. 发送时: Consumer 生成一个唯一的Request ID,创建一个DefaultFuture对象,把它存到一个全局 Map 中 (Map<ID, Future>),然后阻塞等待(future.get())。
  2. 传输: Request 包带着 ID 飞到了 Provider,Provider 处理完,生成的 Response 包也带着这个 ID 飞回来。
  3. 接收时: Consumer 收到 Response,提取 ID,去 Map 里找到对应的DefaultFuture,把结果填进去(future.complete(result))。
  4. 唤醒:future.get()被唤醒,拿到结果,方法返回。

消息接收处理时序图 (PlantUML)

4. 编解码:Netty 的魔法

Dubbo 使用 Netty 的ByteToMessageDecoderMessageToByteEncoder进行协议包的拆解和组装。

一个典型的 Dubbo 协议头(16字节):

  • Magic:0xdabb(魔数,识别是不是 Dubbo 包)
  • Flag: 请求/响应?双向/单向?心跳?序列化类型?
  • Status: 响应状态(OK, ERROR…)
  • ID: 8字节请求 ID
  • Length: Body 长度

这种设计解决了 TCP 的粘包/拆包问题。

总结

Remoting 层是 Dubbo 的基石,它不仅封装了 Netty 的复杂性,还通过精妙的线程模型(Dispatcher)平衡了 IO 吞吐量和业务处理能力,并通过 Future 模式实现了异步转同步的魔法。下一篇,我们将进入 Dubbo 的服务治理中心 ——Registry & Configuration,看看服务是如何注册、发现和被配置管理的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 21:22:26

Z-image LoRA 训练整合包下载与使用教程(详细图文教程)

Z-image LoRA 训练整合包下载与使用教程&#xff08;详细图文教程&#xff09; 标签&#xff1a;Z-image、LoRA训练、AI绘图、AI模型训练、Z-image本地部署、LoRA微调、Stable Diffusion LoRA、Z-image整合包 最近后台有不少小伙伴问我&#xff1a;Z-image 的 LoRA 训练怎么…

作者头像 李华
网站建设 2026/6/24 22:25:06

第五十七篇-ComfyUI+V100-32G+安装SD1.5

环境 系统&#xff1a;CentOS-7 CPU : E5-2680V4 14核28线程 内存&#xff1a;DDR4 2133 32G * 2 显卡&#xff1a;Tesla V100-32G【PG503】 (水冷) 驱动: 535 CUDA: 12.2 ComfyUI:系统软件信息 系统信息 OS linux Python Version 3.12.12 | packaged by Anaconda, Inc. | (mai…

作者头像 李华
网站建设 2026/6/25 6:32:31

【异常】豆包TTS语音合成常见报错及SSML代码实现解决方案

一、报错内容 在豆包TTS语音合成使用过程中,出现以下三类典型读音错误,影响语音输出准确性: 符号读音错误:输入文本“睡眠时间7-8小时”,预期输出“睡眠时间7至8小时”,实际输出“睡眠时间7减8小时”; 多音字发音错误:输入文本“偏好”(正确读音为piān hǎo,“好”…

作者头像 李华
网站建设 2026/6/22 23:21:51

基于数据挖掘的中风智能预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 系统概述 随着医疗大数据的快速发展&#xff0c;利用机器学习技术辅助疾病诊断已成为智慧医疗的重要方向。本项目开发了一套基于数据挖掘的中风智能预测系统。该系统旨在通过分析患者的性别、年龄、生活习惯…

作者头像 李华
网站建设 2026/6/24 2:30:22

Windows右键菜单优化全攻略:告别卡顿的3大诊断与4步修复方案

Windows右键菜单优化全攻略&#xff1a;告别卡顿的3大诊断与4步修复方案 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 当点击文件后那个小圆圈不停旋转&#x…

作者头像 李华
网站建设 2026/6/23 23:41:19

终极英雄联盟智能助手:三步实现游戏自动化完全指南

终极英雄联盟智能助手&#xff1a;三步实现游戏自动化完全指南 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为繁琐的…

作者头像 李华