讀古今文學網 > OpenStack系統架構設計實戰 > 2.7 Nova關鍵組件 >

2.7 Nova關鍵組件

2.7.1 API服務(nova-api)

nova-api也稱為API服務器,是用Python實現的一個Web服務器,實現Restful API到內部請求消息的轉換。nova-api支持兩類API,一類是Nova自定義的API,這個API又區分為不同的版本,其中V2是主流支持的接口版本。另一類是兼容EC1-API接口,這個API接口在未來可能被移除。

nova-api本身並不複雜,先看一下啟動Nova的代碼:

[root@nova-controller ~]# cat /usr/bin/nova-api#!/usr/bin/python# PBR Generated from u'console_scripts'import sysfrom nova.cmd.api import mainif __name__ == "__main__": sys.exit(main)

找到nova.cmd.api的main()函數。

def main: config.parse_args(sys.argv) logging.setup("nova") utils.monkey_patch gmr.TextGuruMeditation.setup_autorun(version) launcher = service.process_launcher for api in CONF.enabled_apis: should_use_ssl = api in CONF.enabled_ssl_apis if api == 'ec2': server = service.WSGIService(api, use_ssl=should_use_ssl, max_url_len=16384) else:server = service.WSGIService(api, use_ssl=should_use_ssl) launcher.launch_service(server, workers=server.workers or 1) launcher.wait

從代碼大概能夠看出,首先是讀取配置文件,讀取配置參數,並且根據配置完成初始化消息隊列,用以後續與別的組件進行內部消息交互。同時根據配置文件中的配置項啟動WSGI服務器,配置文件中的每一個API對應一個服務器。另外根據系統的CPU核心數n,每個WSGI服務器都會有n個worker協程去處理請求。

通常,EC2的API對應TCP端口8773,Nova自定義的API對應端口8774。WSGI服務器運行後,開始循環偵聽TCP端口,接收客戶端發起的HTTP請求,並將請求參數驗證解釋後轉換為系統內部消息,然後通過RPC將內部消息傳遞到後端組件執行。在技術實現上,nova-api利用WSGI框架,實現URL到action的映射。action是對應模塊裡面的具體實現函數。