RPC是什么 ? 网上是这么解释的 :

RPC(Remote Procedure Call)— 远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

基于java实现的RPC通讯框架,底层使用java的序列化机制。而Hadoop分布式集群的通讯方式就是基于java的RPC通讯框架。同时Spark使用的是基于netty的RPC通讯框架,netty底层基于Scala的actor编程实现,本身是基于message消息机制,这也是Spark与Hadoop的不同点之一。

下面以用户的远程登录/注册案例进行解释具体的过程 : 基于分层思想进行Service业务层和Dao操作层的划分

在客户端生成包含有全类名 ,方法名 ,参数类型列表 ,实参等信息的序列化对象user (全类名是方法所在的类) , 通过Socket网络传输到对应端口号的服务端 . 服务端接收到序列化对象后进行反序列化操作 , 得到全类名 ,方法名 ,参数类型列表 ,实参等信息 , 通过反射调用业务层中的方法 ,并传入包含用户名和密码的user对象信息 . 在方法中继续调用传入user对象信息的Dao层的方法逻辑 , 在Dao层中可以进行数据库 / 文件的用户信息比对 , 比对结果出来以后将user信息返回给上层调用者 , 在方法所在类中将user信息封装成Response类的序列化对象 , 返回给控制层后以序列化对象的形式对客户端进行响应。

java 原生rpc rpcx java_序列化

客户端:

组成部分:

1.客户端 : 又称控制层 . 用来向服务端发送请求 , 传输对象信息以及接受服务器响应等

2.java的Bean对象 : 封装对象信息 , 服务器响应信息以及用户信息等 . 需要实现序列化接口 , 同时存在于客户端与服务端

发送请求过程 : 

1.创建Socket对象 , 与服务端建立连接

2.获得对象输出流 , 并将发送信息封装成Request对象 , 进行序列化传输 : 对象信息包括 全类名 方法名 参数类型列表 实参

3.发送序列化对象 ; 

4.(提前获得对象输入流,在服务器完成请求后)接收服务器的响应信息

5.关闭IO流资源

服务端:

组成部分:

1.服务端 :又称控制层 . 用来接收并解析客户端对象信息 ,  以及对客户端做出响应等

2.java的Bean对象 : 封装对象信息 , 服务器响应信息以及用户信息等 . 需要实现序列化接口 , 同时存在于客户端与服务端

3.Serivce业务层 : 用来进行具体业务的处理 , 包含大量方法的判断 . 子类实现了同一个接口

4.Dao操作层 :  主要封装了业务层中会重复使用的方法 , 降低了业务层的代码冗余 . 子类实现了同一个接口

接收请求过程:

1.在监听端口号的情况下 , 接收Socket对象;

2.接收输入流数据 , 并进行对象信息的反序列化 . 获得包含请求信息的对象;

3.读取对象信息 , 获得 全类名 方法名 参数类型列表 实参

4.以User对象信息为实参 , 利用反射调用服务端Service业务层的方法 , 再通过Dao层进行数据库 / 文件的信息检索 ;

5.请求完成后 , 将返回的User对象信息封装成Response对象 , 通过序列化传输给客户端;

6.关闭IO流资源 .