Core Service的WSGI Application

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/80669515
先看看下面这个函数:
   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,如下图:
当一个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构建为如下图所示的嵌套关系。
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的实例。
展开阅读全文

没有更多推荐了,返回首页