openstack oslo.messaging库
openstack oslo.messaging库
根据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:
- [DEFAULT]
 - username=app
 - [rabbit]
 - host = 192.168.1.7
 - port = 5672
 
- server.py: 服务器端程序
 - from oslo_config import cfg
 - import oslo_messaging
 - from oslo_log import log as logging
 - import time
 - CONF = cfg.CONF
 - LOG = logging.getLogger(__name__)
 - logging.register_options(CONF)
 - logging.setup(CONF, "myservice")
 - CONF(default_config_files=['app.conf'])
 - class ServerControlEndpoint(object):
 - target = oslo_messaging.Target(namespace='control',
 - version='2.0')
 - def __init__(self, server):
 - self.server = server
 - def stop(self, ctx):
 - if self.server:
 - self.server.stop()
 - class TestEndpoint(object):
 - def test(self, ctx, arg):
 - print "test"
 - print arg
 - return arg
 - transport = oslo_messaging.get_transport(cfg.CONF)
 - target = oslo_messaging.Target(topic='test123', server='server1')
 - endpoints = [
 - ServerControlEndpoint(None),
 - TestEndpoint(),
 - ]
 - server=oslo_messaging.get_rpc_server(transport,target, endpoints,executor='blocking')
 - try:
 - server.start()
 - while True:
 - time.sleep(1)
 - except KeyboardInterrupt:
 - print("Stopping server")
 - server.stop()
 - 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  | 
 用来序列化/反序列化消息  | 
- client.py:
 - import oslo_messaging as messaging
 - from oslo_context import context
 - from oslo_config import cfg
 - from oslo_log import log as logging
 - CONF = cfg.CONF
 - LOG = logging.getLogger(__name__)
 - logging.register_options(CONF)
 - logging.setup(CONF, "myservice")
 - CONF(default_config_files=['app.conf'])
 - ctxt = {}
 - arg = {'a':'b'}
 - transport = messaging.get_transport(cfg.CONF)
 - target = messaging.Target(topic='test123')
 - client = messaging.RPCClient(transport, target)
 - client.call(ctxt, 'test', arg=arg)
 - cctxt = client.prepare(namespace=’control’,version=’2.0’)
 - cctxt.cast({}, ‘stop’)
 
(1)、远程调用时,需要传入字典对象指明调用上下文、调用方法名字和传给调用方法的参数。
(2)、Target对象的属性在RPCClient对象构造之后,还可以通过prepare()方法修改,可以修改的属性包括exchange,topic,namespace,version,server,fanout和retry。修改后的target属性只在这个prepare()方法返回的对象中有效。
程序运行结果:call同步方式调用
服务器端。 
客户端同步调用返回结果。
openstack oslo.messaging库的更多相关文章
- oslo.messaging
		
oslo.messaging oslo.messaging库为OpenStack各个项目使用RPC和事件通知(Event Notification)提供了一套统一的接口.代码库位于https://gi ...
 - 探索 OpenStack 之(15):oslo.messaging 和 Cinder 中 MessageQueue 消息的发送和接收
		
前言:上一篇文章 只是 RabbitMQ 的科普,本文将仔细分析 Cinder 中 RabbitMQ 的各组件的使用.消息的发送和接收等.由于各流程步骤很多,本文只会使用若干流程图来加以阐述,尽量做到 ...
 - Openstack oslo.config【一】
		
OpenStack的项目貌似越来越多了,在Grizzly版之前,每个项目都得实现一套处理配置文件的代码.在每个项目的源码中基本上都可以找到openstack/common/cfg.py,inipars ...
 - OpenStack配置解析库oslo.config的使用方法
		
OpenStack的oslo项目旨在独立出系统中可重用的基础功能,oslo.config就是其中一个被广泛使用的库,该项工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf ...
 - oslo.messaging 1.8.0 bug fix and blueprint
		
1366597 由于amqp_auto_delete可配置,但是NotifierPublisher使用的是没有在配置中获取而使用的默认的False,即非auo_delete,因而在用户配置了amqp_ ...
 - Troubleshooting OpenStack 瘫痪 - 每天5分钟玩转 OpenStack(160)
		
这是 OpenStack 实施经验分享系列的第 10 篇.是软件就会有 bug,OpenStack 也不例外,只要用它就一定会遇到故障.Troubleshooting(故障排除)是运维 OpenSta ...
 - OpenStack Nova
		
OpenStack Nova 简介 OpenStack 中的 Nova 负责维护和管理云环境的计算资源 Nova 在现有 Linux 服务器上作为一组守护线程来提供服务 Nova 由多个服务器进程组成 ...
 - Openstack 中的消息总线 & AMQP
		
目录 目录 消息总线 消息总线的原理 AMQP 消息总线 Openstack 采用了面向服务的开发模式(有别于面向对象和面向过程),需要我们去考虑各个服务之间和各项目之间是如何传递消息的. Restf ...
 - OpenStack IceHouse版cinder模块新添加功能
		
感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...
 
随机推荐
- Web前端    Web前端和Web后端的区分
			
一.绪论 1. 前台:呈现给用户的视觉和基本的操作. 后台:用户浏览网页时,我们看不见的后台数据跑动.后台包括前端.后端. 前端:对应我们写的html.css.javascript 等网页语言作用在前 ...
 - 通过JavaScript调用SOAP终结点执行实体消息
			
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复148或者20150813可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 利用OData终结点可以方便的对 ...
 - 等价路由在路由器和CE交换机上默认的行为是不同的,路由器总是走第一个下一跳,CE交换机是逐包。
			
结论: 1.在eNSP中实验,路由器和CE交换机对于等价路由的默认转发行为是不同的, 路由器:默认是基于流的转发形态,更准确的来讲,ping两个不同的下一跳,都是走等价路由的第一个路由,不走第二条路由 ...
 - iOS----------使用cocoapods遇到的问题
			
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...
 - 2019Java查漏补缺(三)
			
1.为什么这个public的类的类名必须和文件名相同 是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件 2.java8 的一些新特性: 3: 数据库隔离级别 隔离级别 ...
 - Sublime Text 3 常用插件 —— SFTP
			
在 Win 下常用 Xftp 软件来和远程服务传递文件,但是要是在项目开发的时候频繁的将远程文件拖到本地编辑然后再传回远程服务器,那真是麻烦无比,但是Sublime中SFTP插件,它让这世界美好了许多 ...
 - C# 一般处理程序ashx接收服务端post过来json数据
			
这个和前端js的接收方式有点不一样,前端接收用request.form["xxx"]即可
 - GoldenDict词典的超级实用高级玩法----全文搜索功能
			
快捷键: Ctrl+Shift+F 菜单进入:搜索--全文搜索 模式:正则表达式 比如:我想知道地道的英文表达 请xx天/周/年假 给搜索框写入正则表达式 请(.)(天|周|年)假 就可以了 ...
 - 固态+机械双硬盘分别安装Win10和Ubuntu16.04双系统
			
博主的笔记本是256G固态+1T机械,固态事先已经安装好了Win10系统,想着把机械硬盘分出500G用来安装Ubuntu16.04,剩余的继续用作Win下的资料盘.这里不介绍安装Win10过程,也不记 ...
 - LeetCode算法题-Longest Harmonious Subsequence(Java实现)
			
这是悦乐书的第270次更新,第284篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是594).我们定义一个和谐数组是一个数组,其最大值和最小值之间的差 ...