声明:
本博客欢迎转载,但请保留原作者信息!
作者:曾国仕
团队:华为杭州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这个源码目录中,也可以找到。