openstack oslo.messaging库

2017年04月13日 22:13:25 li_101357 阅读数:1383
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li_101357/article/details/70162657

根据OpenStack官网介绍,oslo.messaging库就是把rabbitmq的Python库做了封装,在openstack中调用RPC通信就要调用oslo.messaging库,为RPC和事件通知提供一套统一的接口。

下面介绍oslo.messaging在RPC通信过程中两个重要部分,RPC Client,Server。

Server是RPC服务器提供多个端点,每个包含一组远程调用客户端的方法,创建一个PRC服务器,提供一个传输队列,目标和端点列表。

Client是一个类调用远程服务器上的方法,RPCClient类是负责发送方法调用通过消息传输到远程服务器。

一、oslo.messaging对如下的对象进行统一

1、Transport

Transport(传输层)主要实现RPC底层的通信(比如socket)以及事件循环、多线程等其他功能。可以通过URL来获得指向不同Transport实现的句柄。URL格式:

Transport://user:pass@host1:port[,hostN:portN]/virtual_host

从cfg对象读取transport_url、rpc_backend、control_exchange信息构造Transport对象。用户可以使用oslo.messaging.get_transport函数来获得transport对象实例的句柄。

2、Target

Target封装指定某一个消息最终目的地的所有信息。

Target对象属性

参数 = 默认值

说 明

exchange=None

(字符串类型)交换器,topic所属的范围,默认使用配置文件中的control_exchange选项

topic=None

(字符串类型)一个topic表示服务器暴露的一组接口(可被远程调用的方法)。 允许多个服务器暴露同一组接口,消息会轮询发给多个服务器中的某一个

namespace=None

(字符串类型)表示服务器暴露的某个特定的接口(多个可被远程调用的方法)

version=None

服务器所暴露的接口支持M.N类型的版本号

server=None

(字符串类型)客户端可以指定 此参数要求消息的目的地是某个特定的服务器, 而不是 topic 一组服务器的一台。

fanout=None

(布尔类型)当设置为真时,消息会被广播发送给 同属某个topic的所有服务器,而不是

注意:不同场景下构造Target对象需要不同的参数:

(1)、创建RPC服务器时,需要topic和server参数,exchange参数可选;指定一个endpoint的target时,namespace和version是可选的

(2)、客户端发送消息时,需要topic参数,其他可选

3、Server

一个RPC服务器可以暴露多个endpoint,每个endpoint包含一组方法,这组方法是可以被客户端通过transport对象远程调用的。 创建Server对象时,需要指定Transport、Target和一组endpoint。

4、RPC Client

远程调用RPC Server上的方法。远程调用的时候,需要提供一个字典对象指明调用的上下文,调用方法的名字和传递给调用方法的参数。

调用方式:(1)、通过cast方式 异步远程调用,请求发送之后客户端直接返回。

(2)、call方式 同步远程调用,等待服务器响应返回结果。

程序案例:

app.conf:

  1. [DEFAULT]
  2. username=app
  3.  
  4. [rabbit]
  5. host = 192.168.1.7
  6. port = 5672
  1. server.py: 服务器端程序
  2. from oslo_config import cfg
  3. import oslo_messaging
  4. from oslo_log import log as logging
  5. import time
  6.  
  7. CONF = cfg.CONF
  8. LOG = logging.getLogger(__name__)
  9.  
  10. logging.register_options(CONF)
  11. logging.setup(CONF, "myservice")
  12. CONF(default_config_files=['app.conf'])
  13.  
  14. class ServerControlEndpoint(object):
  15. target = oslo_messaging.Target(namespace='control',
  16. version='2.0')
  17.  
  18. def __init__(self, server):
  19. self.server = server
  20.  
  21. def stop(self, ctx):
  22. if self.server:
  23. self.server.stop()
  24.  
  25. class TestEndpoint(object):
  26. def test(self, ctx, arg):
  27. print "test"
  28. print arg
  29. return arg
  30.  
  31. transport = oslo_messaging.get_transport(cfg.CONF)
  32. target = oslo_messaging.Target(topic='test123', server='server1')
  33. endpoints = [
  34. ServerControlEndpoint(None),
  35. TestEndpoint(),
  36. ]
  37. server=oslo_messaging.get_rpc_server(transport,target, endpoints,executor='blocking')
  38. try:
  39. server.start()
  40. while True:
  41. time.sleep(1)
  42. except KeyboardInterrupt:
  43. print("Stopping server")
  44. server.stop()
  45. server.wait()

