news 2026/6/10 3:43:41

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么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 请求

一句话记忆

动态代理 = 把“方法调用”变成“远程调用”的翻译器
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 3:36:32

STM32F103超频实战:用CubeMX和Keil把ADC时钟从14M提到36M,采样率翻倍

STM32F103超频实战:突破ADC时钟限制的性能优化指南引言在嵌入式开发领域,性能优化始终是开发者追求的核心目标之一。对于使用STM32F103系列MCU的工程师而言,ADC采样率往往成为系统性能的瓶颈。官方手册明确标注ADC时钟不得超过14MHz&#xff…

作者头像 李华
网站建设 2026/6/10 3:31:44

Word域代码进阶:教你用\#“0”指令自定义参考文献引用格式(如[1,2,3])

Word域代码深度解析:打造专业级参考文献引用格式定制方案在学术写作或技术文档创作中,参考文献引用格式的规范性直接影响作品的专业程度。许多用户在使用Word的交叉引用功能时,常常受限于默认的[1][2][3]格式,而期刊或出版机构往往…

作者头像 李华
网站建设 2026/6/10 3:09:26

想做陪诊小程序,源码怎么挑才少踩坑?

最近身边有几个朋友在琢磨陪诊方向的创业,不过第一步选源码就被难住了。市面上陪诊系统的源码看着一搜一大把,但用过的都知道,水比想象中深——有些界面做得花哨,跑起来才发现一堆暗坑。刚开始特别容易只看演示漂不漂亮。实际上陪…

作者头像 李华
网站建设 2026/6/10 3:08:04

收银机处理器型号

intel(Celeron 1037U) ,双核双线程,64位架构。其实我的笔记本也是双核双线程的,也能正常运行ubuntu22,所以这个运行ubuntu22完全没问题。

作者头像 李华