当前位置: 首页 > news >正文

Dubbo的实现原理

一句话概括

Dubbo 本质上是一个:

RPC框架 + 动态代理 + 注册中心 + 网络通信(Netty) + 负载均衡 + 服务治理

它让远程调用看起来像本地方法调用。

例如:

userService.queryUser(1L);

你以为是本地方法:

queryUser()

实际上:

Consumer ↓ 网络传输 ↓ Provider ↓ 真正执行方法

1 Dubbo整体架构

经典架构:

Registry (Nacos/ZK) ↑ ↓ Consumer ←→ Provider Netty通信

角色:

Provider

服务提供者

@DubboService public class UserServiceImpl implements UserService { }

启动时:

注册到注册中心

Consumer

服务消费者

@DubboReference private UserService userService;

调用:

userService.queryUser(1L);

Registry

注册中心

常见:

  • Apache ZooKeeper
  • Nacos

负责:

服务注册 服务发现 地址变更通知

2 服务启动过程

Provider启动

例如:

@DubboService public class UserServiceImpl

Dubbo启动后:

第一步

扫描:

@DubboService

第二步

生成服务URL

dubbo://10.1.1.10:20880

第三步

注册到注册中心

/userService 10.1.1.10:20880

Consumer启动

扫描:

@DubboReference private UserService userService;

向注册中心订阅:

/userService

得到:

10.1.1.10:20880 10.1.1.11:20880 10.1.1.12:20880

缓存在本地。


3 调用过程(核心)

最经典面试题:

userService.queryUser() 为什么能调用远程服务?


第一步:生成代理对象

消费者启动时:

@DubboReference private UserService userService;

Dubbo生成代理:

Proxy

类似:

JDK Dynamic Proxy

实际注入:

userService

不是实现类。

而是:

Proxy对象

第二步:拦截调用

调用:

userService.queryUser(1L);

实际上进入:

InvocationHandler.invoke()

收集:

接口名 方法名 参数 参数类型

例如:

{ "service":"UserService", "method":"queryUser", "args":[1] }

第三步:序列化

转成二进制:

Object ↓ byte[]

常见:

Hessian2 FastJson2 Kryo Protobuf

第四步:Netty发送

Dubbo底层使用:

Netty

建立:

TCP长连接

发送:

Consumer ↓ Netty ↓ Provider

4 Provider收到请求

Netty收到数据:

byte[]

反序列化:

byte[] ↓ Invocation

恢复:

queryUser(1L)

反射调用:

UserServiceImpl.queryUser(1L)

执行真实业务。


返回:

UserVO

再次序列化:

UserVO ↓ byte[]

通过Netty返回。


5 Consumer收到结果

收到:

byte[]

反序列化:

UserVO

返回给调用方:

UserVO user = userService.queryUser(1L);

开发者感觉:

像本地调用

其实是远程调用。


6 Dubbo为什么快

因为做了很多优化。


长连接

HTTP:

建立连接 发送 关闭连接

Dubbo:

建立一次 重复使用

即:

TCP长连接

NIO

基于:

Netty

Reactor模型 + 事件驱动

支持高并发。


高效序列化

比JSON更快:

Hessian2 Kryo Protobuf

7 负载均衡

注册中心返回:

A B C

Consumer选择一个。

默认:

Random

随机。


Dubbo支持:

Random RoundRobin LeastActive ConsistentHash

8 容错机制

Provider挂了:

A 挂 B 正常

Consumer自动切换。


支持:

Failover Failfast Failsafe Failback Forking Broadcast

最常用:

Failover

失败重试。


9 Dubbo源码核心链路

调用:

userService.queryUser()

InvokerInvocationHandler.invoke()

MockClusterInvoker

FailoverClusterInvoker

LoadBalance

DubboInvoker

ExchangeClient

NettyClient

网络传输

面试版总结

如果面试官问:

Dubbo实现原理是什么?

可以回答:

Dubbo 是一个基于 RPC 的分布式服务框架。服务提供者启动后会将服务地址注册到注册中心,服务消费者从注册中心订阅服务并获得提供者列表。

消费者通过 Dubbo 生成的动态代理对象发起调用,代理会将接口名、方法名和参数封装成 RPC 请求,经过序列化后通过 Netty 长连接发送到服务提供者。

提供者收到请求后反序列化,通过反射调用目标方法,执行结果再经过序列化返回给消费者。消费者反序列化后得到最终结果,整个过程对业务代码透明,看起来像本地方法调用。

Dubbo 底层核心技术包括动态代理、Netty、序列化、注册中心、负载均衡、集群容错以及 SPI 扩展机制。

Dubbo = 动态代理 + 注册中心 + Netty + 负载均衡 + 集群容错
http://www.cnnetsun.cn/news/2853809.html

相关文章:

  • 公司要求全员学 AI:别只追工具,核心要掌握方法与工作流
  • 蓝桥杯嵌入式备赛避坑指南:从第八届电梯题看状态机设计与调试技巧
  • Windows 10上5分钟搞定EMQX MQTT服务器,叉车本地测试不求人
  • 告别手动复制粘贴!用Wireshark命令行+Python脚本,一键批量提取pcap原始16进制数据
  • 从设计稿到上线:手把手教你用el-table实现高还原度的复杂数据表格(含暗黑模式适配)
  • 保姆级教程:在Win11上搞定MySQL 8.0.28安装与配置(附常见错误排查清单)
  • FusionCompute 8.0 VRM主备部署:从规划IP到登录管理后台的完整配置清单与注意事项
  • 告别Softmax,拥抱Logistic:YOLOv3的多标签分类实战与损失函数调优指南
  • 终于有人整理出了,AI漫剧角色创作全流程:从设定、三视图、表情、动作到提示词
  • 2026成都苹果手机维修性价比推荐:不花冤枉钱的理性选择
  • DocuSign电子签API集成实战:批量发送信封与Webhook回调处理
  • 2026年鹤壁烟酒选购指南:口碑好店真实对比
  • 易连EDI—EasyLink:企业级全场景文件传输管理(MFT)解决方案
  • 通讯管理机之数源系统(一)框架
  • 一个人就是一家公司:200+ AI 专家自动协作,帮你搞定研发、运营和营销
  • 简单易用的进销存该怎么选?分清真易用与功能极简陷阱(2026行业权威标准)
  • js中不会冒泡的事件有哪些?
  • Hybrid AI应用架构设计——WebView+LLM混合开发实践
  • 茶馆主题H5前端静态包|uni-app编译生成,2020风格UI,开箱即用
  • 协议碎片化与性能瓶颈破局:WVP-GB28181-Pro分布式视频管理平台架构深度解析
  • AlistHelper:告别命令行,用图形界面轻松管理Alist文件服务
  • Paperxie 工科代码辅助:AI 一键匹配论文需求生成完整工程源码
  • 【学术干货】清华团队发布RWAI框架:让AI从“能做“到“能落地“,产业应用效率提升50%
  • 线上 Bug 排查与修复实录
  • Android 权限请求构建器使用指南
  • 中小企业做GEO的投入和产出怎么算——从成本、时间线和效果三个方向来看
  • Windows苹果触控板终极指南:免费实现原生级触控体验的完整教程
  • 2026年医学文献AI解读工具热门平台盘点:当循证决策成为医生工作流的新标配
  • 涉及内存指针位运算例题摘要
  • 前端八股文面经大全:美团前端暑期实习一面(2026-06-08)·面经深度解析