(1)、服务器定义两个不同的endpoint:ServerControlEndpoint和TestEndpoint。这两个endpoint中的方法stop和test都可以被客户端远程调用。

(2)、创建rpc server之前,需要先创建transport和target对象,使用get_transport函数获得transport对象的句柄,get_transport函数的参数如下:

参数=默认值

说明

conf

oslo.config配置项对象

url=None

(字符串或oslo.messaging.Transport类型)

transportURL。为空则采用conf配置中的transporturl项所指定的值

namespace=None

(字符串类型)用来标识服务器所暴露的某个特定接口

allowed_remote_exmods=None

aliases=None

(字典类型)transport别名和transport名称之间的对应关系

(3)、Target对象是用来建立RPCserver的,需要指明topic和server参数。用户定义的endpoint对象可以包含一个target属性,来指明这个endpoint所支持的特定的namespace和version.

(4)、get_rpc_server()函数创建server对象,然后调用server对象的start方法开始接受远程调用,get_rpc_server()函数参数如下示:

参数=默认值

说明

transport

(Transport类型)transport对象

target

(target类型)指明监听的exchange、topic和server

endpoints

(列表类型)endpoint对象实例的列表

executor=’blocking’

(字符串类型)指明消息的接收和处理的方式

(1) blocking:用户调用start函数后,在start函数中开始循环处理请求:用户线程阻塞,处理下一个请求。直到用户调用stop函数之后处理循环才会退出。  消息的分发和处理循环都是在start函数的线程中完成

(2) eventlet:会有协程GreenThread来处理消息的接收,然后会有不同的协程来处理不同消息的分发处理。调用start函数的用户线程不会阻塞

Serializer=None

用来序列化/反序列化消息

  1. client.py:
  2. import oslo_messaging as messaging
  3. from oslo_context import context
  4. from oslo_config import cfg
  5. from oslo_log import log as logging
  6.  
  7. CONF = cfg.CONF
  8. LOG = logging.getLogger(__name__)
  9. logging.register_options(CONF)
  10. logging.setup(CONF, "myservice")
  11. CONF(default_config_files=['app.conf'])
  12.  
  13. ctxt = {}
  14. arg = {'a':'b'}
  15.  
  16. transport = messaging.get_transport(cfg.CONF)
  17. target = messaging.Target(topic='test123')
  18. client = messaging.RPCClient(transport, target)
  19. client.call(ctxt, 'test', arg=arg)
  20. cctxt = client.prepare(namespace=’control’,version=’2.0’)
  21. cctxt.cast({}, ‘stop’)

(1)、远程调用时,需要传入字典对象指明调用上下文、调用方法名字和传给调用方法的参数。

(2)、Target对象的属性在RPCClient对象构造之后,还可以通过prepare()方法修改,可以修改的属性包括exchange,topic,namespace,version,server,fanout和retry。修改后的target属性只在这个prepare()方法返回的对象中有效

程序运行结果:call同步方式调用

服务器端。 客户端同步调用返回结果。

