1、RPC(Remote Procedure Call)定义

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

调用分类

RPC 调用分以下两种:

  • 同步调用
  • 客户方等待调用执行完成并返回结果。
  • 异步调用
  • 客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

异步和同步的区分在于是否等待服务端执行完成并返回结果

3、RPC内部操作流程

RPC(Remote Procedure Call)运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:




rpc 处理超时 rpc超时机制_rpc 处理超时


1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

3.消息传送到远程主机

4.服务器句柄得到消息并取得参数

5.执行远程过程

6.执行的过程将结果返回服务器句柄

7.服务器句柄返回结果,调用远程系统内核

8.消息传回本地主机

9.客户句柄由内核接收消息

10.客户接收句柄返回的数据

4、每个组件的职责划分

  1. RpcServer
  2. 负责导出(export)远程接口
  3. RpcClient
  4. 负责导入(import)远程接口的代理实现
  5. RpcProxy
  6. 远程接口的代理实现
  7. RpcInvoker
  8. 客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回
  9. 服务方实现:负责调用服务端接口的具体实现并返回调用结果
  10. RpcProtocol
  11. 负责协议编/解码
  12. RpcConnector
  13. 负责维持客户方和服务方的连接通道和发送数据到服务方
  14. RpcAcceptor
  15. 负责接收客户方请求并返回请求结果
  16. RpcProcessor
  17. 负责在服务方控制调用过程,包括管理调用线程池、超时时间等
  18. RpcChannel
  19. 数据传输通道

5、RPC框架需要解决的问题?

1、如何确定客户端和服务端之间的通信协议?

2、如何更高效地进行网络通信?

3、服务端提供的服务如何暴露给客户端?

4、客户端如何发现这些暴露的服务?

5、如何更高效地对请求对象和响应结果进行序列化和反序列化操作?

6、使用了哪些技术?

1、动态代理

生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候需要用到java动态代理技术,可以使用jdk提供的原生的动态代理机制,也可以使用开源的:Cglib代理,Javassist字节码生成技术。

2、序列化

在网络中,所有的数据都将会被转化为字节进行传送,所以为了能够使参数对象在网络中进行传输,需要对这些参数进行序列化和反序列化操作。

序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。

目前比较高效的开源序列化框架:如Kryo、fastjson和Protobuf等。

3、NIO通信

出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。

Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者mina来解决NIO数据传输的问题。

4、服务注册中心

可选:Redis、Zookeeper、Consul 、Etcd。

一般使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。