趣谈网络协议学习笔记——RPC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Q52077987/article/details/82665632

二进制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。

猜你喜欢

转载自blog.csdn.net/Q52077987/article/details/82665632
今日推荐