openstack oslo.messaging库的更多相关文章

  1. oslo.messaging

    oslo.messaging oslo.messaging库为OpenStack各个项目使用RPC和事件通知(Event Notification)提供了一套统一的接口.代码库位于https://gi ...

  2. 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收

    前言:上一篇文章 只是 RabbitMQ 的科普,本文将仔细分析 Cinder 中 RabbitMQ 的各组件的使用.消息的发送和接收等.由于各流程步骤很多,本文只会使用若干流程图来加以阐述,尽量做到 ...

  3. Openstack oslo.config【一】

    OpenStack的项目貌似越来越多了,在Grizzly版之前,每个项目都得实现一套处理配置文件的代码.在每个项目的源码中基本上都可以找到openstack/common/cfg.py,inipars ...

  4. OpenStack配置解析库oslo.config的使用方法

    OpenStack的oslo项目旨在独立出系统中可重用的基础功能,oslo.config就是其中一个被广泛使用的库,该项工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf ...

  5. oslo.messaging 1.8.0 bug fix and blueprint

    1366597 由于amqp_auto_delete可配置,但是NotifierPublisher使用的是没有在配置中获取而使用的默认的False,即非auo_delete,因而在用户配置了amqp_ ...

  6. Troubleshooting OpenStack 瘫痪 - 每天5分钟玩转 OpenStack(160)

    这是 OpenStack 实施经验分享系列的第 10 篇.是软件就会有 bug,OpenStack 也不例外,只要用它就一定会遇到故障.Troubleshooting(故障排除)是运维 OpenSta ...

  7. OpenStack Nova

    OpenStack Nova 简介 OpenStack 中的 Nova 负责维护和管理云环境的计算资源 Nova 在现有 Linux 服务器上作为一组守护线程来提供服务 Nova 由多个服务器进程组成 ...

  8. Openstack 中的消息总线 & AMQP

    目录 目录 消息总线 消息总线的原理 AMQP 消息总线 Openstack 采用了面向服务的开发模式(有别于面向对象和面向过程),需要我们去考虑各个服务之间和各项目之间是如何传递消息的. Restf ...

  9. OpenStack IceHouse版cinder模块新添加功能

    感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...

随机推荐

  1. WPF:间接支持虚拟化的ListBox

    /// <summary> /// 间接实现了虚拟化的ListBox /// 子项必须实现IVisible接口 /// 你可以在IsVisible发生改变时实现一系列自定义动作 /// 比 ...

  2. 如何为 .NET Core CLI 启用 TAB 自动补全功能

    如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...

  3. Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用 optparse argparse

    Python第十天   print >> f,和fd.write()的区别    stdout的buffer  标准输入 标准输出  从控制台重定向到文件  标准错误   重定向 输出流和 ...

  4. Linux中逻辑卷的快照与还原

    有关逻辑卷的其他操作,请看: Linux中对逻辑卷的建立 Linux中对逻辑卷进行扩容与缩小 Linux中对逻辑卷的移除 LVM还有快照的功能,类似windows的系统还原点.其特点: 1.快照卷的容 ...

  5. iOS UITextField 响应键盘的return 事件

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(, , , )] textField.returnKeyT ...

  6. Chrome浏览器清除缓存

    1.功能列表点击历史记录 可以是按时间清除 自动清除: 使用谷歌的无痕模式可以自动清除缓存

  7. Arch Linux安装Firefox 火狐中文版

    很多人刚安装好系统之后,刚开始内置的浏览器是火狐的英文版,很多时候因为需要账号同步的原因需要国内版本的火狐浏览器,这个时候我们应该怎么操作呢? 其实也非常的简单 首先我们 输入命令 pacman -S ...

  8. 关于SNMP的MIB文件的语法简述

    源地址:https://blog.csdn.net/carechere/article/details/51236184 SNMP协议的MIB文件的常见宏定义的描述: 对MIB文件中一些常见的宏定义的 ...

  9. [RHEL 6]GPT分区--parted

    对于2T以上的硬盘,划分分区表需要GPT分区,RHEL 6中使用parted进行分区 用法:parted [选项]... [设备 [命令 [参数]...]...] 将带有“参数”的命令应用于“设备”. ...

  10. RHEL6 删除软RAID

    停止使用RAID: 1.umount raid组上的硬盘的所用的分区 若使用raid组创建vg,需要删除或去激活VG 2.停止raid服务 mdadm -S /dev/md0 3.清除MBR # md ...