OpenStack的oslo_messaging组件使用

首先给出OpenStack的RPC通信的代码调用架构

OpenStack消息通信架构图
OpenStack层封装call和cast接口用于远程调用RPC的server上的方法,这些方法都是构造RPC的server的endpoints内的方法。远程调用时,需要提供一个字典对象来指明调用的上下文,调用方法的名字和传递给调用方法的参数(用字典表示)。如:

cctxt =self.client.prepare(vesion=’2.0’)

cctxt.cast(context,‘build_instances’, **kw)

通过cast方式的远程调用,请求发送后就直接返回了(异步);通过call方式远程调用,需要等响应从服务器返回(同步)。

下面我们介绍RPC-server和PRC-client的创建,以及对cast和call的远程调用。

RPC-server.py
fromoslo_config import cfg

importoslo_messaging

importtime

classServerControlEndpoint(object):

 

    target =oslo_messaging.Target(namespace='control',

                                  version='2.0')

    def __init__(self, server):

        self.server = server

    def stop(self, ctx):

        print------ServerControlEndpoint. stop --------if self.server:

            self.server.stop()

 

classTestEndpoint(object):

    def test(self, ctx, arg):

        print------ TestEndpoint.test --------return arg

 

transport= oslo_messaging.get_transport(cfg.CONF)

#从cfg对象中,读取transport_url,rpc_backend和control_exchange信息构

#造Transport对象,其中rpc_backend和control_exchange的默认值分别为:

#’rabbit’和’openstack’。

target= oslo_messaging.Target(topic='test', server='server1')

#在构造RPC-server的target时,需要topic和server参数,exchange参数可

#选。

endpoints= [

    ServerControlEndpoint(None),

    TestEndpoint(),

]

#一个RPC-server可以暴露多个endpoint,每个endpoint包含一组方法,这组

#方法可以被RPC-client通过某种Transport对象远程调用。

server= oslo_messaging.get_rpc_server(transport, target, endpoints,

                                      executor='blocking')

#构造RPC-server对象,其中executor有两种方式:blocking和eventlet。

#blocking:用户调用start函数后,在start函数中开始请求处理循环,用户线程

#阻塞,处理下一个请求。直到用户调用了stop函数后,这个处理循环才退出。

#消息的接受和分发处理都在调用start函数的线程中完成的。

#eventlet:在这种方式中,会有一个协程GreenThread来处理消息的接收,然后

#有其他不同二屌GreenThread来处理不同消息的分发处理。调用start的用户

#线程不会被阻塞。

#在这里我们使用blocking方式。
try:

    server.start()

    while True:

        time.sleep(1)

exceptKeyboardInterrupt:

   print("Stopping server")

 

server.stop()

server.wait()

RPC-client.py
fromoslo_config import cfg

importoslo_messaging as messaging

 

transport= messaging.get_transport(cfg.CONF)

target= messaging.Target(topic='test')

#在构造RPC-client的target时,需要topic参数,其他可选。

client= messaging.RPCClient(transport, target)

ret= client.call(ctxt = {},

                  method = 'test',

                  arg = 'myarg')

#远程调用时,需要提供一个字典对象来指明调用的上下文,调用方法的名字和传

#递给调用方法的参数(用字典表示)。

cctxt= client.prepare(namespace='control', version='2.0')

#prepare函数用于修改RPC-client对象的Target对象的属性。

cctxt.cast({},'stop')

由于这里Transport采用rabbit的方式,所以可使用rabbitmqctl命令查询相关信息。此时执行oslo_server.py的进程处于阻塞状态等待消息的到来。

总结:今天主要介绍了RPC-server和RPC-client的构建,其中涉及call和cast接口的使用。OpenStack正是主要通过这两个接口进行远程调用RPC-server上的方法的。后面几篇文章我们将结合OpenStack源码具体分析RPC-server和RPC-client的使用

原文链接:https://blog.csdn.net/gj19890923/article/details/50278669

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值