当前位置: 首页 > 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.rkmt.cn/news/1496416.html

相关文章:

  • 质量好的家谱软件品牌哪家专业:2026年行业现状与主体分析 - 优质品牌商家
  • 避坑指南:Windbg双机调试时,你的网卡真的支持吗?(附Win10支持列表查询)
  • 意图共鸣科技《AI记忆链商业化白皮书3.0》技术解读:“AI焦虑的解药”——从通用AI到个人记忆链架构
  • 2026年宁波可靠婚姻律师律所排行权威盘点 - 优质品牌商家
  • 汇编语言入门-第一章基础知识
  • 质量好的聚氨酯封边岩棉复板品牌推荐:基于技术、产能与区域服务的行业分析 - 优质品牌商家
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan部署流程来了
  • 2026年成都市政清淤疏通与非开挖修复行业服务能力分析报告 - 优质品牌商家
  • 工业布袋除尘器采购指南:主流供应商技术与服务对比分析 - 优质品牌商家
  • 实习生如何用 AI 做日报、周报和资料整理为什么你的日报被导师嫌弃,而别人的周报能直通转正?
  • 2026系规新教材难度飙升?别怕!老金团队这“三驾马车”专治零基础各种“学不动”
  • 2026年新能源货车选购指南:从政策趋势到车型对比与本地化服务分析 - 优质品牌商家
  • TQVaultAE终极指南:如何彻底解决《泰坦之旅》仓库空间不足的烦恼
  • 物理层的FPGA实现的思考总结(1)
  • 防眩光AG+硬化复合板厂家推荐:复合功能板适合哪些应用场景
  • LumeValley|企业级Agent全栈开发,AI智能体规模化落地
  • Boss-Key:Windows用户的隐私守护神,一键隐藏窗口的终极解决方案
  • 抗垢水路:SEGE在硬水地区保持清爽
  • 视觉伺服:基于图像的IBVS与基于位置的PBVS
  • 如何让《Honey Select 2》游戏体验全面升级:HS2-HF_Patch终极指南
  • 3个月完成全链路升级:300人汽配制造企业SAP升级落地真实案例
  • 阿里云Linux部署PHP项目:LNMP搭建+域名HTTPS+性能优化全流程
  • Windows系统文件dhcpcsvc6.dll文件丢失找不到问题解决
  • 【人工智能】Gemini回复:“Cherry studio跟Monica 选一个,你选谁?理由是?”
  • 机械泵维修方法?机械泵维修费用多少!
  • NomNom:基于.NET 8的《无人深空》存档数据工程化解决方案
  • Cursor Free VIP:终极免费解锁Cursor Pro完整功能的完整指南
  • 艺学启航:为什么企业越来越看重python全栈能力
  • 从“随机抽卡”到“稳定交付”:五步炼成准、稳、实用的提示词
  • AU-48双麦AI降噪回音消除模组