Glance源码架构探秘(一)
前言
从本章开始,将会陆续为大家分享有关OpenStack各组件模块代码架构的探秘。首先从OpenStack的镜像管理模块Glance开始,原因是Glance只负责镜像的上传,下载等管理,功能对比Nova模块来说相对比较少,便于代码结构的分析。还是那句话,Stacker们,大家多交流,我看到留言会回复的~
Glance项目提供虚拟机镜像的查找,注册和重现,使用RESTful接口接受虚拟机镜像管理的查询请求。
程辉博客中glance架构图
在程辉的一篇博客中,有Glance的架构介绍,其中有上面的图。作者将Glance-API和Glance-Registry解释为调用关系是不正确的。这两个服务是独立运行的服务,在sbin目录下,看过glance部署文章的同学知道,glance部署的最后一步就是启动glance-api和glance-registry这两个服务。这两个服务作为WSGI,会分别响应来自用户的RESTful请求,而不是图上所暗示的glance-api响应请求,然后调用glance-registry进行image元数据在数据库的注册。
Glance对外服务的入口主要有2个
1、Glance-API:主要负责接收响应镜像管理命令的Restful请求,分析消息请求信息并分发其所带的命令(如新增,删除,更新等)。默认绑定端口是9292。
2、Glance-Registry:主要负责接收响应镜像元数据命令的Restful请求。分析消息请求信息并分发其所带的命令(如获取元数据,更新元数据等)。默认绑定的端口是9191。
在/etc/glance目录下有两个文件glance-api-paste.ini和glance-registry-paste.ini,两个入口服务启动后,会用配置文件分析模块读取这两个文件,执行其文件中标注的需要执行的WSGIapp和middleware。简述paste文件中的概念:
app:实际处理REST API请求的python类。
filter:一种装饰器,为app提供一层封装,在app处理请求之前会先调用filter的对象。
pipeline:所对应的对象是对filter和app的的封装,他将多个filter和某个app绑在一起,在app处理请求之前要先通过pipline指定的在app之前的filter的处理。
在glance-registry中有
"""Glance API Server"""import gettextimport osimport sys# If ../glance/__init__.py exists, add ../ to Python search path, so that# it will override what happens to be installed in /usr/(local/)lib/python...possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir))if os.path.exists(os.path.join(possible_topdir, 'glance', '__init__.py')): sys.path.insert(0, possible_topdir)gettext.install('glance', unicode=1)from glance.common import configfrom glance.common import wsgifrom glance.common import exceptionfrom glance.openstack.common import logimport glance.storedef fail(returncode, e): sys.stderr.write("ERROR: %s\n" % e) sys.exit(returncode)if __name__ == '__main__': try: config.parse_args() log.setup('glance') glance.store.create_stores() glance.store.verify_default_store() server = wsgi.Server() server.start(config.load_paste_app(), default_port=9292) server.wait() except exception.WorkerCreationFailure, e: fail(2, e) except RuntimeError, e: fail(1, e)首先程序会调用glance.store.create_stores,注册与后端存储(swift、s3、filesystem等)相关的控制模块,并校验默认存储方式。
紧接着启动一个Http Server,openstack的WSGI SERVER用到了eventlet这个绿色线程的组件,这个我们后面一章会介绍到。
通过config.load_paste_app()方法,会从上面提到的glance-api-paste.ini配置文件中读取要启动的WSGI app,并在server中启动,并让server线程等待接收http rest查询响应。
下一章将为大家分析openstack所有服务共同用到的WSGI Server组件eventlet和Restful查询请求的分发器Routes组件。