文档章节

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

zhouxingxing
 zhouxingxing
发布于 2012/10/08 13:40
字数 540
阅读 3835
收藏 25

    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/

© 著作权归作者所有

zhouxingxing
粉丝 70
博文 69
码字总数 48470
作品 0
杭州
程序员
私信 提问
【原创】OpenStack Swift源码分析(五)keystone鉴权

如何想用使用 Swift的服务,都需要经过认证鉴权,例如,某用户想上传一个文件X,首先该用户需要有权限进入到系统中,然后他需要有可以上传文件的权限,早期版本Swift有自己的实现认证鉴权的程...

zhouxingxing
2012/10/16
5K
13
Swift 中proxy-server.conf启动顺序总结

昨天介绍swift服务启动架构的时候,谈到了proxy启动的时候,根据proxy-server.conf配置文件依次启动服务,下面来看一下我的proxy-server.conf文件 [DEFAULT]bind_port = 8080bind_ip = 192.1...

zhouxingxing
2012/10/09
1K
0
【原创】OpenStack Swift源码分析(二)ring文件的生成

上一遍源码分析,关注swift-ring-bin文件,其中最为复杂,也是最为重要操作要数rebalance方法了,它是用来重新生成ring文件,再你修改builder文件后(例如增减设备)使系统中的partition分布...

zhouxingxing
2012/09/28
2.3K
0
fir.im Weekly - 当技术成为一种“武器”

最近纷纷扰扰,快播公开庭审,携程事件仍在升级,百度还在继续无底线。我们相信技术本身并不可耻,但是用技术作恶就是可耻。当技术成为一种武器,Do not be evil. 好了,继续本期的 fir.im W...

风起云飞fir_im
2016/01/18
50
0
OpenSearch在线干预服务

背景 阿里云开放搜索OpenSearch是一款阿里巴巴自主研发的大规模分布式搜索引擎平台,该平台承载了淘宝、天猫、1688、神马搜索、口碑、菜鸟等搜索业务,通过OpenSearch云服务的方式,将阿里巴...

小扑
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7命令行和图形界面的相互切换

最近安装了centos7,发现在命令行和图形界面的相互切换命令上,与centos以往版本有很大不同。 1,centos7默认安装后,跟其他版本一样,启动默认进入图形界面; 2,在图形化桌面,右击鼠标,选...

无名氏的程序员
11分钟前
5
0
对称的二叉树

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) ...

Garphy
20分钟前
2
0
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么

一:快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在...

Bb进阶
23分钟前
5
0
golang 数据库与JSON解析一起 用空格分割

type Stocks struct { Id string `xorm:"varchar(64) pk" json:"id"` Name string `xorm:"varchar(64)" json:"name"` StockNum str......

zdglf
27分钟前
4
0
恨天诀——第一集 第五章

天似穹庐,笼盖四野。 静静矗立的天柱峰,像一把长剑,直插云霄。山南显得格外阴冷,萧瑟。 “龙儿,何为天道?”一长一少两人默默并排而立,长者问道。 良久,少年回答:“父亲,恕孩儿驽钝...

Kerwin_zZ
33分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部