【nova-api】api-paste流程说明
一.简介
Paste Deployment用于发现和配置WSGI Application和Server,有了Paste Deployment,WSGI applications只需向其用户提供一个单独的入口loadapp函数,然后用户调用这个函数就可以使用已经开发好的WSGI application,同时,由于只提供了一个入口,WSGI的开发者也不再需要将App的具体实现暴露给用户,大大简化了整个开发过程。
这里涉及到了两个概念: server和application,server可能大家比较熟悉,即常用的apache,nignx等等,applications广义理解就是一个符合wsgi规范的一个可调用的object,规范指的是:一个接受两个参数的函数(environ,start_response)。
示意图如下:
二.部件
app(应用程序):WSGI服务的核心部分,用于实现WSGI服务的主要逻辑
app是一个callable object,接受的参数(environ,start_response),这是paste系统交给application的,符合WSGI规范的参数. app需要完成的任务是响应envrion中的请求,准备好响应头和消息体,然后交给start_response 处理,并返回响应消息体。
filter(过滤器):一般用于一些准备性的工作,例如验证用户身份、准备服务器环境等。在一个filter执行完之后,可以直接返回,也可以交给下一个filter或者app继续执行。
filter是一个callable object,其唯一参数是(app),这是WSGI的application对象,filter需要完成的工作是将application包装成另一个application(“过滤”),并返回这个包装后的application。
pipeline(管道):由若干个filter和1个app组成。通过pipeline,可以很容易定制WSGI服务
composite(复合体):用于实现复杂的应用程序,可以进行分支选择。例如:根据不同的URL调用不同的处理程序。
三.代码走读
1.从配置文件中加载WSGI应用:
配置文件如下,读取了api-paste中的配置:
注意,这里虽然读取的是配置文件api-paste.ini。但api-paste.ini不是直接编写的,而是由编写的api-paste.ini.sample所生成的。所以走读的应该是api-paste.ini.sample,而不是api-paste.ini文件。
2.从服务启动的过程中,就调用deploy.loadpp使用config方式来load section名为osapi_compute(此处的服务在配置项中有配置)的应用:
其中,call直接指定了需要调用的类,将另外3行作为local_conf参数传入urlmap_factory:
循环加载配置的应用,返回保存着path:app的字典,使得不同的http请求对应不同的app。
3.接下来看一个openstack_compute_api_v21应用:
其中,call直接指定了需要调用的类。该section其他的key与value作为local_conf参数
传递给调用的factory:pipeline_factory_v21:
在pipeline_factory_v21中读取了配置文件中的auth_strategy所对应的项,即keystone:
再来看_load_pipeline函数:
提取了keystone配置中的:
(1) 最后一个作为app
(2) 前n-1个最为filter
然后让app依次经过“逆序”后的filter进行过滤。
个人理解,这里逆序是让加载时,filter从后往前依次修饰app。层层嵌套,越靠后的将越接近app。请求来时,将从前至后依次经过filter,最终抵达app。随后,开始返回结果,越靠近app的filter将越先被执行完成,之后将修饰后的app继续返回给前一个filter。
4.再来看app所对应的section:
这里指定了paste.app_factory,精确到了具体运行的python代码。这里类比APIRouter,可能也是组装了路由路径:
到这里,这个app就启动起来了,访问它时,会经过配置那些filter。
5.可以再来看filter的实际实现:
compute_req_id:
这里指定了paste.app_factory,精确到了具体运行的python代码compute_req_id:
类似地,也在call方法中将请求request作为参数传入进去,其中也会调用get_response获得response,并最终返回response。
- 点赞
- 收藏
- 关注作者
评论(0)