— openstack, neutron — 1 min read
Openstack各项目之间通过RESTful API进行通信;而项目内部不同服务进程则需要通过消息总线通信。关于消息总线的实现,包含在Openstack.oslo.messaging库中。
远程过程调用,一个服务进程可以调用其他远程服务进程的方法,有两种方式:
服务可以把事件通知发到消息总线上,该消息总线上所有对此类事件感兴趣的服务进程,都可以获得次事件通知并进行处理。处理结果不会返回事件发送者。
AMQP是一个异步消息传递所使用的开放的应用层协议规范。包括导向、队列、路由、可靠性和安全性。不同的AMQP实现可以进行相互操作。 所有消息都有一个routing key,所有Queue都有一个binding key。生产者将消息发送给Exchange,然后Exchange根据这两个key把消息送到相匹配的Queue中。不同类型的Exchange有不同的匹配算法。
类型 | 说明 |
---|---|
Direct | binding key和routing key必须完全一样,不支持通配符 |
Topic | 同Direct类型,但是支持通配符,"*"匹配单字,“#”匹配零个或多个单字,单字之间由“.”来分割 |
Fanout | 忽略binding key和routing key,广播式路由 |
WSGI 是一个连接服务端和应用端的接口。WSGI把Web组件分为三部分:
An Application must return an iterable object.
environ
:一个dict,包括CGI中定义的环境变量以及7个WSGI所定义的环境变量:wsgi.version,wsgi_input...start_response
: 回调函数,要返回一个write(data)对象,用作兼容现有的特殊框架,一般返回NonePaste Deploy通过api-paste.ini配置
Paste配置文件分为多个section,每个section以type
:name
的格式命名。
(书上P99)
对WSGI的封装,包含:
webob.Request
对WSGI的environ的封装webob.Response
对WSGI响应的封装 webob.exc
对HTTP错误代码的封装Webob提供了webob.dec.wsgify
的decorator,可以快速开发application
Openstack的协程模块
与线程类似,拥有独立的栈和局部变量,但是无法同时执行,(Compare To: Javascript callback)
eventlet.spawn
只是创建一个协程并不立即执行,直到主线程运行到gt.wait()
时才开始进入调度序列。
实现协程需要使用Patch的方式对Python的网络相关的标准库进行改写,这个patch就叫monkey_patch
。
Monkey Patch是大部分使用Eventlet函数库之前需要进行的初始化工作
Openstack 通用库
构建命令行程序 DEMO: https://github.com/openstack/cliff/tree/master/demoapp
解析命令行和配置文件中的配置选项(书上P111)
如果没有指定group,则选项默认放在[DEFAULT]组下
从命令行中设置conf,需要使用使用‘-’连接groupname和optionname
SQLAlchemy数据库模型的抽象
是对Python gettext的封装,主要用于字符串翻译和国际化
Openstack各项目使用RPC和事件通知的统一的接口。其中包括下面4个对象。
传输层,主要实现RPC底层的通信,支持rabbit、qpid、zmq三种协议。可以通过URL来指定不同的transport的实现。
封装了指定某一消息最终目的地的所有信息
即服务端,创建一个Server对象需要指定Transport、Target、endpoints(包含多组可被远程调用的方法,比如某一资源包含CUID四个操作)
即客户端,一个RPC Client可以调用RPC Server上的方法。
Notifier是一个用来发送通知消息的对象。格式如下:
消息监听者,跟Server类似,可以暴露多个endpoint,每个endpoint中也可以包含多种方法,但是它们只是对应者不同的消息优先级。(P118)