|
Nova是OpenStack中最核心的组件,可以说OpenStack中的其它组件都是为Nova服务的。所以Nova也是OpenStack最复杂的组件。Nova服务由多个子服务组成,这些子服务通过RPC实现通信,而其它组件(如glance等)是通过Nova对外提供的API,实际上就是RESTful API,实现与Nova的通信。所以可以看到,前面提到的OpenStack应用的两种通信方式(RPC、RESTful API),Nova中都用到了。
Nova中各个子服务如下:
Nova API:这是一个基于HTTP的RESTful API服务,用于接收和处理外部HTTP请求。
Nova Compute:这是Nova子服务中最核心的服务,它实现了虚拟机的管理功能。包括虚拟机的创建、启动、暂停、关闭和删除等。
Nova Scheduler:这是Nova子服务的“大脑”,负责调度子服务。当向Nova服务发起创建虚拟机请求时,Nova Scheduler子服务决定虚拟机创建在哪个计算节点上。
————————以上三个子服务为Nova中必须的————————
Nova Cell:这个子服务是为了方便实现横向扩展和大规模部署。
Nova Conductor:这是OpenStack G版本新增的子服务,它其实是一个RPC服务,主要是提供数据库的查询功能。在之前的版本中,都是在Nova Compute中定义许多数据库的查询方法,这种方式存在一些安全方面的隐患,因为Nova Compute需要部署在每个计算节点上,一旦有一个计算节点受到攻击,就会威胁到数据库。
要实现基本的虚拟机管理功能,需要在所有计算节点上启动Nova Compute服务,在控制节点上启动Nova API、Nova Scheduler、Nova Conductor服务。
OpenStack的每个组件都提供了一个API服务,用于接收和处理HTTP请求。与其它组件的API服务一样,Nova API服务是一个RESTful API服务。这篇文章主要介绍Nova API服务。
Nova API服务主要的功能都在osapi_compute_app_v2应用程序中实现
[app:osapi_compute_app_v2]
paste.app_factory = nova.api.openstack.compute:APIRouter.factory
osapi_compute_app_v2应用程序对应的工厂方法为nova.api.openstack.compute包中的APIRouter类的factory方法。该类定义在nova/nova/api/openstack/compute/__init__.py中,先来看下这个类。这个类继承自nova.api.openstack.APIRouter,这个类定义在nova/nova/api/openstack/__init__.py中,上述的factory方法也是在这个基类中定义的,该方法返回一个APIRouter类的对象。
class APIRouter(nova.api.openstack.APIRouter):
"""
Routes requests on the OpenStack API to the appropriate controller
and method.
"""
ExtensionManager = extensions.ExtensionManager
def _setup_routes(self, mapper, ext_mgr):
...
#创建server资源的resource对象
self.resources['servers'] = servers.create_resource(ext_mgr)
#添加server资源的url映射
mapper.resource("server", "servers",
controller=self.resources['servers'],
collection={'detail': 'GET'},
member={'action':'POST'}
在_setup_routes方法中定义了许多Nova资源的URL映射。在Nova代码中,server资源其实就是虚拟机资源。从上面代码可以看到,_setup_routes方法首先调用了servers包的create_resource方法,该方法会返回一个Resource对象,关于这个对象我后面会分析。然后调用了mapper对象的resources方法添加server资源的URL映射。这里的mapper.resources方法的功能和前面文章提到的mapper.connect类似,都是向mapper对象中添加URL映射,只是这个方法可以将一些基本的URL映射封装起来。具体到这里的参数,其中“server”是成员名,“servers”是集合名,collection指定了额外的集合操作,member指定了额外的成员操作。
来分析Resource对象吧。
def create_resource(ext_mgr):
return wsgi.Resource(Controller(ext_mgr))其中ext_mgr是一个ExtensionManager对象,它主要用于实现Nova API的功能扩展,这个放在后面分析。由上面代码可以看出,Resource对象可以看做是对Controller对象的一个封装,它在Controller对象的基础上,添加了消息的序列化、反序列化的功能。
弄清楚了上面的内容,我们回过头来看一下收到HTTP请求后的整个处理流程。
osapi_compute_app_v2应用程序对应工厂方法返回了一个APIRouter对象。当客户端发送HTTP请求时,会调用APIRouter对象的__call__方法。APIRouter对象继承自Router类,所以调用的是Router类的__call__方法,来看一下Router类。
class Router(object):
def __init__(self,mapper):
self.map = mapper
self._router = routes.middleware.RoutesMiddleware(self._dispatch,
self.map)
@webob.dec.wsgify(RequestClass=Request)
def __call__(self,req):
return self._router
@webob.dec.wsgify(RequestClass=Request)
def _dispatch(self,req):
match = req.environ['wsgiorg.routing_args'][1]
if not match:
return webob.exc.HTTPNotFound()
app = match['controller']
return app
可以看到,这段代码和我之前文章《OpenStack之RESTful API(二)》基本一致,这里就不再赘述了,不清楚的朋友可以去我这篇文章。Nova API服务最终调用的是Resource类的__call__方法,该类定义在nova/nova/api/openstack/wsgi.py中。这部分代码比较简单,也不是我们要关注的重点,其主要功能就是实现数据的序列化和反序列化的工作。
到这里,Nova API服务的启动过程就分析完了,下篇文章我们来重点分析一下虚拟机的创建。
版权声明:本文为博主原创文章,未经博主允许不得转载。 |
|