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

为什么dubbo和openFeign都是通过动态代理的方式发起调用

因为它们要实现同一个目标:

让“远程调用”在代码层看起来像“本地方法调用”

而实现这个目标的关键设计就是:动态代理 + 方法拦截


1 一句话本质

Dubbo / OpenFeign = “接口 = 服务入口” 动态代理 = “拦截方法调用 → 转换成远程请求”

2 为什么必须用动态代理

如果不用代理,你只能这样写远程调用:

❌ 传统写法(侵入性强)

Dubbo之前(HTTP/Socket手写)

HttpClient client = new HttpClient(); String result = client.post( "http://user-service/user/1", json );

问题:

1. 代码和通信强耦合 2. 每个接口都要写一堆模板代码 3. 无法统一治理(重试/负载均衡/降级)

❌ 如果不用代理(RPC直连)

UserServiceStub stub = new UserServiceStub(); stub.invoke("queryUser", args);

问题:

业务代码必须知道“stub细节” 不符合“面向接口编程”

3 动态代理解决什么问题

动态代理的核心作用:

拦截接口方法调用 ↓ 转换成远程请求 ↓ 隐藏网络细节

示例(用户代码)

无论 Dubbo 还是 Feign:

UserService userService; userService.queryUser(1L);

看起来是:

本地方法调用

实际发生了什么

代理对象拦截 ↓ InvocationHandler.invoke() ↓ 组装请求 ↓ 网络通信 ↓ 返回结果

4 Dubbo 为什么用动态代理

关键点:RPC必须“透明”

Dubbo希望:

开发者 = 只写接口

例如:

@DubboReference UserService userService;

实际注入的是:

JDK Proxy / Javassist Proxy

拦截点

InvocationHandler.invoke()

Dubbo做的事:

1. 获取方法名 2. 获取参数 3. 查找Provider 4. 负载均衡 5. 序列化 6. Netty发送

核心思想

接口 = 服务契约 代理 = 网络转换器

5 OpenFeign 为什么用动态代理

Feign的设计更简单:

HTTP接口 = 方法映射

例如:

@FeignClient("user-service") public interface UserClient { @GetMapping("/user/{id}") User get(@PathVariable Long id); }

Feign代理做什么

调用:

userClient.get(1L);

进入代理:

MethodInterceptor

转换为:

GET /user/1

然后:

HttpClient / OkHttp

6 为什么“必须是接口 + 动态代理”

原因1:无法修改业务代码

如果不用代理:

UserClientImpl client = new UserClientImpl();

那你就变成:

强依赖实现类

原因2:必须解耦网络逻辑

业务只应该关心:

方法名 + 参数

不应该关心:

HTTP / TCP / JSON / 序列化

原因3:统一做横切能力

动态代理可以统一插入:

Dubbo

负载均衡 容错 重试 路由 熔断

Feign(Spring Cloud)

Ribbon / LoadBalancer Retry CircuitBreaker Interceptor

7 本质对比(核心)

Dubbo Proxy: 方法 → RPC协议 → Netty Feign Proxy: 方法 → HTTP请求 → REST API

8 如果不用动态代理会怎样

你会变成:

每个服务手写 HTTP/RPC代码 无法统一治理 无法做到接口透明 代码严重重复

9 面试标准总结

可以这样回答:

Dubbo 和 OpenFeign 都采用动态代理的原因,是为了实现“接口即服务”的编程模型,使远程调用对开发者透明。

动态代理可以在不修改业务代码的情况下拦截接口方法调用,在运行时统一转换为 RPC 或 HTTP 请求,从而屏蔽网络通信细节。

同时代理层还能统一增强能力,例如负载均衡、重试、熔断、路由和监控等横切逻辑。

本质上:

  • Dubbo 是将方法调用转为 RPC 调用
  • Feign 是将方法调用转为 HTTP 请求

一句话记忆

动态代理 = 把“方法调用”变成“远程调用”的翻译器
http://www.jsqmd.com/news/984675/

相关文章:

  • 别再只用v-if了!用Vue3自定义指令封装一个权限按钮组件(附完整代码)
  • 平基土石方三维计算软件功能更新至V0.3.2
  • 别再踩坑了!Win10下Qt 5.12.6完整安装与组件选择避坑指南(附清华镜像加速)
  • 避坑指南:Windbg双机调试时,你的网卡真的支持吗?(附Win10支持列表查询)
  • 质量好的家谱软件品牌哪家专业:2026年行业现状与主体分析 - 优质品牌商家
  • 意图共鸣科技《AI记忆链商业化白皮书3.0》技术解读:“AI焦虑的解药”——从通用AI到个人记忆链架构
  • 网络安全第120天
  • CANoe仿真节点间变量不共享?一次搞懂CAPL全局变量的‘副本’机制
  • 2026年靠谱的哈尔滨新房装修/哈尔滨半包装修/哈尔滨定制装修/哈尔滨二手房装修优选服务公司 - 行业平台推荐
  • dubbo和openfeign 远程过程调用有什么区别
  • Elastic Agent独立模式实战:手把手教你从Kibana配置到Nginx日志采集(macOS版)
  • IDEA里文件缓存冲突弹窗别乱点!手把手教你Maven创建项目时正确处理File Cache Conflict
  • 2026年评价高的哈尔滨环保装修/哈尔滨半包装修/哈尔滨新房装修/哈尔滨全包装修行业标杆公司 - 品牌宣传支持者
  • Windows 10上5分钟搞定EMQX MQTT服务器,叉车本地测试不求人
  • CAPL仿真节点隔离揭秘:为什么你的全局变量在另一个.can文件里‘失效’了?
  • 2026年宁波可靠婚姻律师律所排行权威盘点 - 优质品牌商家
  • 别慌!IntelliJ IDEA弹出‘File Cache Conflict’?这其实是你的‘版本时光机’
  • IDEA老用户转投Save Actions插件后,我的代码整洁度提升了200%
  • 汇编语言入门-第一章基础知识
  • MATLAB多缝干涉光强模拟工具:自由调节缝数、缝宽、波长与屏距
  • 2026年嵩明不错的半山温泉推荐:家庭出游优选地 - 2026年企业资讯
  • Perseus实战深度揭秘:三步搞定《碧蓝航线》全皮肤解锁
  • 质量好的聚氨酯封边岩棉复板品牌推荐:基于技术、产能与区域服务的行业分析 - 优质品牌商家
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan部署流程来了
  • 2026年诚信拆除室内装修公司服务能力分析——以成都及周边市场为例 - 优质品牌商家
  • Magpie窗口放大工具:5分钟快速上手,让老旧软件在高分屏上焕然一新
  • 工控人必看!登录到Factory talk 网络秒解[特殊字符]再也不用被罗克韦尔软件卡脖子了
  • HS2-HF_Patch:5分钟掌握Honey Select 2终极汉化去码补丁完全指南
  • 工业布袋除尘器采购指南:主流供应商技术与服务对比分析 - 优质品牌商家
  • Perseus深度实战指南:3步高效解锁《碧蓝航线》全皮肤功能