聲明:
本博客歡迎轉載,但請保留原作者信息!
作者:曾國仕
團隊:華爲杭州OpenStack團隊
引子
大部分開源框架基本上都是使用Curl + RPC的方式構築系統,以提供對外\對內的交互能力。
這種設計,本人認爲更多地是出於層次化與模塊化設計的考量,簡化整個架構,使得開發輕量簡單化。
本文主要介紹Compass的REST API的設計與實現。
通過本文檔,讀者至少能快速搭建一個屬於自己的REST API 框架,並且能夠基於該框架進行功能擴展以建立一個完整的系統。
Compass的結構簡介
圖片來源:https://wiki.openstack.org/wiki/Compass#What_is_Compass.3F
上圖是Compass的結構圖,該圖內容較多,但是,本文只關心其中的3部分:【Huawei UI】、【Rest Client】、【Restful API Server】。
場景
l 我的應用有一個酷炫的Web界面
l 我的應用的後端是用python開發的,這語言簡單易用
l 我只關心我的業務邏輯如何處理,UI是設計師的事
l 我希望能夠輕鬆地將Python對接Web,這種對接最好是通過Curl命令實現,這會使得我能夠方便地規劃與擴展對外的統一接口
l 我希望我的應用能夠承受住大規模的訪問
實現步驟
爲滿足以上場景的要求,需要藉助於一些框架了。但是在此之前,我們需要先規劃下一步如何走?
我希望我能夠按照如下的步驟來依次實現功能:
搭建Restful Api Server
Compass使用Flask。
Flask是一個Python的開源Web框架,使得利用Python進行web開發變得尤其的簡單。
(1)安裝Flask
首先,需要安裝pip工具
Install:
yuminstall wget -y
wgethttps://bootstrap.pypa.io/get-pip.py
然後,安裝Flask:
pipinstall Flask
(2)建立一個簡單的WSGI Server
使用Flask內建的WSGI Server起服務:
hello.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return"Hello World!"
@app.route("/test")
def test():
return"This is a test."
if __name__ == "__main__":
app.run() ##綁定到默認的本地Localhost地址上
Setup:
$ python hello.py
* Running on http://localhost:5000/
利用內嵌的WSGIServer綁定到特定的IP地址上:
if __name__ == "__main__":
app.run(host='10.0.0.1')
(3)測試
$curl -i http://127.0.0.1:5000/
$curl -i http://127.0.0.1:5000/test/
$curl -i http://10.0.0.1:5000/
至此,一個簡單的WSGI Server就建立成功了。
但是,這個Server只是利用了Flask本身內建的WSGI 服務器進行部署,不能滿足實際的生產環境中的需求。
規劃API 接口規範
到了此處,就可以根據實際的業務邏輯,規劃API接口規範了。
實際上是:規劃Curl命令中的url地址,設計request格式與response格式並制定對應的處理方法。
對外提供服務
這部分的功能主要依賴於實際的部署方式。
Flask提供了多種實際生產環境下的部署策略:
Compass使用了mod_wsgi的方式將server搭建在Apache上,並且,統一規劃了Api文件目錄作爲Restful Api 的訪問目錄。
如何認定這是個MVC架構
MVC架構是用來規範開發的,實際開發中並無一個標準規範,每一層也沒有十分清晰的劃分。
在Compass中,Viewer層的業務主要集中在:
@app.route("/test")
def test():
return"This is a test."
這類函數中,以接收url request並調用相應的方法處理。
實際的處理過程自然比上面的函數複雜,需要多個模塊協同處理,放在Controller層進行實現,可見Compass的Actions這個源碼目錄。
Model層則定義了業務相關的數據模型,在model這個源碼目錄中,也可以找到。