分布式架构网络通信

一、RPC(远程过程调用)

1. RPC架构

  • 客户端(Client),服务的调用方。
  • 客户端存根(Client Stub),存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端(Server),真正的服务提供者。
  • 服务端存根(Server Stub),接收客户端发送过来的消息,将消息解包,并调用本地的方法2

2.RPC调用过程

调用过程

RPC的目标是要把2、3、4、7、8、9这些步骤都封装起来。

注意:无论是何种类型的数据,最终都需要转换成二进制流在网络上进行传输,数据的发送方需要将对象转换为二进制流,而数据的接收方则需要把二进制流再恢复为对象。

在java中RPC框架比较多,常见的有Hessian、gRPC、Thrift、Dubbo 等,其实对于RPC框架而言,核心模块就是通讯和序列化

ps:RPC并不是一个具体的技术,而是指整个网络远程调用过程。

二、RMI(远程方法调用)

Java RMI 指的是远程方法调用 (Remote Method Invocation),是java原生支持的远程调用

1.RMI的架构

客户端:

  • 存根/桩(Stub):远程对象在客户端上的代理;

  • 远程引用层(Remote Reference Layer):解析并执行远程引用协议;

  • 传输层(Transport):发送调用、传递远程方法参数、接收远程方法执行结果。

服务端:

  • 骨架(Skeleton):读取客户端传递的方法参数,调用服务器方的实际对象方法, 并接收方法执行后的返回值;
  • 远程引用层(Remote Reference Layer):处理远程引用后向骨架发送远程方法调用;
  • 传输层(Transport):监听客户端的入站连接,接收并转发调用到远程引用层。

注册表(Registry):

  • 以URL形式注册远程对象,并向客户端回复对远程对象的引用。

rmi

RMI和RPC的区别

1:方法调用方式不同:

  • RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。
  • RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。

2:适用语言范围不同:

  • RMI只用于Java;
  • RPC是网络服务协议,与操作系统和语言无关。

3:调用结果的返回形式不同:

  • Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;
  • RMI的结果统一由外部数据表示,这种语言抽象了字节序类和数据类型结构之间的差异。
Author: iMine
Link: https://imine141.github.io/2020/08/07/%E5%88%86%E5%B8%83%E5%BC%8F/%E5%88%86%E5%B8%83%E5%BC%8F%E7%90%86%E8%AE%BA/%E5%88%86%E5%B8%83%E5%BC%8F%E6%9E%B6%E6%9E%84%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.