二进制RPC
RPC,远程过程调用,可以认为是在不同进程或者主机间调用函数。这是计算分离的一种方式。比如HTTP请求,同样是在远程执行一个计算过程并返回结果。而RPC的特点是调用方一般保留有一个Stub,使用者看起来就像调用本地函数一样调用这个函数,而RPC库封装了网络请求的过程。RPC一般是服务间互相调用常采取的技术。
RPC主要有两个部分构成,一个是RPC协议,就是规定如何调用一个远程函数,函数名如何表示,参数如何表示,返回值如何表示等等。第二部分是RPC实现,一般是通过Socket TCP编程实现,这就需要考虑网络错误,重传,性能等问题。
不管使用什么实现,RPC的架构如下:
Bruce Jay Nelson 写了一篇论文Implementing Remote Procedure Calls 定义了RPC的调用标准。
二进制的RPC使用一般是找一个开源的靠谱的库。
SOAP
SOAP(Simple Object Access Protocol)是一种RPC协议,使用XML表示函数的调用和返回结果,使用HTTP协议来传输XML,也可以说是一种WebService协议。
<?xml version="1.0" encoding='UTF-8 ?>
<order>
<date>2018-07-01</date>
<className>趣谈网络协议</className>
<Author>刘超</Author>
<price>68</price>
</order>
SOAP的好处是更灵活。因为二进制的序列化是非常严格的,不能有一点不同,所以扩展性不好,比如增加一个参数,所有调用者都需要修改代码。而XML就没有这个问题。但是使用文本表示函数调用并且使用HTTP协议实现RPC,性能是比较差的。
关于SOAP,还有一个概念WSDL(Web Service Description Languages)。WSDL是用于描述一个服务的,相当于一个Schema,这样就不需要使用文档来描述服务了。
<wsdl: types>
<xsd:schema targetNameSpace="http://www.example.org/geektime">
<xsd:complexType name="order">
<xsd:element name="date" type="xsd:string"></xsd:element>
<xsd:element name="Author" type="xsd:string"></xsd:element>
<xsd:element name="price" type="xsd:int"></xsd:element>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl: message name="purchase">
<wsdl:part name="purchaseOrder" element="tns:order"></wsdl:part>
</wsdl:message>
...
...
WSDL描述比较复杂,但是很严谨。实际工作中使用工具来生成,或者根据工具来生成Stub。
SOAP三大要素:协议约定WSDL,传输协议HTTP,服务发现UDDL
RESTful
RESTful是另外一种WebService,使用JSON表示函数调用和数据,同样使用HTTP来传输。同时规定了一种以资源为中心的架构风格。和SOAP不同,RESTful并不是通过客户端的Stub调用,而是以URL的方式提供HTTP的网络API,因此,RESTful可以不算是RPC,因为不符合上图中的RPC架构。使用RESTful架构的一个特点是服务端不需要维护Session状态(同样一个URL每次访问返回的都是同样的数据,状态记录在客户端)。
总结
基于二进制协议的RPC适用于公司内部服务间的调用,性能好;基于SOAP的RPC调用可以发布给外部的服务调用,RESTful也可以做,但是要做好文档工作;RESTful方式适用于给大量的客户端提供API。