關於openstack swift的資料能夠看這裏,這裏還有這裏。html
準備環境
從零開始接觸的同窗能夠先從swift的all in one部署開始學習,在本機搭建好swift環境就能夠進行簡單的測試了。因爲swift是用Python語言寫的,若是要開發swift的中間件的還須要在本地安裝Pythone的IDE,我比較喜歡JETBRAIN(他們比較出名的是JAVA的IDE——IDEA)公司的IDE——Pycharm。準備環境以下:node
- 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。python
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 ... |
1 2 3 4 |
... [pipeline:main] pipeline = recon account-server ... |
中間件編寫
瞭解了swift的基本功能流程後,咱們就能夠來寫本身的中間件了。git
沒有寫過中間件的同窗能夠經過學習其餘中間件開始,在swift的源碼中配置了不少中間件,有一些功能很是簡單。好比name_check中間件,這個中間件的做用是拿來分析請求的url,判斷url中是否有特殊字符,長度是否超出規定長度等。這個中間件沒有配置在swift的標準配置中,有須要的能夠自行加上本機的swift環境作測試。github
咱們先來看一下name_check中間件的配置信息:web
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的一些配置參數。shell
- forbidden_chars: 指url中不能包含的特殊字符
- maximum_length: 指url的最大長度
咱們再來看name_check的單元測試:ubuntu
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中間件,指望請求能夠正常經過。swift
最後咱們再來看name_check中間件的源碼幾個方法: * init: 中間件的初始化方法 * call: 中間件被調用時觸發的方法 * filter_factory: 這個是類之外的方法,在swift服務啓動時會建立中間件實例,並加入到pipeline中。app
學習完這個簡單的中間件後,相信你們均可以依葫蘆畫瓢開始寫本身的中間件了。
修改配置文件
編寫完中間件以後,還須要將中間件配置到swift中,這樣纔算真正完成中間件的建立。
首先先中止swift的服務
1
|
swift@ubuntu:~$ swift-init main stop |
接着修改conf文件
假設你增長的中間件是proxy server的中間件,就修改proxy-server.conf,自行決定要放到pipeline中的哪一個位置,具體要看你的中間件是執行什麼功能。
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文件
1 2 3 |
paste.filter_factory = #這裏加入一行本身的中間件,能夠看下name_check中間件是怎麼寫的 name_check = swift.common.middleware.name_check:filter_factory |
執行命令從新安裝swift
1 2 |
swift@ubuntu:~$ cd swift目錄 swift@ubuntu:~$ sudo python setyp.py develop |
最後重啓swift服務
1
|
swift@ubuntu:~$ swift-init main start |