设为首页 收藏本站
查看: 1426|回复: 0

[经验分享] OpenStack之Nova分析——Nova API服务

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-11 09:30:05 | 显示全部楼层 |阅读模式
  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服务的启动过程就分析完了,下篇文章我们来重点分析一下虚拟机的创建。


  


  


  



版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-125301-1-1.html 上篇帖子: packstack + vxlan 利用vbox虚拟机搭建1控制节点+2计算节点openstack 下篇帖子: openstack installation methods
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表