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

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

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


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 请求

一句话记忆

动态代理 = 把“方法调用”变成“远程调用”的翻译器
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