文章目录
一、RPC 调用过程
RPC(Remote Procedure Call,远程过程调用)是一种让不同网络节点上的服务相互调用的技术。它的核心目标是屏蔽远程调用的复杂性,使远程服务的调用方式如同本地调用一样简单。在分布式系统中,RPC 通过封装底层网络通信细节,提高了服务调用的可用性和开发效率。
RPC 调用流程包括:
- 动态代理:客户端通过代理对象调用远程方法。
- 序列化:将请求数据转换为二进制格式,便于传输。
- 协议编码:增加数据包的协议标识和长度信息。
- 网络传输:通过网络传递数据包。
- 协议解码:服务端解析请求包。
- 反序列化:将二进制数据转换回原始对象。
- 执行方法:调用对应的远程方法并处理请求。
- 响应返回:按照相同的序列化、网络传输等流程将响应结果返回给调用方。
二、RPC 动态代理:屏蔽远程通讯细节
动态代理(Dynamic Proxy)是 Java 提供的一种机制,允许在运行时动态创建代理对象,拦截方法调用,并在调用前后执行额外的逻辑。
在 RPC 场景中,动态代理的主要作用是屏蔽底层的远程通信细节,让客户端可以像调用本地方法一样调用远程服务。
1. 动态代理示例
示例代码:
public interface ServerProvider {
void sayHello(String str);
}
public class ServerProviderImpl implements ServerProvider {
@Override
public void sayHello(String str) {
System.out.println("Hello " + str);
}
}
import java.lang.reflect.*;
/**
- `DynamicProxy` 实现了 `InvocationHandler`,用于拦截方法调用并执行代理逻辑。
- `invoke` 方法中:
1. `method.invoke(realObject, args);` 通过反射调用真实对象的方法。
*/
public class DynamicProxy implements InvocationHandler {
private Object realObject;
public DynamicProxy(Object object