java轻量级rpc雏形通过动态代理+反射实现:客户端用proxy生成接口代理,invocationhandler封装请求并网络调用;服务端根据接口名和方法名反射执行注册的实现类方法,序列化结果返回。

Java 用动态代理 + 反射实现一个轻量级 RPC 框架雏形,核心在于:客户端不直接调用远程服务,而是通过本地代理“假装”在调用本地接口;代理内部把方法名、参数等信息序列化后发给服务端;服务端反序列化、用反射执行真实方法,再把结果返回。
1. 定义统一的服务接口(契约先行)
RPC 的前提是双方约定好接口。比如定义一个计算服务:
public interface Calculator {
int add(int a, int b);
int multiply(int a, int b);
}
注意:接口必须是纯 Java 接口(无实现),且所有参数/返回值类型需可序列化(如基本类型、String、POJO 等)。
2. 服务端:用反射执行方法
服务端启动时,注册实现类(如 CalculatorImpl),并监听网络请求(可用简单的 Socket 或 Netty)。
收到请求后(假设已反序列化为一个请求对象):
- 根据接口全限定名(如
"com.example.Calculator")和方法名(如"add")找到对应实现类的实例 - 用
Class.getMethod(methodName, ...)获取Method对象 - 调用
method.invoke(instance, args)执行,并捕获异常 - 将返回值或异常封装成响应,序列化后回传
3. 客户端:用动态代理生成“假实现”
客户端不写具体调用逻辑,而是让 JVM 自动生成代理对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现
InvocationHandler,重写invoke() - 在
invoke中:获取方法名、参数类型、参数值 → 封装成请求对象 → 序列化 → 发送 HTTP/Socket 请求 → 接收响应 → 反序列化结果 → 返回 - 用
Proxy.newProxyInstance()创建代理实例,类型就是你的接口(如Calculator.class)
使用时就像调用本地对象:
Calculator calc = RpcClient.create(Calculator.class, "localhost", 8080); int result = calc.add(3, 5); // 实际走网络,但代码完全透明
4. 补充关键点(让雏形能跑起来)
– 序列化:初期可用 JDK 自带的 ObjectOutputStream(注意开启 Serializable),后续可换 JSON 或 Hessian
– 协议设计:至少包含:接口名、方法名、参数类型数组、参数值列表、请求 ID(用于异步响应匹配)
– 网络通信:不用 Netty 也可用阻塞式 Socket + 单线程处理(仅作演示),但要注意 I/O 阻塞问题
– 异常传递:服务端把异常信息(message + class name)一并返回,客户端用 new RuntimeException(msg) 包装抛出,保持语义一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










