【nova-api】api-paste流程说明

举报
蜡笔小树 发表于 2017/09/14 17:43:49 2017/09/14
【摘要】 api-paste流程说明

一.简介

Paste Deployment用于发现和配置WSGI ApplicationServer,有了Paste DeploymentWSGI applications只需向其用户提供一个单独的入口loadapp函数,然后用户调用这个函数就可以使用已经开发好的WSGI application,同时,由于只提供了一个入口,WSGI的开发者也不再需要将App的具体实现暴露给用户,大大简化了整个开发过程。

这里涉及到了两个概念: serverapplicationserver可能大家比较熟悉,即常用的apachenignx等等,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),这是WSGIapplication对象,filter需要完成的工作是将application包装成另一个application(“过滤”),并返回这个包装后的application

pipeline(管道):由若干个filter1app组成。通过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其他的keyvalue作为local_conf参数

传递给调用的factorypipeline_factory_v21

pipeline_factory_v21中读取了配置文件中的auth_strategy所对应的项,即keystone

再来看_load_pipeline函数:

提取了keystone配置中的:

1       最后一个作为app

2       n-1个最为filter

然后让app依次经过“逆序”后的filter进行过滤。

个人理解,这里逆序是让加载时,filter从后往前依次修饰app。层层嵌套,越靠后的将越接近app。请求来时,将从前至后依次经过filter,最终抵达app。随后,开始返回结果,越靠近appfilter将越先被执行完成,之后将修饰后的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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。