您的位置:首页 > 运维架构

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

2012-09-05 09:41 429 查看
在分析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处理函数集合中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: