关于openstack swift的资料可以看这里这里还有这里

准备环境

从零开始接触的同学可以先从swift的all in one部署开始学习,在本机搭建好swift环境就可以进行简单的测试了。由于swift是用Python语言写的,如果要开发swift的中间件的还需要在本地安装Pythone的IDE,我比较喜欢JETBRAIN(他们比较出名的是JAVA的IDE——IDEA)公司的IDE——Pycharm。准备环境如下:

  • Ububutn 12.04 LTS 64bit
  • Python2.7(虽然现在已经有Python3了,但swift是用2.x的Python写的,Python3不向后兼容Python2)
  • Pycharm3

中间件介绍

swift通过提供基于HTTP协议的API给外界调用来完成对象存储的功能,我们从swift的各个部署说明里面可以看到,proxy server和storage node的配置文件里面都有一个[pipeline:main],这个是swift各个服务的请求链,由多个中间件组成的一个中间件集合。pipeline有点像J2EE里面filter,每个http请求需要经过各个服务的pipeline。

proxy-server.conf
1
2
3
4
5
6
...
[pipeline:main]
# Yes, proxy-logging appears twice. This is so that
# middleware-originated requests get logged too.
pipeline = catch_errors healthcheck proxy-logging bulk ratelimit crossdomain slo cache tempurl tempauth staticweb account-quotas container-quotas proxy-logging proxy-server
...
account-server.conf
1
2
3
4
...
[pipeline:main]
pipeline = recon account-server
...

中间件编写

了解了swift的基本功能流程后,我们就可以来写自己的中间件了。

没有写过中间件的同学可以通过学习其他中间件开始,在swift的源码中配置了很多中间件,有一些功能非常简单。比如name_check中间件,这个中间件的作用是拿来分析请求的url,判断url中是否有特殊字符,长度是否超出规定长度等。这个中间件没有配置在swift的标准配置中,有需要的可以自行加上本机的swift环境做测试。

我们先来看一下name_check中间件的配置信息:

proxy-server.conf
1
2
3
4
5
6
7
8
[pipeline:main]
pipeline = catch_errors healthcheck name_check cache ratelimit tempauth sos
proxy-logging proxy-server [filter:name_check]
use = egg:swift#name_check
forbidden_chars = '"`<>
maximum_length = 255

在上面的例子中,name_check中间件加在healthcheck这个中间件后面,filter:name_check下面的配置信息是name_check的一些配置参数。

  • forbidden_chars: 指url中不能包含的特殊字符
  • maximum_length: 指url的最大长度

我们再来看name_check的单元测试:

test_name_check.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class FakeApp(object):

    def __call__(self, env, start_response):
return Response(body="OK")(env, start_response) class TestNameCheckMiddleware(unittest.TestCase): def setUp(self):
self.conf = {'maximum_length': MAX_LENGTH, 'forbidden_chars':
FORBIDDEN_CHARS, 'forbidden_regexp': FORBIDDEN_REGEXP}
self.test_check = name_check.filter_factory(self.conf)(FakeApp()) def test_valid_length_and_character(self):
path = '/V1.0/' + 'c' * (MAX_LENGTH - 6)
resp = Request.blank(path, environ={'REQUEST_METHOD': 'PUT'}
).get_response(self.test_check)
self.assertEquals(resp.body, 'OK') ...... # other test cases
if __name__ == '__main__':
unittest.main()

看源码先从单元测试看起,可以以最快的速度了解源代码的功能。在这个测试案例中,测试先mock了一个虚拟的app,这个app不会真实的调用swift,而是会将http response返回预设好的值。

再看其中的一个测试案例,这里给定了一个最大长度url,然后通过调用name_check中间件,期望请求可以正常通过。

最后我们再来看name_check中间件的源码几个方法:
* init: 中间件的初始化方法
* call: 中间件被调用时触发的方法
* filter_factory: 这个是类以外的方法,在swift服务启动时会创建中间件实例,并加入到pipeline中。

学习完这个简单的中间件后,相信大家都可以依葫芦画瓢开始写自己的中间件了。

修改配置文件

编写完中间件之后,还需要将中间件配置到swift中,这样才算真正完成中间件的创建。

首先先停止swift的服务

shell
1
swift@ubuntu:~$ swift-init main stop

接着修改conf文件

假设你增加的中间件是proxy server的中间件,就修改proxy-server.conf,自行决定要放到pipeline中的哪个位置,具体要看你的中间件是执行什么功能。

proxy-server.conf
1
2
3
4
5
6
7
8
[pipeline:main]
pipeline = catch_errors healthcheck your_middleware cache ratelimit tempauth sos
proxy-logging proxy-server [filter:your_middleware]
use = egg:swift#your_middleware
your_middleware_config1 = value1
your_middleware_config1 = value2

要修改swift的根目录下的setup.cfg文件

