go语言rpc性能对比 go语言运行效率( 二 )


而RPC 呢,是 Remote Procedure Call Protocol 的简写 , 中文描述是远程过程调用 , 它可以实现客户端像调用本地服务(方法)一样调用服务器的服务(方法) 。
而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的,按理说它和REST不是一个层面意义上的东西,不应该放在一起讨论,但是谁让REST这么流行呢,它是目前最流行的一套互联网应用程序的API设计标准,某种意义下,我们说 REST 可以其实就是指代 HTTP 协议 。
02、使用方式不同
03、面向对象不同
从设计上来看,RPC,所谓的远程过程调用  , 是面向方法的,REST:所谓的 Representational state transfer,是面向资源的,除此之外,还有一种叫做 SOA,所谓的面向服务的架构,它是面向消息的,这个接触不多,就不多说了 。
04、序列化协议不同
接口调用通常包含两个部分,序列化和通信协议 。
通信协议,上面已经提及了 , REST 是 基于 HTTP 协议,而 RPC 可以基于 TCP/UDP,也可以基于 HTTP 协议进行传输的 。
常见的序列化协议,有:json、xml、hession、protobuf、thrift、text、bytes等,REST 通常使用的是 JSON或者XML , 而 RPC 使用的是 JSON-RPC,或者 XML-RPC 。
通过以上几点,我们知道了 REST 和 RPC 之间有很明显的差异 。
然后第二个问题:为什么要采用RPC呢?
那到底为何要使用 RPC,单纯的依靠RESTful API不可以吗?为什么要搞这么多复杂的协议,渣渣表示真的学不过来了 。
关于这一点,以下几点仅是我的个人猜想,仅供交流哈:
说了这么多,我们该如何选择这两者呢?我总结了如下两点,供你参考:
“远程调用”意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个地方(分布到各个服务器),调用者只想要函数运算的结果,却不需要实现函数的具体细节 。
光说不练嘴把式,接下来,我将分别用三种不同的方式全面地让你搞明白 rpc 远程调用是如何实现的 。
01、基于 xml-rpc
Python实现 rpc,可以使用标准库里的 SimpleXMLRPCServer,它是基于XML-RPC 协议的 。
有了这个模块 , 开启一个 rpc server , 就变得相当简单了 。执行以下代码:
有了 rpc server,接下来就是 rpc client,由于我们上面使用的是 XML-RPC,所以 rpc clinet 需要使用xmlrpclib 这个库 。
【go语言rpc性能对比 go语言运行效率】 然后 , 我们通过 server_proxy 对象就可以远程调用之前的rpc server的函数了 。
SimpleXMLRPCServer是一个单线程的服务器 。这意味着,如果几个客户端同时发出多个请求,其它的请求就必须等待第一个请求完成以后才能继续 。
若非要使用 SimpleXMLRPCServer 实现多线程并发 , 其实也不难 。只要将代码改成如下即可 。
02、基于json-rpc
SimpleXMLRPCServer 是基于 xml-rpc 实现的远程调用 , 上面我们也提到 除了 xml-rpc 之外,还有 json-rpc 协议 。
那 python 如何实现基于 json-rpc 协议呢?
答案是很多,很多web框架其自身都自己实现了json-rpc , 但我们要独立这些框架之外 , 要寻求一种较为干净的解决方案,我查找到的选择有两种
第一种是 jsonrpclib
第二种是 python-jsonrpc
先来看第一种 jsonrpclib
它与 Python 标准库的 SimpleXMLRPCServer 很类似(因为它的类名就叫做 SimpleJSONRPCServer,不明真相的人真以为它们是亲兄弟) 。或许可以说,jsonrpclib 就是仿照 SimpleXMLRPCServer 标准库来进行编写的 。
它的导入与 SimpleXMLRPCServer 略有不同 , 因为SimpleJSONRPCServer分布在jsonrpclib库中 。

推荐阅读