【原创】Swift服务启动架构分析

    Swift中会用到三个非常有用的python模块它们分别是webob,eventlet,paste.deploy,其中webob提供了WSGI封装的Request,Response和其他的一些HTTP操作,eventlet是一个并行的网络编程库,Swift使用它提供多线程的编程,当然更重要的是我接下来要介绍的wsig服务的提供,paste,deploy是提供配置文件书写,启动多个服务(例如proxy-server.conf中的每一个服务)。

    初学python的话,一定对这些云里雾里,我就是这样,不过没有关系,对照源码,自己把架构抽离出来发现,其实真的不难(当然这是大牛们的架构,当然简单易懂)。

    例如启动一个proxy服务,最终的启动操作在/swift/common/wsgi.py中的run_server方法中的wsgi.server()。这个方法是eventlet提供的方法,用来启动一个应用服务(你可以提供给它ip,port,app)app通过loadapp方法从proxy-server.conf中加载其中的app,调用其中的app_factory方法 实例化功能类(Application),要保证这个Application类是可以callable的,需要实现__call__方法,通过webob的Request类,封装一个请求(通过env),然后进行相应的请求操作,然后返回响应。

上码:myserver.py

import eventlet
from eventlet import wsgi
from paste.deploy import loadapp
import os
app = loadapp('config:%s' % os.path.abspath('proxy.conf'))

wsgi.server(eventlet.listen(('', 8090)), app)

 很简单,启动一个app。

proxy.conf

[DEFAULT]

[pipeline:main]
pipeline = myapp

[app:myapp]
paste.app_factory = myapp:app_factory

就是app指向myapp。

myapp.py

from webob import Request, Response

class Application(object):

    def __init__(self, conf):
        pass
    def __call__(self, env, start_response):
       req = Request(env)
       return self.handle_request(req)(env, start_response)
    
    def handle_request(self, req):
        if (req.method == 'GET'):
            resp = Response(request=req)
            resp.body = 'you send GET method'
            return resp

def app_factory(global_conf, **local_conf):
    conf = global_conf.copy()
    conf.update(local_conf)
    return Application(conf)
如果发一个GET请求,返回you send GET method。

    这样就把服务启动的架构抽离抽离出来,这个三段代码分别对应了,Swift中的/swift/common/wsgi.py,proxy-server.conf,/swift/proxy/server.py中的相关代码,然后Swift把具体操作GET POST等请求的代码封装大/swift/proxy/controllers中进行。

对于eventlet,webob,paste.deploy更多理解,请看官方文档:

http://eventlet.net/

http://webob.org/

http://pythonpaste.org/deploy/

你可能感兴趣的:(openstack,swift)