概念
远程过程调用(RPC)是一个协议,程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需要知道网络细节
模式
- C/S模式
- 基于传输层协议(例如TCP/IP)
- 事件处理模型(请求、计算、响应)
目的
- 调用非本机的方法
- 不同语言程序之间通信
- 不了解底层通信,像本地方法一样调用
应用
- 分布式程序的基础(分布式操作系统,分布式计算,分布式软件设计)
- 垂直应用服务化拆分
框架设计
RPC的过程详解
从RPC的角度看,应该有服务的提供方,即生产者;还有服务的调用方,即消费者。
对消费者来时,在RPC调用过程中,使用第1步、第2步、第3步、第4步是透明的,其他的都是使用RPC框架去封装这些事情。当应用开始调用PRC的方式时,就会去容器中去取Bean对象,所以我们应该首先注册Bean对象到容器中,我们通过Java的动态代理,将代理过程封装到代理对象中,代理对象实现接口,创建实例到容器中。相应的,在调用远程对象的对象方法时,就会调用动态代理中的方法,这就是代理层的作用。
代理对象在获取到请求方法、接口和参数时,就会用序列化层,将这些信息封装成一个请求报文,再让通信层向服务端传送报文的内容,然后就到了生产者这块。
相应的服务必须有个监听器,来监听来自其他服务的请求,一般都会用容器做消息的监听,就会调用对应的Bean对象的方法,去处理响应的请求。当然,RPC框架不会让容器中的每一个框架都会被调用,所以只有注册了的Bean才会被RPC的请求调用到。然后,通过请求中的类、方法、参数,反射调用对应的Bean,拿到结果之后,通过序列化层,封装好结果报文,服务端的通信层将报文反馈给调用方,调用方解析到返回值,动态代理类返回结果,调用结束。
这样,一个完整的RPC调用反馈链条就完成了。
消费者设计
①代理层
消费者将对应的接口,通过RPC框架的代理来生成一个对象到Spring容器中。代理层将代理接口生成该接口的对象,该对象处理调用时传过来的对象、方法、参数,通过序列化层封装好,调用网络层。
②序列化层
将请求的参数序列化成报文;将返回的报文反序列化成对象;
③网络层
将报文与服务端通信;接收返回结果。
生产者设计
①代理层
一个应用提供服务,必须由一个网络监听的模块,这个模块大多有开源的容器来处理网络上的监听;服务需要注册,只有注册了的服务才可以被调用;注册的服务需要被我们发射调用到,来进行相应的处理。
②序列化层
就是相应的做请求的反序列化和结果的序列化。
③网络层
接收客户端报文;将序列化的结果返回给客户端。
特点
- 封装网络交互
- 尽量不让框架的使用者设计到过多的网络层的开发
- 远程调用的对象代理
- 将接口代理的对象放入spring容器中,方便服务端开发
- 支持容器(Spring、Jetty等)
- 可配置、可扩展
总结
Proxy代理层
用于对象的代理;对象的反射调用;RPC流程的控制;服务的注册。
Serialize序列化层
将请求序列化和结果反序列化。
Invoke网络模块
主要用于网络通信的相关处理;与其它服务器之间的调用。
Container容器组件
这层主要用于代理层监听网络请求;容器相关。