起因
这仨词经常见,但他们到底是什么,怎么用我也不是很清楚,甚至他们是不是一类东西我都不是很清楚,心里默认都是网络相关的…所以简单的学习下,并不会研究的很透彻,只是能区分知道什么时候用什么比较好就可以了
概念
SOA(Service-Oriented Architecture):面向服务的结构
RPC(Remote Procedure Call):远程过程调用
REST(Representational State Transfer):表述性状态传递
SOA
SOA 是一种设计方法,其中包含多个服务,而服务之间通过配合最终会提供一系列功能。一个服务通常以独立形式存在于操作系统进程中。服务之间通过网络调用,而非进程内调用的方式进行通信。简单的理解 SOA 就是一种粗粒度、松耦合的服务架构。再简单的理解就是拆
拆完之后解决了臃肿等等问题,但也有新的问题产生了,细粒度的服务之间怎么通信呢?于是便可以引出 RPC(socket) 和 REST(http+json) 了,其实还有 SOAP(http+xml),这里不详细展开了
RPC
RPC 即远程过程调用,就是 A 和 B 服务在两台机器(容器环境也可以理解为两个pod)上,不能直接调用,需要通过网络来表达调用的语义和数据。简单的理解就是 RPC 可以让像调用本地方法一样去调用远程方法
RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行
一次 RPC 调用
服务消费者(Client 客户端)通过本地调用的方式调用服务
客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体
客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端
服务端存根(Server Stub)收到消息后进行解码(反序列化操作)
服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理
服务端(Server)本地服务业务处理
处理结果返回给服务端存根(Server Stub)
服务端存根(Server Stub)序列化结果
服务端存根(Server Stub)将结果通过网络发送至消费方
客户端存根(Client Stub)接收到消息,并进行解码(反序列化)
服务消费方得到最终结果
RPC 框架假定一些网络传输协议(TCP/UDP)的存在,我们不用关心具体是什么。常见的 RPC 框架有阿里的 dubbo(采用RPC协议),Spring Cloud(采用http restful协议)。所以这里可以引出真正的引用 REST 了
REST
REST 采用 Web 服务使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 将所有 Web 系统的服务抽象为资源,REST 不是一种协议,它是一种架构,一种 Web Service 能够如果满足 REST 的几个条件,通常就称这个系统是 Restful 的
REST 是面向资源的,这点很重要。REST 从资源的角度来观察整个网络,分布在各处的资源由 URI 确定,而客户端的应用通过 URI 来获取资源的表征。Http协议所抽象的 get,post,put,delete 就好比数据库中最基本的增删改查
项目里使用 RESTful 的都会比较容易理解 REST,比如服务请求必须使用名字,不能使用动词;请求类型不同 POST 一撸到底等等