【分布式基础】5.分布式通信-rmi框架
1.什么是RPC
2.RMI的概述
3.源码分析
4.手写实现
1.什么是RPC
Remote procedure call protocal
RPC协议其实是一个规范。Dubbo、Thrif、RMI、Webservice、Hessain
RMI(remote method invocation) , 可以认为是RPC的java版本
RMI使用的是JRMP(Java Remote Messageing Protocol), JRMP是专门为java定制的通信协议,所以踏实纯java的分布式解决方案
1.创建远程接口, 并且继承java.rmi.Remote接口
2.实现远程接口,并且继承:UnicastRemoteObject
3.创建服务器程序:注册LocateRegistry.createRegistry(8888);Naming.bind("rmi://localhost:8888/sayHello",hello);
4.创建客户端程序 ISayHello hello=(ISayHello) Naming.lookup("rmi://localhost:8888/sayHello");
2.编写客户端程序,通过ip和端口连接到指定的服务器,并且将数据做封装(序列化)
3.服务器端收到请求,先反序列化。再进行业务逻辑处理。把返回结果序列化返回
第一步:createRegistry,启动服务,创建stub
>RegistryImpl类的 RegistryImpl(final int var1)
-> this.setup(new UnicastServerRef(var2));
-> var1.exportObject(this, (Object)null, true);
--> this.setSkeleton(var1);//如果是远程stub则生成,在下面的bind中调用
--> var5 = Util.createProxy(var4, this.getClientRef(), this.forceStubUse);
---> var3 = getRemoteClass(var0);
---> return createStub(var3, var1);//生成stub
--> this.ref.exportObject(var6);
---> this.ep.exportObject(var1);
----> this.transport.exportObject(var1);
-------> this.server = var1.newServerSocket();->createServerSocket(this.listenPort);->return new ServerSocket(var1);
-------> new NewThreadAction(new TCPTransport.AcceptLoop(this.server));->this.executeAcceptLoop();->this.serverSocket.accept();
->Registry registry = getRegistry(parsed);//通过代理获取到RegistryImpl对象
-->然后在RegistryImpl对象的构造函数中 this.setSkeleton(var1);// 生成Skeleton
->registry.bind(parsed.name, obj);
-->private Hashtable<String, Remote> bindings = new Hashtable(101);
第一步:lookup访问远程服务器查找对应服务,返回stub对象
--> Registry registry = getRegistry(parsed);
--> registry.lookup(parsed.name);
---> RegistryImpl_Stub类的lookup 返回stub
第二步:stub通过scoket访问skeleton返回需要的数据
code:https://blog.****.net/charjay_lin/article/details/80948427