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. Parcelable encountered IOException writing serializable object

    异常: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 这是在in ...

  2. ASP.NET C# 连接 Oracle数据库增删改查,事务

    一.知识介绍 ①ASP.NET 使用的是MVC模式,开发工具Visual studio ,语言C# ②Oracle是比较重型的数据库,这里主要介绍连接数据库,对数据进行具体的使用 ③Visual St ...

  3. 算法:数组中和为s的两个数字

    @问题 :题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述:对应每个测试案例,输出两个数,小的先输出.@思路: 两个 ...

  4. Hive之SerDe&Beeline

    一.SerDe SerDe:Serializer and Deserializer 序列化及反序列化,构建在数据存储和执行引擎之间,对两者实现解耦. Hive通过ROW FORMAT DELIMITE ...

  5. Linux命令学习总结:ls

    命令简介: ls命令用来列出目标目录(缺省的话为当前目录)中所有的子目录和文件.指令英文原义:list 指令所在路径:/bin/ls 执行权限:All User 命令语法: ls [OPTION].. ...

  6. iOS pthread

    pthread 是属于 POSIX 多线程开发框架 创建线程的方法:pthread_create   参数含义: 1.指向线程代号的指针 2.线程的属性 3.指向函数的指针 4.传递给该函数的参数 返 ...

  7. spring boot 中使用 jpa以及jpa介绍

    1.什么是jpa呢?JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.12.jpa具有什么 ...

  8. java类加载及类初始化

    1.前言 java是跨平台语言,主要是因为它的java虚拟机的存在,java有事编译语言,所以需要将编写的java文件编译成jvm可运用的class字节码文件.在java中一切皆对象.对于Java虚拟 ...

  9. Python爬虫【实战篇】百度翻译

    先看代码 import requests headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS ...

  10. spring boot +mybatis(通过properties配置) 集成

    注:日常学习记录贴,下面描述的有误解的话请指出,大家一同学习. 因为我公司现在用的是postgresql数据库,所以我也用postgresql进行测试 一.前言 1.Spring boot 会默认读取 ...