setup.cfg
1
2
3
paste.filter_factory =
#这里加入一行自己的中间件,可以看下name_check中间件是怎么写的
name_check = swift.common.middleware.name_check:filter_factory

执行命令重新安装swift

shell
1
2
swift@ubuntu:~$ cd swift目录
swift@ubuntu:~$ sudo python setyp.py develop

最后重启swift服务

shell
1
swift@ubuntu:~$ swift-init main start

Openstack Swift中间件编写的更多相关文章

  1. 理解 OpenStack Swift (3):监控和一些影响性能的因素 [Monitoring and Performance]

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  2. [转载] 对象存储(2):OpenStack Swift——概念、架构与规模部署

    原文: http://www.testlab.com.cn/Index/article/id/1085.html#rd?sukey=fc78a68049a14bb228cb2742bdec2b9498 ...

  3. 【转载】OpenStack Swift学习笔记

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:崔炳华      原文地址:http://blog.csdn.net/i_ch ...

  4. 理解 OpenStack Swift (2):架构、原理及功能 [Architecture, Implementation and Features]

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  5. 理解 OpenStack Swift (1):OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置

    本系列文章着重学习和研究OpenStack Swift,包括环境搭建.原理.架构.监控和性能等. (1)OpenStack + 三节点Swift 集群+ HAProxy + UCARP 安装和配置 ( ...

  6. OpenStack Swift集群与Keystone的整合使用说明

    之前已经介绍了OpenStack Swift集群和Keystone的安装部署,最后来讲一讲Swift集群与Keystone的整合使用吧. 1. 简介 本文档描述了Keystone与Swift集群的整合 ...

  7. OpenStack Swift集群部署流程与简单使用

    之前介绍了<OpenStack Swift All In One安装部署流程与简单使用>,那么接下来就说一说Swift集群部署吧. 1. 简介 本文档详细描述了使用两台PC部署一个小型Sw ...

  8. OpenStack swift安装

    由于实验室项目需要云存储系统,因此在实验室服务器上搭建一个基于OpenStack swift的云存储系统. 最开始按照官方网站上介绍的方法,使用SAIO方式安装http://docs.openstac ...

  9. Openstack Swift 原理、架构与 API 介绍

    OpenStack Swift 开源项目提供了弹性可伸缩.高可用的分布式对象存储服务,适合存储大规模非结构化数据.本文将深入介绍 Swift 的基本设计原理.对称式的系统架构和 RESTful API ...

随机推荐

  1. 软技能:十步学习法 (zhuan)

    http://www.gyzhao.me/2016/11/07/Ten-Step-Learning-Method/ ****************************************** ...

  2. 百度地图-marker拖拉,右键菜单

    marker拖拉,修改经纬度. //创建Map实例 var map = new BMap.Map("allmap"); var point=new BMap.Point(104.0 ...

  3. fedora 关闭、禁止selinux

    Fedora关闭/禁用SELinux三种方法 在Fedora中有时候我们想关闭SELinux,因为有时候本是合法的操作也总是弹出窗口阻止我们的操作.下面介绍三种方法来关闭/禁用SELinux. 1.在 ...

  4. (转)springAOP解析-1

    原文:http://hzbook.group.iteye.com/group/wiki/2261-Spring 3.1  Spring AOP概述 3.1.1  AOP概念回顾AOP是Aspect-O ...

  5. 虚拟机装centos 桥接方式上网[转]

    http://blog.csdn.net/sunbiao0526/article/details/6804127   虚拟机选择bridge方式连接网络 首先 vi /etc/sysconfig/ne ...

  6. virutalbox虚拟机硬盘扩容

    大小改变为30GB VBoxManage modifyhd d:\newxp.vdi --resize 30000 然后用diskgenius扩从容量

  7. this 指向

    this-->当前行为发生的主体就是this,但是this是谁和这个方法在哪执行的或者在哪定义的都没有半毛钱的关系 如何的区分JS中的this? 1)函数执行,看函数名前面是否有".& ...

  8. Qt之可重入与线程安全

    简述 本篇文章中,术语"可重入性"和"线程安全"被用来标记类与函数,以表明它们如何被应用在多线程应用程序中. 一个线程安全的函数可以同时被多个线程调用,甚至调用 ...

  9. Linux查看系统信息(操作系统版本,进程,任务,CPU,内存,磁盘等信息)

    查看操作系统: cat /proc/version   # 内核版本 cat /etc/issue   # 发行版本 head -n 1 /etc/issue uname -a lsb_release ...

  10. PHP读取文件夹目录,按时间排序,大小排序,名字排序

    工作中有时候会遇到文件存储数据,但是在前台显示的时候又因为没有数据库,无法使用上传或最后一次修改日期字段排序,所以有了如下代码: <?php $dir = "./";//目录 ...