在分析opennebula源码时,发现opennebula利用XML-RPC机制完成client端与server端的交互,由于对XML-RPC机制不太熟悉,读opennebula代码的时候心里总觉得有个疙瘩,每次看到相关的代码都稀里糊涂的,非常不爽,今天花了半天的时间对XML-RPC机制做了个简单的分析,与大家分享。
1.XML-RPC体系结构
server端主要有三部分构成:
(1)主循环线程
(2)XML-RPC
server,即xml-rpc stubs
(3)RPC处理函数集合
XML-RPC的执行过程可以概括为:
(1)构造RPC请求的参数列表,类似于函数的参数(java版)
-
java.util.Vectorparams=newVector();
-
params.add(newString(“Helloserver.”));
(2)初始化一个RPC,主要包括初始化RPC的名称以及处理RPC请求的服务器的URL(包括端口)
-
XmlRpcClient client = null;
-
client = new XmlRpcClient(“http://localhost:2633/RPC2”);
(3)client端执行RPC
-
client.call(DEPLOY, id, hostId); //opennebula中的deloy操作
(4)server处理RPC,执行对应的RPC
handler,处理完成后调用回调函数,用来完成返回值的组织
(5)client端处理RPC的返回值,完成返回值的解释。
2.XML-RPC类型
(1)4bytes整型
(2)布尔型
(3)字符串型(string)
(4)时间戳
(5)以上类型的数组
(6)以上类型的结构体
3. 同步RPC
vs.异步RPC
(1)client发起rpc请求执行server上的RPC的时候会阻塞,直到server完成RPC请求的处理然后返回,被称为同步RPC。
(2)client发起请求后,为该请求产生独立的线程,请求立即返回,被称为异步RPC
XML-RPC的返回值为通用的数据类型-xml_rpc_c::value,client端必须明确知道所需的类型,将通用类型的返回值通过强制类型转换为所需的类型。
对于异步类型的RPC,client端必须定义一些回调函数(call-back
functions)用来报告RPC返回值的正确与否,如RPC处理成功回调函数,RPC处理失败回调函数等,当RPC请求被server处理处理完成,将结果返回给client端之前,会自动调用回调函数,在回调函数中组织返回给client端的返回值。
4.server端初始化及执行步骤
(1)定义RPC处理函数集合
C++: Subclass xmlrpc_c::method//每一个类代表一个RPC处理函数
Java: Create a new public class
(2)在server端创建监听XML-RPC的socket,并指定监听端口,具体参见RequestManager::start()中的setup_socket()函数
(3)在server端注册RPC处理函数,具体参见:RequestManager::register_xml_methods()
(4)启动server,通常为server创建独立的线程,具体参见:
-
pthread_create(&rm_xml_server_thread,&pattr,rm_xml_server_loop,(void *)this);
-
//Start the server
-
rm->AbyssServer = new xmlrpc_c::serverAbyss(xmlrpc_c::serverAbyss::constrOpt()
-
.registryP(&rm->RequestManagerRegistry)
-
.logFileName(rm->xml_log_file)
-
.socketFd(rm->socket_fd));
-
-
rm->AbyssServer->run();
5. RPC处理函数的注册
RPC处理函数的注册是server端最重要的步骤,要完成一个RPC处理函数的注册,概括起来分为以下几步(以deploy虚拟机的RPC处理函数为例):
(1)xmlrpc_c::methodPtr
vm_deploy(new VirtualMachineDeploy());//定义VirtualMachineDeploy类,实现RPC处理函数execute()
(2)RequestManagerRegistry.addMethod("one.vm.deploy",
vm_deploy);//注册deploy对应的RPC处理函数
通过类VirtualMachineDeploy来完成处理Deploy
RPC请求所需的操作,然后通过定义vm_deploy函数,其参数为该类的实例,然后通过addMethod将vm_deploy函数注册到server中的RPC处理函数集合中。
分享到:
相关推荐
opennebula5.10版本的rpm包,适用于centos7系统,将安装包下载至本地可以更快速的安装,官网的源比较慢。
opennebula-sunstone-shib Sunstone 4.10 的 Shibboleth 插件 安装 下载 install.sh 脚本和补丁文件 (plugin.patch)。 给脚本添加执行权限:chmod +x install.sh 查看 /etc/one/sunstone-server.conf 文件中的...
OpenNebula-Mobile-Manager OpenNebula Mobile Manager 是一个开源的安卓应用程序,用于管理 OpenNebula 虚拟机。
OpenNebula 闩锁插件 描述 这个附加组件为 OpenNebula 用户提供了使用来获得额外安全层的可能性。... $ git clone https://github.com/carlosms/opennebula-latch-addon.git 运行安装脚本 执行install.sh脚本。
OpenNebual源码,方便阅读,了解其架构与实现细节
opennebula-3.8.3 source code
OpenNebula架构及应用案例分析OpenNebula架构及应用案例分析
OpenNebula的发展状况,功能特性,发展趋势介绍;OpenNebula的架构分析:调度器,镜像管理,存储,底层驱动等,OpenNebula主要组件介绍和分析;应用案例分析结合实际云计算产品,介绍OpenNebula的应用案例。
开源云opennebula中文安装手册
OpenNebula入门.pdf
剧本one -dnsmasq.py-dsnmasq自动配置hook_poweroff.rb-自动以OpenNebula未启动的POWEROFF状态恢复VMS(例如,在主机重启或VM中关闭时)Cron.d cron脚本的示例配置hook_poweroff.rb 请oned.conf配置以下VM_HOOK: VM...
one, OpenNebula云管理平台 OpenNebula描述OpenNebula是一个开源项目,提供一个简单而灵活的解决方案来构建和管理企业云和虚拟化数据中心。完整的文档:https://docs.opennebula.org如何贡献:https://openneb
盐堆-星云配方 SaltStack Formula建立和配置云管理平台OpenNebula指示请参考以了解如何使用此公式,如何构建该公式以及如何添加更改。 注意:此公式可能使用formhelper模块,这是一个非常有用的Salt执行模块,尚无法...
OpenNebula架构及案例分析.pdf
Equallogic PS 系列 SAN 的 iSCSI 存储驱动程序为 OpenNebula 提供了使用 Equallogic 卷作为 VM 映像的块设备所需的支持。 所有 SAN 池映像管理都是在 Equallogic eqlscript 实用程序的帮助下从 OpenNebula 前端完成...
如果您对 OpenNebula python 绑定感兴趣,请参阅OCA - OpenNebula Cloud Api 版本: 3.0.0-a1关于XMLRPC OpenNebula Cloud API 的绑定文档参见和 所有分配函数都是作为静态方法实现的。例子分配新主机: client = ...
s 领导者: 蒂诺·巴斯克斯(Tino Vazquez)( ) Jean-PhilippeFourès( ) 皮埃尔·拉菲耶夫(PierreLafièvre)( ) 爱德华·胡尔( ) 本杰明·古斯汀(Benjamin Gustin)( )兼容性利用 在OpenNebula 5.12版...
Whmcs opennebula module