一句话概括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 ZooKeeperNacos负责服务注册 服务发现 地址变更通知2 服务启动过程Provider启动例如DubboService public class UserServiceImplDubbo启动后第一步扫描DubboService第二步生成服务URLdubbo://10.1.1.10:20880第三步注册到注册中心/userService 10.1.1.10:20880Consumer启动扫描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 ↓ Provider4 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基于NettyReactor模型 事件驱动支持高并发。高效序列化比JSON更快Hessian2 Kryo Protobuf7 负载均衡注册中心返回A B CConsumer选择一个。默认Random随机。Dubbo支持Random RoundRobin LeastActive ConsistentHash8 容错机制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 负载均衡 集群容错