Glance源碼架構探祕(一)

Glance源碼架構探祕(一)

Glance源碼架構探祕(二)

Glance源碼架構探祕(三)

Glance源碼架構探祕(四)


前言

從本章開始,將會陸續爲大家分享有關OpenStack各組件模塊代碼架構的探祕。首先從OpenStack的鏡像管理模塊Glance開始,原因是Glance只負責鏡像的上傳,下載等管理,功能對比Nova模塊來說相對比較少,便於代碼結構的分析。還是那句話,Stacker們,大家多交流,我看到留言會回覆的~


Glance項目提供虛擬機鏡像的查找,註冊和重現,使用RESTful接口接受虛擬機鏡像管理的查詢請求。

2013-4-15新增

從F版開始使用的API V2,相對於V1版大大簡化了流程,將glance-api與glance-registry合併在了一起。


glance-api V2


然而因爲目前國內大多還停留在E版本的系統上,所以本文還是着重研究下E版本的代碼。目前暫時還不清楚此項更改對應的blue-print。



程輝博客中glance v1版架構圖


在程輝的一篇博客中,有Glance的架構介紹,其中有上面的圖。作者將Glance-API和Glance-Registry解釋爲調用關係是不正確的。這兩個服務是獨立運行的服務,在sbin目錄下,看過glance部署文章的同學知道,glance部署的最後一步就是啓動glance-api和glance-registry這兩個服務。這兩個服務作爲WSGI,會分別響應來自用戶的RESTful請求,而不是圖上所暗示的glance-api響應請求,然後調用glance-registry進行image元數據在數據庫的註冊。(2013-4-15刪除)

E版本代碼中,Glance-api和Glance-Registry兩個服務還沒有進行合併。查看KeyStone的endpoint可知,系統和外界進行交互的接口是綁定了端口號9292的glance-api服務,而綁定端口號爲9191的glance-registry只在系統內部使用。

glance-api作爲glance對外的服務入口,接受客戶端的所有命令,分發並響應,如果命令操作涉及到數據庫的增刪改查等操作,glance會創建一個RegistryClient實例,往下向glance-registry轉發restful命令。

Glance對外服務的入口主要有2個(2013-4-15刪除)

Glance有兩個WSGI服務模塊

1、Glance-API:主要負責接收響應鏡像管理命令的Restful請求,分析消息請求信息並分發其所帶的命令(如新增,刪除,更新等)。(2013/4/15新增)涉及到數據庫的操作會調用registry-clinet生成響應的http命令轉發給Glance-Registry服務。默認綁定端口是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中有

[app:registryapp]
paste.app_factory = glance.registry.api.v1:API.factory
證明這是一個獨立的服務程序


我們以glance-api爲例,分析其服務入口程序

"""
Glance API Server
"""

import gettext
import os
import 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 config
from glance.common import wsgi
from glance.common import exception
from glance.openstack.common import log
import glance.store


def 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組件。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章