当前位置:编程学习 > XML/UML >>

opennebula源码分析 -- XML-RPC 原理分析

在分析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.Vector params = new Vector();
params.add(new String(“Hello server.”));
(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处理函数集合中。

补充:Web开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,