欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Core Service的WSGI Application

程序员文章站 2022-03-23 18:15:32
...
先看看下面这个函数:
   def _run(self, application, socket):
        """Start a WSGI server in a new green thread."""
        eventlet.wsgi.server(socket, application,
                             max_size=self.num_threads,
                             log=LOG,
                             keepalive=CONF.wsgi_keep_alive,
                             log_format=CONF.wsgi_log_format,
                             socket_timeout=self.client_socket_timeout)
短短一句话,构建了一个包含WSGI Application的Web Server,如下图:
Core Service的WSGI Application
当一个HTTP Request到达这个Web Server时,它首先交由app_urlmap处理,如果HTTP Request中的URL以“/2.0”开头,那么app_urlmap再交由app_cores处理,app_cores再交由下一个app处理,这样一步步传递到了app_ext处理,最后app_ext再交由app_v2.0处理。
我们这里简化模型,只关注app_ext和app_v2.0。因为从WSGI Application的视角来说,Core Service API的处理入口就是app_v2.0,Extension Service API处理入口就是app_ext。所以,我们只关注这两个app。
现在产生3个问题:
1 app_v2.0和app_ext到底是什么?
2 Core Service和Extension Service应该是两个并列的Service,但是Neutron却把这两个对应的app构建为如下图所示的嵌套关系。
Core Service的WSGI Application
app_ext是app_v2.0的外层filter,也就是说,一个Request得首先达到app_ext,app_ext经过相应的处理,才会交由app_v2.0,那么这个相应的处理是什么呢?
3 无论是app_ext,还是app_v2.0,它们到底是如何处理一个HTTP Request(RESTful API)的。
首先我们看看Core Servce的WSGI Application到底是什么。在api-paste.ini中,有如下定义:
#Neutron的业务API
[app:neutronapiapp_v2_0]
paste.app_factory = neutron.api.v2.router:APIRouter.factory
也就是说,Core Service的WSGI Application将由APIRouter这个类的factory函数进行创建。该函数代码如下:
class APIRouter(base_wsgi.Router):
    @classmethod
    def factory(cls, global_config, **local_config):
        return cls(**local_config)
这是一个classmethod。return cls(**local_config)这句代码表示返回一个class APIRouter的实例。也就是说,Core Service的WSGI Application就是一个class APIRouter的实例。