版权声明:本文为博主原创文章,博未经主网求允许不得转载。https://blog.csdn.net/xiao_longhua/article/details/90580964
一、RPC 工作原理
就是客户端上运行的程序在调用对象方法时,底层将针对该方法的调用转换为TCP/HTTP请求,发送到远端服务器,远端服务器监听固定端口,收到这个TCP/HTTP请求后会解析出相关信息,包括客户端想要调用哪个类的哪个方法,参数是什么等,然后进行对应的调用,将调用结果再通过数据包发回即可。RPC中一般会有一些“契约”的概念,即客户端和服务端双方约定好的接口,表明服务端实现了哪些接口,客户端可以使用这些接口。下面以一个我实现的简单的RPC框架为例说明。
二、动态代理在RPC 中的用法
PS:java 动态代理详解
1.创建服务端接口IMyProxyServer.java
,创建方法method1
和method2
public interface IMyProxyService {
void method1();
void method2();
}
2.创建实现接口方法的Class MyProxyServiceImpl.java
文件
public class MyProxyServiceImpl implements IMyProxyService {
@Override
public void method1() {
System.out.println("method1:"+1);
}
@Override
public void method2() {
System.out.println("method2:"+2);
}
}
3.创建个Demo类TestProxy.java
,来实现代理
public class TestProxy {
public static void main(String[] args) {
//创建实例
final IMyProxyService obj = new MyProxyServiceImpl();
//创建代理对象
IMyProxyService proxy= (IMyProxyService) Proxy.newProxyInstance(
TestProxy.class.getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
if(method.getName().equals("method1"))
{
System.out.println("TestProxy method1");
return null;
}else{
method.invoke(obj,objects);
}
return null;
}
});
//执行方法
proxy.method1();
proxy.method2();
}
}
4.打印结果:
从结果可以看出:
(1)通过收到的客户端请求知道调用哪个类,从配置文件中读取该类的全限定名加载到JVM,反射出该类实例;
(2)通过反射出来的实例进行方法调用;
(3)通过main函数返回调用结果;
三、RPC 调用分类
RPC 调用分以下两种:
1. 同步调用
客户方等待调用执行完成并返回结果。
2. 异步调用
客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。
若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
异步和同步的区分在于是否等待服务端执行完成并返回结果。
四、RPC 结构拆解
RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。
RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。
五、总结
RPC 在dubbo/dubbox 中占据重要位置,只有理解其内在原理,才能更好的运用。。