RPC
RPC 主要是基于 TCP/IP 协议的,属于传输层。
RPC (Remote Procedure Call),远程过程调用,就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。通常的调用过程是把函数序列化,远端收到后,再把函数反序列化,完成函数调用。
一个完整的 RPC 的架构应该包含以下几个组件:
客户端(Client):服务的调用方。
服务端(Server):真正的服务提供者。
Client stub:存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
Server stub:接收客户端发送过来的消息,将消息解包,并调用本地的方法。
一个完整的 RPC 过程:
RPC 采用 Client-Server 结构,通过 request-response 消息模式实现。
在实际开发的情况下,RPC 很少用到 http 协议来进行数据传输,毕竟只是想传输一下数据而已,何必动用到一个文本传输的应用层协议呢。为什么不直接使用二进制传输?比如直接用 Java 的 Socket 协议进行传输?
不管用何种协议进行数据传输,一个完整的 RPC 过程,都可以用下面这张图来描述:
1、Client 是服务调用方,Server 是服务提供者。
2、左边的 Client 里的 Application 就是一个真正的调用者,先去调用 Client Stub 这个代理对象,其实内部是通过 RPC 方式来进行远程调用的代理对象,这一步主要是来传递参数。
3、至于 Client Runtime Library,则是实现远程调用的工具包,比如 jdk 的 Socket。最后通过底层网络实现实现数据的传输。
4、客户端本地操作系统将消息从客户端机器发送到服务端机器。
5、服务端操作系统接收到数据包传递给 Server Stub。
6、Server Stub 解组消息为参数。
7、Server Stub 再调用服务端的函数(或方法),得到执行结果之后以反方向的相同的步骤响应给客户端,至此就完成了一次 RPC 调用。
在这个过程中最重要的就是 序列化 和 反序列化。因为数据传输的数据包必须是二进制的,直接丢一个 Java 对象过去,人家可不认识,必须把 Java 对象序列化为二进制格式,传给 Server端,Server 端接收到之后,再反序列化为 Java 对象。
RESTFul
REST API 是基于 HTTP 协议来传输数据的,属于应用层。
restful 是一种网络应用程序的设计风格和开发方式,基于 http 实现,可以使用 xml 格式定义或 json 格式定义。restful 适用于移动互联网厂商作为业务使能接口的场景,实现第三方 ott 调用移动网络资源的功能,动作类型为查询、新增、变更和删除所调用的资源。
REST 充分利用 HTTP 自身的 GET、POST、PUT、DELETE 的方法实现接口的统一化,比如对一个资源进行 CURD 的操作,如下所示:
GET url/user 获取所有用户
POST url/user 新增/修改用户信息
PUT url/user 修改用户信息
DELETE url/user 删除用户信息
标签:调用,Server,RPC,Client,序列化,RESTFul,客户端
From: https://www.cnblogs.com/bran-new/p/17041642.html