python中xmlrpc牛刀小试

达芬奇密码2018-07-30 13:58

什么是rpc: RPC(Remote Procedure Call Protocol)——远程过程调用协议。通俗来说就是比如有两台服务器A和B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 下图表示了client与server之间的调用关系:

RPC的协议有很多,Java RMI,Web Service的RPC风格,Hessian,Thrift,XML-RPC等。 这么多RPC协议让人眼花缭乱,但他们大概可以分成下面几个阵营:

1.Web Service采用HTTP协议做传输层协议,采用SOAP做应用层协议,序列化方式基于文本的xml。 2.XML-RPC,采用HTTP协议做传输层协议,使用自定义XML做应用层协议。 3.RMI基于Java序列化协议,使用TCP做传输协议,使用自定义应用层协议。 4.Thrift, Protobuf等都使用TCP做传输协议,使用自定义应用层协议,Thrift, Protobuf等都使用TCP做传输协议,使用自定义应用层协议。

本文就挑选了xmlrpc这种协议进行介绍和示例。 什么是xmlrpc: XML-RPC的全称是XML Remote Procedure Call,即XML(标准通用标记语言下的一个子集)远程方法调用。 它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。 一个XML-RPC消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。 以python的SimpleXMLRPCServer模块为例,它提供了一个基于XML-RPC的解决方案,不过用法很简单。 1.首先,就像在编写普通的程序那样子编写服务器。 2.接着使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象。 3.最后,在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可。 xmlrpc牛刀小试: 服务端示例: python_server.py 

import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer

def is_even(n):
    return n%2 == 0

server = SimpleXMLRPCServer(("10.160.128.218", 8999))
print "Listening on port 8999..."
server.register_function(is_even, "is_even")
server.serve_forever()

这个服务端定义了一个is_even()函数,判断是否为偶数,并且启动了一个server服务,持续监听消息请求。 客户端示例: python_client.py 

import xmlrpclib
proxy = xmlrpclib.ServerProxy("http://10.160.128.218:8999/")
print "3 is even: %s" % str(proxy.is_even(3))
print "100 is even: %s" % str(proxy.is_even(100))

客户端使用xmlrpclib.ServerProxy连接到服务器,并且调用服务端的is_even函数,即可。

演示: 启动服务端:

nefs@nefs-test-ps0:~/cxq$ python python_server.py 
Listening on port 8999...

启动客户端:

nefs@nefs-test-ps1:~$ python python_client.py 
3 is even: False
100 is even: True

可以看到3和100分别返回了不是偶数,和是偶数的结果,也就是调用服务器的is_even函数生效了。 这时查看服务端:

nefs@nefs-test-ps0:~/cxq$ python python_server.py 
Listening on port 8999...
10.160.128.219 - - [07/Jan/2016 10:41:37] "POST / HTTP/1.1" 200 -
10.160.128.219 - - [07/Jan/2016 10:41:37] "POST / HTTP/1.1" 200 -

说明服务器端接收到2条http-post请求。 总结: XML-RPC请求是一个协议,SimpleXMLRPCServer模块方便的使用这个协议实现了客户端和服务器端的远程调用,而不需要自己组装XML-RPC消息请求,对于基础的远程调用实现来说非常方便上手使用。当然对于系统性能要求较高的还是建议使用thrift协议来进行rpc调用,因为xml-rpc协议使用的http文本序列的方式效率比较低下,不如thrift这红直接使用tcp协议的二进制流的方式。但thrift相对来说实现复杂。

本文来自网易实践者社区,经作者崔晓晴授权发布。