如何进行openstack核心路由和扩展路由及路由对应的api函数调用流程的分析

发布时间:2021-12-01 15:53:59 作者:柒染
来源:亿速云 阅读:195
# 如何进行OpenStack核心路由和扩展路由及路由对应的API函数调用流程的分析

## 一、OpenStack路由机制概述

OpenStack作为开源云计算平台,其API服务采用RESTful架构设计,路由机制是连接客户端请求与后端服务实现的关键桥梁。路由系统主要负责:

1. URL路径到具体处理函数的映射
2. HTTP方法(GET/POST/PUT/DELETE)的分发
3. 请求参数的解析和验证
4. 版本控制与扩展支持

典型路由配置示例:
```python
# Nova API中的路由定义示例
RESOURCES = {
    'servers': servers.ServersController(),
}

ROUTE_LIST = [
    (r'/servers', resources),
    (r'/servers/(.*)', resource)
]

二、核心路由与扩展路由的区别

1. 核心路由(Core Routes)

特点: - 稳定性高,变更需经过严格评审 - 直接映射到主要Controller类 - 支持所有标准HTTP方法

2. 扩展路由(Extension Routes)

特点: - 可热插拔,不影响主服务 - 需显式声明依赖关系 - 可能覆盖核心路由行为

三、路由分析技术路线

1. 代码定位方法

通过API请求反向追踪:

HTTP请求 → WSGI路由 → PasteDeploy → Controller → Driver

关键代码库: - oslo_service/wsgi.py (WSGI实现) - nova/api/openstack/urlmap.py (URL映射) - neutron/api/v2/router.py (路由构造)

2. 核心路由分析示例(以Nova创建实例为例)

# nova/api/openstack/compute/servers.py
class ServersController(wsgi.Controller):
    
    @wsgi.response(202)
    def create(self, req, body):
        """处理POST /servers请求"""
        # 参数解析
        # 业务逻辑处理
        # 返回响应

调用链:

POST /v2.1/servers
  → nova.api.openstack.urlmap.URLMap
  → nova.api.auth:AuthMiddleware
  → nova.api.openstack.compute:APIRouter
  → ServersController.create()

3. 扩展路由分析示例(以Cinder卷扩展为例)

# cinder/api/contrib/volume_actions.py
class VolumeActionsController(wsgi.Controller):
    
    @wsgi.action('os-extend')
    def _extend(self, req, id, body):
        """处理扩展卷大小请求"""

调用链:

POST /v2/volumes/{id}/action
  → cinder.api.middleware.auth:AuthMiddleware
  → cinder.api.openstack:APIRouter
  → VolumeActionsController._extend()

四、API函数调用流程深度解析

1. 请求生命周期

  1. WSGI入口处理 (oslo_service.wsgi.Server)

    • 请求环境初始化
    • 异常捕获和转换
  2. 路由匹配阶段 (routes.middleware.RoutesMiddleware)

    • URL路径解析
    • 方法分发(通过webob.dec.wsgify)
  3. 控制器处理 (各模块Controller)

    • 参数验证(通过oslo_utils.strutils)
    • RPC调用(通过oslo_messaging)
  4. 响应生成 (webob.Response)

    • 状态码设置
    • 数据序列化(通常为JSON)

2. 关键调试方法

使用OSProfiler跟踪调用链:

[profiler]
enabled = true
trace_sqlalchemy = true

典型输出:

POST /v2.1/servers
|- nova.api.wsgi:Application.__call__
|- nova.api.auth:AuthMiddleware.__call__
|- nova.api.openstack:APIRouter.__call__
|- nova.api.openstack.compute.servers:create
   |- nova.compute.api:API.create
      |- nova.conductor.api:ComputeTaskAPI.build_instances

五、实战分析案例

案例1:Neutron网络创建路由分析

  1. 路由定义位置: neutron/api/v2/router.py::APIRouter.initialize()

  2. 核心映射关系:

resource = Resource(controller,
                    mapper=wsgi_resource_mapper,
                    deserializer=deserializer,
                    serializer=serializer)
mapper.connect("network",
               "/networks",
               controller=resource,
               action="create",
               conditions={"method": ["POST"]})
  1. 调用堆栈:
POST /v2.0/networks
  → neutron.api.v2.router:APIRouter
  → neutron.api.v2.base:create
  → neutron.db.api:create_resource
  → ML2Plugin.create_network

案例2:Glance镜像上传扩展路由

  1. 扩展声明:
# glance/api/v2/images.py
class ImagesController(object):
    
    @extensions.expected_errors(())
    def upload(self, req, image_id):
        """处理PUT /images/{id}/file"""
  1. 路由注册:
# glance/api/v2.router:API
def _setup_ext_extensions(self):
    self._register_extension('image-upload', ImagesController.upload)

六、进阶分析技巧

1. 动态路由追踪

使用Python trace模块:

python -m trace --trace -C . nova/api/wsgi.py

2. 路由冲突检测

检查urlmap冲突:

from nova.api.openstack import urlmap
urlmapper = urlmap.URLMap()
print(urlmapper.match('/v2.1/servers'))

3. 性能分析重点

需要特别关注的耗时操作: - 路由匹配时间(特别是正则表达式路由) - 扩展路由的懒加载开销 - 版本协商过程

七、总结与最佳实践

  1. 核心路由优化建议

    • 避免在核心路由中使用复杂正则
    • 保持Controller方法精简
    • 使用@wsgi.response()明确状态码
  2. 扩展路由开发规范

    • 遵循extensions.ExtensionDescriptor接口
    • 明确声明API版本需求
    • 提供完整的API文档元数据
  3. 调试技巧: “`bash

    查看已加载路由

    curl http://controller:5000/ -H “X-OpenStack-API-Version: compute 2.1”

# 启用详细日志 [DEFAULT] debug = true wsgi_keep_alive = false


通过系统化的路由分析,开发者可以:
- 准确理解OpenStack API架构
- 快速定位功能实现位置
- 有效进行二次开发和问题排查

注:本文基于OpenStack Queens版本分析,不同版本可能存在实现差异。建议结合具体版本的API参考文档进行验证。

推荐阅读:
  1. 静态路由和默认路由的配置
  2. 使用koa-router路由参数和前端路由的案例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

openstack api

上一篇:LINQ入门知识点有哪些

下一篇:HAProxy主要特性是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》