[openstack][keystone]架构分析
首先介绍一下keystone的整体代码框架,就是:
Paste + PasteDeploy + Routes + WebOb
文章整体以ubuntu14.04操作系统为平台,如果为CentOS或其他系统相关文件目录可能会有区别,请注意。
1、WSGI入口
Keystone的入口其实就是WSGI的入口,WSGI可以通过两种方式进行部署。Apache和evenlet,自然keystone也同时支持这两种方式。
对于Apache部署而言,他的文件保存在/etc/apache2/sites-available/目录下。其中,wsgi-keystone.conf是一个mod_wsgi的示例配置文件。
keystone.py则是WSGI应用程序的入口文件。文件位置为:httpd/keystone.py也就是我们要找的入口文件之一。这个文件比较简单,从中可以看到,关键的一行代码就是:
application = wsgi_server.initialize_application(name)
从中看到他创建了WSGI入口所需要使用的application对象。
而对于eventlet而言,他的部署主要是通过keystone-all命令。从setup.cfg中看到该命令的入口是:
keystone-all = keystone.cmd.all:main
找到keystone/cmd/all.py中的main函数,其中的内容证明了我们上面所述:
def main():
eventlet_server.run(possible_topdir)
上面的main()函数主要作用是根据配置文件possible_topdir去启动一个eventlet_server。对于eventlet先介绍到这里。
下面的重点以httpd/keystone.py文件作为入口来看。
2、Paste和PasteDeploy
上述讲到keystone.py主要调用了initialize_application(name)函数来载入整个WSGI应用。这里用到了Paste和PasteDeploy库。
到keystone/server/wsgi.py中查看具体的函数。
其中config.find_paste_config()用来查找PasteDeploy需要用到的WSGI配置文件,这个文件在源码中是etc/keystone-paste.ini文件。keystone_service.loadapp()函数内部则调用了paste.deploy.loadapp()函数来加载WSGI应用,如何加载则使用了刚才提到的keystone-paste.ini文件,这个文件也是看懂整个程序的关键。
3、Paste.ini
对于整个openstack而言经常会看到ini文件,下面来具体解析一下这个文件。
他由多个section组成,每个section的格式为[type:name]。
不同type的section的不同作用也是理解这个文件的关键,主要是有这么几个type:
Composite:用于将http请求分发给制定的app。这个的关键字use = egg:Paste#urlmap标示到Paste模块的egg-info中寻找urlmap对应的函数。其中不同URL path前缀,把请求路由给不同的app。比如/v2.0=public_api,标示以/v2.0开头的url会路由给public_api处理。路由的对象即为其他section的名字,类型必须为app或者pipline。
Pipline:将一系列filter和app串联起来。其中的关键字为其他section的名字。其中有一个规则为最后一项必须是一个app,而其他项都为filter。
Filter:实现一个过滤器中间件,过滤请求和响应。其中的关键字表明调用哪个函数来获取这个filter中间件。比如:
[filter:debug]
paste.filter_factory = keystone.common.wsgi:Debug.factory
调用的即为keystone/common/wsgi.py中的classDebug(Middleware):。
从中可以看到这个类是以WSGI中间件的方式实现。
App:表示具体的一个app,为一个标准的WSGI application。其中的关键字也为调用哪个函数来获取这个app。
整一套keystone有两个app,admin和main。在实际部署过程中,httpd/keystone.py会重命名为admin.py或main.py。其中admin来监听35357端口,main来监听5000端口。
所以总结来说paste.ini中这一大堆配置的作用就是把我们用Python写的WSGI application和middleware串起来,规定好HTTP请求处理的路径。
在上述的application =wsgi_server.initialize_application(name)存在一个name变量,这个变量来确定入口,在Keystone的paste.ini中,请求必须先由[composite:main]或者[composite:admin]处理,所以在keystone项目中,name的值必须是main或者admin。
举一个例子: POST http://localhost:35357/v3/auth/tokens
发到keystone获取一个token时是如何操作的?大致流程就是解析这个URL:
(1) hostname:35357 这一部分是由Web服务器处理的,比如Apache。然后,请求会被转到WSGI的入口,也就是httpd/keystone.py中的application对象来处理。
(2) application对象是根据paste.ini中的配置来处理的。这里会先由[composite:admin]来处理(一般是admin监听35357端口,main监听5000端口)。
(3) [composite:admin]发现请求的path是/v3开头的,于是就把请求转发给[pipeline:api_v3]去处理,转发之前,会把/v3这个部分去掉。
(4) [pipeline:api_v3]收到请求,path是/auth/tokens,然后开始调用各个filter来处理请求。最后会把请求交给[app:service_v3]进行处理。
(5) [app:service_v3]收到请求,path是/auth/tokens,http请求的方法为POST然后交给最终的WSGI app去处理。
4、中间件(Middleware)
Middleware是WSGI架构中重要的组成部分。同时具备Server和application的角色。
从代码上来讲,上述的中间件实际是调用Middleware作为基类的。这边主要是一个__call__()方法。
@webob.dec.wsgify()
def __call__(self, request):
try:
response =self.process_request(request)
if response:
return response
response =request.get_response(self.application)
return self.process_response(request,response)
except exceptin.Error as e:
从代码中可以看到,他的实现主要是接受一个request对象,然后返回一个response对象。然后使用WebOB模块的装饰器webob.dec.wsgify()将它变成标准的WSGI application接口。这里的request和response对象分别是webob.Request和webob.Response。
5、Routes
上述的URL还剩下/auth/tokens来实现URL路由。这边就要使用Routes模块。
Routes模块是用Python实现的类似Rails的URL路由系统,它的主要功能就是把path映射到对应的动作。
Routes模块的一般用法是创建一个Mapper对象,然后调用该对象的connect()方法把path和method映射到一个controller的某个action上,这里controller是一个自定义的类实例,action是表示controller对象的方法的字符串。一般调用的时候还会指定映射哪些方法,比如GET或者POST之类的。
总结一下:整个keystone的代码流程其实就是解析整个URL的过程。通过ini文件进行解析,根据不同的version找到不同的factory,路径为keystone/service.py。然后找到具体的执行内容。整个keystone根据文件名来进行区分,比较方便查找。找到之后根据各个controller.py
core.pyrouters.py三个文件来进行具体的处理。其中routers.py实现URL路由,把URL和controller.py中的action对应起来。Controllers.py中的action调用core.py中的底层接口实现RESTfulAPI承诺的功能。Core.py中定义了Manager类和Driver类。其中Manager负责基于不同的Backend Driver对请求进一步处理。
[openstack][keystone]架构分析相关推荐
- OpenStack Keystone架构
一. Keystone简介 1. OpenStack Keystone简介 2. Keystone安装与部署 2.1 包安装Keystone 2.2 源码安装源码安装 3 配置运行Keystone 3 ...
- OpenStack Keystone架构一:Keystone基础
一 什么是keystone keystone是OpenStack的身份服务,暂且可以理解为一个'与权限有关'的组件. 二 为何要有keystone Keystone项目的主要目的是为访问opensta ...
- openstack Cinder 架构分析、高可用部署与核心功能解析
目录 文章目录 目录 Cinder Cinder 的软件架构 cinder-api cinder-scheduler cinder-volume Driver 框架 Plugin 框架 cinder- ...
- OpenStack高可用核心架构分析
摘要:对任何一个分布式系统,高可用HA都是最核心的设计目标之一,而OpenStack这样一个复杂系统,高可用更是涉及到多个层面,本文重点解析了OpenStack各层次的HA设计. [编者按]本文从Op ...
- OpenStack Designate系统架构分析
前言 OpenStack提供了云计算数据中心所必不可少的用户认证和授权.计算.存储.网络等功能,网上已经有不少的文章介绍这些功能的配置.架构分析以及代码详解.但是,针对OpenStack Design ...
- OpenStack架构分析与实践
小编分享 OpenStack架构分析与实践 OpenStack以每年两个版本的速度不断迅速演进,所以对于OpenStack的架构而言,也是不断向前发展的.回顾一下E版本的OpenStack,它只有5个 ...
- OpenStack概念架构简述
什么是OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云 ...
- Openstack基础架构和各组件的关系
Openstack基础架构和各组件的关系 原创SL_World 最后发布于2017-12-12 15:05:04 阅读数 15817 收藏 展开 Openstack简介 OpenSt ...
- openstack keystone 用户管理
openstack的keystone模块有用户管理和服务管理这两大块内容.这篇文章,先分析下用户管理. 一.概念理解 在讲用户管理,一定要先理解这三个概念: 用户(user):现实生活中的你.我,他. ...
最新文章
- Ubuntu配置上位机Blackfin开发环境手记
- oracle 12c undo,Oracle 12C新特性-临时UNDO段(Temporary Undo Segments) | 信春哥,系统稳,闭眼上线不回滚!...
- Linux记录-mysql参数优化
- 不解析,使用解析对象
- java.util.timertask_java.util.TimerTask翻译
- 定位插件_谷歌官方发布了一款全新超实用Chrome插件,支持国内使用!
- java 实体字段变更记录_java – Hibernate:检查哪个实体的字段被修改
- jquery中的class函数addClass,removeClass,toggle,hasClass
- 怎么将后缀为.opt,.frm,.myd,.myi文件还原或者是导入mySQL中
- int 占一个机器字长
- 光纤通道FC存储交换机的常见问题详解
- Linux系统时钟同步
- 操作系统形式化验证实践教程(2) - HOL列表与集合
- 非线性方程求根方法——二分法
- linux关机suspending,(转)Linux 休眠原理与实现
- 【原创】赋值法写基础解系中解向量
- 创业公司路演PPT模板
- Android 6.0 Marshmallow
- Python修改图片像素颜色值
- 重新开博,短期目标,工作计划