当前位置:首页 > Windows程序 > 正文

api HTTP请求执行流程

2021-03-19 Windows程序

这次看了一下nova list命令的执行过程,整个过程可以分为几步:HTTP请求、URLMap分发、过滤、APIRouter到具体执行函数,接下来使用Postman组个包并发送http请求作为开始对各个模块进行跟踪和注解。

1. HTTP请求

OpenStack组件都是通过RESTful API向外提供服务,也就是说可以通过http的方式操作OpenStack。而操作的大致步骤分为两步:身份认证、发送任务,我们可以看一下http命令的实际操作情况。
首先是身份认证,这一步由keystone完成,返回token。

技术分享

之后我们可以拿这个获取到的token去进行具体操作。

技术分享

2. URLMap分发

还是先看一下代码,之前在Liberty nova-api启动流程分析的最后我们看到osapi_compute app负责监听8774端口,其实这个服务就是一个URLMap的callable对象,现在接收到8774端口的http请求时,,调用URLMap的call()。

# nova/api/openstack/urlmap.py class URLMap(paste.urlmap.URLMap): def __call__(self, environ, start_response): # host = ‘172.29.152.111:8774‘ host = environ.get(‘HTTP_HOST‘, environ.get(‘SERVER_NAME‘)).lower() ... ... ... ... ... ... ... ... # path_info = ‘/v2.1/35a94cc2b7bd4f088019dbc61f6dce37‘ # mime_type = None, app_url = ‘/v2.1‘ # app = <function wrap at 0x7ff89c03e410> mime_type, app, app_url = self._path_strategy(host, port, path_info) if (app_url and app_url + ‘/‘ == path_info) or path_info == ‘/‘: supported_content_types.append(‘application/atom+xml‘) ... ... ... ... ... ... ... ... if app: # environ[‘nova.best_content_type‘] = ‘application/json‘ environ[‘nova.best_content_type‘] = mime_type return app(environ, start_response) ... ... ... ... ... ... ... ... # nova/api/openstack/urlmap.py class URLMap(paste.urlmap.URLMap): def _path_strategy(self, host, port, path_info): ... ... ... ... ... ... ... ... # parts = [‘‘, ‘v2.1‘, ‘35a94cc2b7bd4f088019dbc61f6dce37‘] parts = path_info.split(‘/‘) if len(parts) > 1: # possible_app = <oslo_middleware.cors.CORS object at 0x7ff89da5ff50> # possible_app_url = ‘/v2.1‘ # 这边开始进行版本匹配,获取相应的app possible_app, possible_app_url = self._match(host, port, path_info) if possible_app and possible_app_url: # app_url = ‘/v2.1‘ app_url = possible_app_url # app = <function wrap at 0x7ff89c03e410> app = self._munge_path(possible_app, path_info, app_url) # mime_type = None # app = <function wrap at 0x7ff89c03e410> # app_url = ‘/v2.1‘ return mime_type, app, app_url

之后的_match()方法真正实现根据版本调用app。

# nova/api/openstack/urlmap.py class URLMap(paste.urlmap.URLMap): # 下面涉及到初始化的时候设置的applications参数,这边列出初始化的结果 # self.applications = # [((None, ‘/v2.1‘), <oslo_middleware.cors.CORS object at 0x7ff89da5ff50>), # ((None, ‘/v2‘), <oslo_middleware.cors.CORS object at 0x7ff89e15a310>), # ((None, ‘‘), <nova.api.openstack.FaultWrapper object at 0x7ff89d9e5950>)] def _match(self, host, port, path_info): """Find longest match for a given URL path.""" # eg. v21版本对应的是openstack_compute_api_v21 app,根据pipeline的定义, # 最后一个filter是cors,所以可以看见app的类型如下: # domain = None # app_url = ‘/v2.1‘ # app = <oslo_middleware.cors.CORS object at 0x7ff89da5ff50> for (domain, app_url), app in self.applications: if domain and domain != host and domain != host + ‘:‘ + port: continue # 这里根据之前初始化设置的urlmap进行匹配 if (path_info == app_url or path_info.startswith(app_url + ‘/‘)): return app, app_url return None, None 3. 过滤

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/63532.html