【分布式基础】5.分布式通信-rmi框架

1.什么是RPC
2.RMI的概述
3.源码分析
4.手写实现

 

1.什么是RPC

Remote procedure call protocal

RPC协议其实是一个规范。Dubbo、Thrif、RMI、Webservice、Hessain

网络协议和网络IO对于调用端和服务端来说是透明;

一个RPC框架包含的要素

2.RMI的概述

RMI(remote method invocation)  , 可以认为是RPC的java版本

RMI使用的是JRMP(Java Remote Messageing Protocol), JRMP是专门为java定制的通信协议,所以踏实纯java的分布式解决方案

a)如何实现一个RMI程序

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");

b)如果自己要去实现一个RMI

1.编写服务器程序,暴露一个监听, 可以使用socket

2.编写客户端程序,通过ip和端口连接到指定的服务器,并且将数据做封装(序列化)

3.服务器端收到请求,先反序列化。再进行业务逻辑处理。把返回结果序列化返回

RMI底层实现

3.源码分析

(1)类图

(2)服务端

第一步: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);

-----> exportObject()

------> this.listen();

-------> this.server = var1.newServerSocket();->createServerSocket(this.listenPort);->return new ServerSocket(var1);

-------> new NewThreadAction(new TCPTransport.AcceptLoop(this.server));->this.executeAcceptLoop();->this.serverSocket.accept();

第二步:bind,注册服务对象,生成Skeleton

>Naming类的bind

->Registry registry = getRegistry(parsed);//通过代理获取到RegistryImpl对象

-->然后在RegistryImpl对象的构造函数中 this.setSkeleton(var1);// 生成Skeleton

->registry.bind(parsed.name, obj);

-->private Hashtable<String, Remote> bindings = new Hashtable(101);

(3)客户端

第一步:lookup访问远程服务器查找对应服务,返回stub对象

>Naming类的lookup

--> Registry registry = getRegistry(parsed);

--> registry.lookup(parsed.name);

---> RegistryImpl_Stub类的lookup 返回stub

第二步:stub通过scoket访问skeleton返回需要的数据

(4)总结

4.手写实现

实现逻辑就是上述的时序图与源码分析

code:https://blog.csdn.net/charjay_lin/article/details/80948427

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值