3.8.1 cinder-api服務啟動流程
1)腳本bin.cinder-api(讀取配置文件,獲取Cinder路徑,導入必需的模塊,調用service.WSGIService('osapi_volume'))。
2)cinder.service:WSGIService._init_(使用osapi_volume初始化了一個WSGIService服務,調用wsgi.Server)。
3)cinder.wsgi:Server._init_(wsgi.Server類的對象初始化操作,創建了一個GreenPool協程池,但並不啟動WSGI服務)。
4)腳本bin.cinder-api(調用service.serve(server))。
5)cinder.service:serve(初始化Launcher類,然後調用_launcher.launch_server)。
6)cinder.service:Launcher.launch_server(調用eventlet.spawn,建立一個新的綠色線程用來運行變量func所指定的方法;調用self.run_server)。
7)cinder.service:Launcher.run_server(先調用server.start,再調用server.wait)。
8)啟動cinder-api服務。
·cinder.service:WSGIService.start(調用self.server.start())。
·cinder.wsgi:Server.start(產生了一個協程,在self._start中又調用eventlet.wsgi.server,啟動了osapi_volume所指定的阻塞式eventlet WSGI服務,也就是說,cinder-api服務啟動成功了)。
9)等待cinder-api服務結束。
·cinder.service:WSGIService.wait(等待WSGIService服務結束;調用self.server.wait)。
·cinder.wsgi:Server.wait(調用self._server.wait())。
·cinder.service:wait(調用_launcher.wait())。
·cinder.service:Launcher.wait(等待Cinder-Api協程結束,然後關閉RPC協議框架)。