文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何实现一个XML-RPC server/client

2023-06-02 19:16

关注

本篇内容介绍了“如何实现一个XML-RPC server/client”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

从大数据部署系统 Minos说起

Minos是小米2013年开源的针对海量服务节点无法高效操作及统一配置管理的痛点,全新探索并研发的一套大型分布式部署及监控的系统。该系统基于supervisor XML-RPC实现分布式计算,支持跨地域、多节点部署服务。

如何实现一个XML-RPC server/client

上图为Minos架构图,客户端对task节点的操作通过supervisor的XML-RPC完成。接下来我们谈谈什么是XML-RPC,它是如何工作的。

2  什么是XML-RPC?

XML-RPC是一个远程过程调用(远端程序呼叫)(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。

[1]可以用Perl, Java, Python, C, C++, PHP和许多编程语言实现。实现适用于Unix,Windows和Macintosh。

XML-RPC是受两个早期协议的启发。一个是由Dave Winer设计的匿名RPC协议。(这就是为什么XML-RPC服务器通常安装在/RPC2下。)另一个更重要的是SOAP协议的初稿。Dave Winer提供了丰富的XML-RPC历史渊源,对XML-RPC和SOAP之间的关系感兴趣的可自行查阅资料。

3   XML-RPC如何工作的?

一个简单的示例。

服务端代码示例:(Python2.7 运行环境)

#-*- coding:utf-8 -*-from SimpleXMLRPCServer import SimpleXMLRPCServerfrom SimpleXMLRPCServer import SimpleXMLRPCRequestHandler# 指定路径class RequestHandler(SimpleXMLRPCRequestHandler):    rpc_paths = ('/RPC2',)# 构建serverserver = SimpleXMLRPCServer(("localhost", 8000),                            requestHandler=RequestHandler)server.register_introspection_functions()# 注册pow函数# pow.__name__为 pow函数的名称server.register_function(pow)# 注册自定义函数def adder_function(x,y):    return x + yserver.register_function(adder_function, 'add')# 注册实例;# 实例的方法均发布为 XML-RPC的方法class MyFuncs:    def div(self, x, y):        return x // yserver.register_instance(MyFuncs())# 启动serverserver.serve_forever()

接下来客户端将调用服务端的方法:

#-*- coding:utf-8 -*-import xmlrpclibs = xmlrpclib.ServerProxy('http://localhost:8000')print s.pow(2,3)  # Returns 2**3 = 8print s.add(2,3)  # Returns 5print s.div(5,2)  # Returns 5//2 = 2# 打印服务端所有方法print s.system.listMethods()

由此在部署系统中,构建supervisor XML-RPC的服务端,封装对节点操作的方法,由客户端远程调用此方法,实现分布式部署。

不过,SimpleXMLRPCServer是一个单线程的服务器。这意味着,服务端同时收到多个客户端发送的多个请求,必须等待第一个请求完成以后才能继续。有个最直接的方法可以解决这个问题:

from SimpleXMLRPCServer import SimpleXMLRPCServerfrom SocketServer import ThreadingMixIn# 新增构建ThreadXMLRPCServer类class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):    pass# 重新构建serverserver = ThreadXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler,allow_none=True)#Forking and threading versions of each type of server can be created using the ForkingMixIn and ThreadingMixIn mix-in classes. For instance, a threading UDP server class is created as follows:[2]class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass

阅读ThreadingMixIn的源码发现,ThreadingMixIn重写了server类中调用的process_request方法。因此实现了server端多线程处理。

4   链式使用XML-RPC时遇到的问题及解决方法

在我们实际应用中,当我们构建多个XML-RPC server的client,进行链式调用时,经常遇到httplib.CannotSendRequest的报警。

调用过程:

client -- calls -- SimpleXMLRPCServer’s functions -- calls --SimpleXMLRPCServer's functions -- do finish task

记过排查CannotSendRequest发生在当一个httplib.HTTPConnection被又一次新的“request”操作中断。 所以,每个httplib.HTTPConnection.request必须以.getresponse()调用配对。 如果该配对被另一个请求操作中断,第二请求将产生CannotSendRequest错误。 所以,类似如下请求,将会产生错误:

connection = httplib.HTTPConnection(...)connection.request(...)connection.request(...)

问题分析:

两次调用都是serverproxy来构建的。只有在同时多次请求的时候出现了这个问题,应该是存在资源竞争条件。serverproxy在中间层被共享。

解决思路:

是让每个线程创建自己的serverproxy。

解决方案:

在调用第一个SimpleXMLRPCServer的方法时构建下一次调用的链接。确保每个线程维护自己的serverproxy。

“如何实现一个XML-RPC server/client”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