《工业控制计算机》2020年第33卷第10期97
基于Flask的分布式Web服务架构研究与应用
徐杰(公安部第三研究所928实验室,上海201210)
摘要:研究基于Flask的分布式Web服务研究与应用。目前Python在工业界使用越来越广泛,Python开发Web服务应用也被越来越多的厂商采用,目前基于Web的框架,有各种语言的服务框架,但是Python语言的生态现在越来越完善,使用Python语言进行Web服务开发咱1],可以很容易进行相应服务的开发,因为Python生态非常好,相应的应用工具和库也非常的完善。在加上Nginx代理、MySQL、Mongo、Redis相关的数据库,可以很容易构建一个分布式高可用的Web服务。
关键词:Web服务;Python;Flask
基于http的Web服务是一种独立的,与其他服务低耦合的一种Web应用服务程序,是一种以服务为导向的技术架构,通过标准的Web协议提供服务,目的是保证不通平台的应用服务可以互相操作。所以基于http的Web服务开发了我们自己的应用系统,开发的Web服务,用户只需要浏览器即可访问,无需要安装其他应用程序,用户使用和操作更加方便。
1常见的Python Web服务框架比较
现在,Python的生态非常完善,生态里面有很多开发框架可以轻松构建Web应用。Web开发框架的意义就在于可以敏捷地开发和构建应用,而不需要在没必要的技术细节中浪费时间,可以迅速地开发自己的产品,保证产品的快速产岀。
Python的Web框架也有越来越多的厂商开始使用,使用Python开发和构建自己的产品,如国外知名的YouTube、Insta-gram、Reditt,国内的有知乎、豆瓣等,都应用到了不同的Python Web框架。下面就介绍一下Python生态中常见的一些Web框架。
常见的Python Web服务框架有:Django、Flask、Tornado、Web2py等。
1.1Dja n go
Django在Python语言的Web开发框架中,很有代表性和知名度,Django的名字是来自于一位法国的作曲家和吉他演奏家Django Reinhardt。
Django遵循了MVC开发模型,M、V、C分别表示:
M ModDl(数据模型,用于定义后端的数据库模型);
T Template(模板,用于定义前端显示信息);
V View(视图,用于接收客户端请求,处理model,渲染返回给客户端)。
优点:
Django是一个一站式的开发和解决方案,Django中的各种WDb组件集成度也非常成熟,配置齐全,内部的数据模型和对用户操作的权限认证体系健全,0RM数据库管理也比较成熟,并且有自带的后台管理功能。
缺点:
Django是一个很重的Web开发框架,系统大而全,庞大的系统袁复杂的配置袁使得学习成本很高袁对于一些轻应用和一些需要敏捷开发的产品袁可能并不适用。
1.2Flask
相对于Django的大而全的大系统,Flask是基于Werkzeug 工具箱开发的轻量级Web开发框架,主要面向一些功能简单、需求简单、项目周期比较短的一些轻应用。
Flask框架比较灵活,Flask只是完成了Werkzeug和模板引擎Jinja基本的核心功能,其他的功能都是由第三方插件完成。
优点:
Flask的项目结构简单,核心服务比较轻量,配置比较简单,第三方组件可以自由拆卸,比较适用于小型的项目开发使用。
缺点:
由于Flask的组件高度自由,全部可以自定义,那么各种组件自定义带来的组件兼容性问题比较明显,所以需要搭配兼容的组件版本。
1.3Tornado
Tornado和Flask一样,除了基本的处理功能和模板外,其他的功能组件都需要自行拼装遥
优点:
Tornado也是一个小巧精悍的Web框架,性能比较好,不依赖Python多进程多线程,支持异步非阻塞I0处理方式。
缺点:
Tornado过于精简,所以一般只适用于做一些接口化的服务和一些微型网站。
1.4Web2py
WDb2py是一个开源框架,它开始是作为工具开发的,它的目标是去除大量重复开发工作,最开始的源代码是由Massimo DiPierro在2007年开发的,Web2y和Django—样,具有广泛的文档,适用与常规的Web服务开发。
优点:
作为一个全栈式框架,它无需其他依赖就可以工作,容易部署。安装无需任何配置文件,下载完成即可使用。
安全性也比较岀,WDb2py的模板语言减少了黑客使用跨站脚本的危险。会话由于存储在后台服务器上,所以可以防止页面用户对浏览器中的cookie进行篡改。
2Web服务架构设计
通过对每个框架特点的比较,通过对Flask框架在易用性、学习成本和生态等方面的综合考虑,最后结合我们自己的业务场景,选取了Flask作为开发的Web框架。
系统总体架构分为三层,第一层是直接面向用户的网关层,网关层我们选取了Nginx作为网关层的服务框架,Nginx在处理网络请求方面具有很好的性能囱,网关层负责直接连接用户,处理用户发送和接收的请求;第二层为Web服务的API处理层,这一层主要是处理与API接口相关的逻辑,我们选择了Flask作为服务接口的处理框架,Flask作为服务接口的开发框架,使得我们开源快速的开发岀我们的Web应用程序;第三层为数据层袁这一层主要是处理存储数据服务的袁主要使用了MySQL、Elasticsearch和Mongodb数据存储服务。
Web服务架构如图1所示。
2.1网关层
网关层中使用Nginx服务作为代理,Nginx是一款高性能、
98基于Flask的分布式Web服务架构研究与应用
图1整体架构图
比较轻量级的Web服务器和各种服务的反向代理服务,是遵循
BSD-like协议使用C语言所开发的一种开源的Web服务,Ngi nx的作者是一位俄罗斯的设计师,最开始Ng i nx主要供俄国的一些大型网站和一些搜索引擎使用囱。
Ng i nx是一款面向性能设计的http服务器,相比与A-pache、Lighttpd服务框架,Ng i nx以其占用内存少,稳定性高等优势迅速打开了市场,市场占有率直线上升。与Apache不同的
是,Ngi nx所采用的并不是一个线程服务一个用户的模型,而是充分利用了异步逻辑袁减少了上下文调度消耗袁所以并发能力更
强,性能更好。Ngi nx整体的开发采用模块化设计,有非常多的
开源模块和丰富的第三方库,Ng i nx的配置也非常灵活,在Li n-ux操作系统中,Ngi nx是采用jpoll模型,使得Ng i nx在Li nux 系统下效率非常高。而且Ngi nx完全使用C语言开发,可以移植到多个操作系统和多个体系结构,常用的系统:Mac、Solar i s、FreeBSD、AIX和Wi ndows都可以稳定运行Ng i nx服务。
2.2API接口处理层
API处理层主要是通过Supervi sor+Gun i corn+Flask实现
的网络API服务,配置多进程模式,可以同时支持多并发需求。
Supervi sor主要是由Python开发,是一种通用的管理进程的程序管理软件,能将配置的独立执行的命令,使用后台dD&-mon子进程执行的形式运行,并对启动的子进程进行状态的监控,当执行命令行的子
进程异常退岀时,Supervi sor父进程可以通过子进程信号,自动重启子进程。Supervisor的原理是通过子进程的方式,将管理的进程当作子进程来管理,只要在Supervi­sor的配置文件中,配置需要执行的命令即可,也可以实现在进程挂掉的时候,父进程可以根据子进程的信号,选择是否自己启动或者报警,Supervi sor还可以为每个子进程设置不同的账号,根据不同的账号管理不同的进程,所以Supervi sor的进程管理还是非常灵活和非常易用的功能。我们使用Superv i sor管理了Flask的多进程程序,可以保证多进程的异常处理功能。
Gun i corn是一种配合Python运行的WSGI Un i x的http
服务器。Gun i corn框架是一种pre-fork worker模型,Gun i corn
项目最开始从Ruby的一个独角兽项目中进行移植而成的,Gu-
n icorn的http服务器与其他各种Web框架几乎兼容,只需要非常简单的执行袁资源消耗非常轻量袁而且性能较高袁速度较快。将Gun i corn运行的WSGI的服务器运行程序配置在Superv i s or
的进程管理中,可以使得Gun i corn进程一直处于高可用状态。2.3数据层
数据层采用MySQL+Elast i csjarch+Mongodb存储数据,MySQL主要负责存储一些关系型结构数据,主要是一些基础数据,Elast i csearch主要是存储一些查询统计数据,Monogodb 主要是存储一些文本型数据。
MySQL是一种广泛使用的关系型数据库,最开始是由瑞典的MySQL AB公司使用C语言所开发的,后来由于各种原因被Oracle收购,变成了Oracle公司的产品,MySQL算是当前应用最广泛的关系型数据库之一[3],特别是在Web服务应用中,对于关系型数据的管理和存储方面袁在各种网站和各种类型公司中,MySQL应该都有应用到遥
MySQL可以将不同的数据进行分表存储,而不是放在一个大的数据库里袁这种设计可以加快数据的存储和查询效率袁也为数据存储提供了灵活性,而且MySQL体积小、速度快、使用成本和学习成本低,现在被广泛使用。MySQL所使用的SQL语言是一种标准化语言袁在对数据库的操作中袁所以不管是从其他数据库切换到MySQL的开发者,还是开始学习使用MySQL的开发人员,只要有SQL相关的基础,那么学习MySQL将会非常容易,这个学习成本低也是MySQL应用越来越广泛的原因之一。
Red i s全称是RemotJ D i ct i o n a ry Server,即为远程字典服务,是一种采用ANSI C语言开发的、支持TCP网络、可在内存和磁盘中运行的kDy-valuj型数据库,并提供了多种语言的接口API,Rjd is因为其广泛的数据结构,易用的API接口,使得Red i s可以在缓存服务领域迅速推广,应用广泛。
Elast i csearch是一个开源的搜索和分析引擎,基于Lu-cence开发,并提供了一种全文搜索服务,基于RESTful Web
接口咱4输共多用户并发访问,Elast i csearch中的所有组件都是现有的开源组件袁没有单独的组件是全新开发的袁但是它的特点就
是将这些单独的,有用的组件融合到一个单一、实用的服务中,使
得其可以在低端机、个人机器、高端机、服务器等各种机器上正常运行。Elasti csearch设计的目标是随时可用,即高可用,按需扩容,Elast icsearch设计初衷就是设计一个分布式的集系统,在系统中节点宕机时不影响现有服务的正常运行,如果集负载压力过大袁可以动态地按需增加服务节点袁保证系统的正常运行。
3实际应用
在实际的应用程序中,我们使用了Ng i nx作为代理服务,Ng i nx除了做http接口的反向代理,Ngi nx还可以处理静态文件的下载,在Ngi nx服务中,配置静态文件的下载路由,就可以提供静态文件的下载服务。
网关层主要是使用Ng i nx做代理,用户访问系统的时候,首
先通过DNS域名解析,得到访问的IP,然后通过IP访问网关Ng i nx服务,由于有域名解析,所以可以配置多个Ng inx的IP地址,可以达到第一层的负载均衡效果。然后将网络请求通过IP进行Hash负载均衡,
路由到上一级的API服务层[5]。
API接口层使用Flask配合Gun i corn提供的WSGI服务,Superv i sor提供的进程管理系统,实现了一个高稳定和高可用的http的Web服务器。
在数据层使用了MySQL进行用户基本信息的存储,数据库进行了分库多表存储袁避免大量数据在一个表中影响效率袁数据库设置了主备同步备份,防止数据库宕机服务无法使用或者数据丢失的情况;使用Redis对相同的请求进行一定时间的缓
(下转第101页
《工业控制计算机》2020年第33卷第10期
101
0.
0 1D  20
30
40
50 61> 70 刖
新.H-
|—企式註H 羽的无■捐羅甲
图6箔片变形和偏心引起的膜厚对比图
箔片变形略小于公式法所计算的变形大小。
为了研究不同的轴承箔片变形计算模型对轴承静特性的影 响,轴承在不同转速下基于不同箔片变形处理方法下的承载力
对比如图 7 所示。
;IM»
IH0
5 2500
*IWO
HI 性 #AIKIS
转建(IRTIf)
图7轴承承载力随转速变化图
轴承的承载力随着工作转速的增大而增大。刚性表面由于
没有箔片变形,轴承的承载力最大,使用柔度矩阵法计算的承载 力介于公式法和刚性表面之间,承载力随转速的变化趋势受箔
片的影响而呈现非线性。
4 结束语
柔度矩阵法考虑了箔片相互间作用袁 对箔片变形计算更接
近实际工况。两种方法压力分布趋势相似,柔度矩阵法处理油膜 压力较高,柔度矩阵法处理后油膜厚度较小,承载力有所提高。
参考文献
[1 ]Heshmat  H, Walow  i t  J  A, P  i  n kus  0. Analys  i  s  of  gas-lubr  i  c at-
ed  fo  i l  journal  bear i  n gs  [J].Journal  of  Lubr  i  c at  i o n  Technology,
1983,105(4):647-655
[2] Lu  is  S, K  i  m  T  H. Analysis  of  gas  foil  bearings  integrating  FE
top  foil  models[J]. Tribology  lnternational,2009,42(1):111 -120
[3] 熊联友•平箔式箔片径向气体轴承的理论研究[J ] •西安交通大学学
报袁1998袁32(9):56-59
[4] 王法义•空气箔片轴承设计、制造及其静态和动态特性实验研究[D ].
长沙:湖南大学,2014[5] 徐国庆•弹性波箔动压径向气体轴承的理论分析与实验设计[D ] •南
京:南京航空航天大学,2008
[6] Feng  K, Kaneko  S. Analytical  model  of  bump-type  foil  bear ­
ings  using  a  link-spring  structure  and  a  finite-element  shell  model[J]. Journal  of  Tribology, 2010, 132(2):021706
[7] 刘占生,许怀锦,张广辉,等•箔片预变形对箔片气体径向轴承静特性
影响分析[J ].航空动力学报,2009,24(1):181-188
[8] Dellacorte  C, Valco  M  J. Load  capacity  estimation  of  foil  air
journal  bearings  for  oil  -free  turbomachinery  applications  [J].
Tribology  Transactions, 2000, 43(4):795-801
[9] Tim  Leister. Computational  Analysis  of  Foil  Air  Journal  Bear ­
ings  Using  a  Runtime  -Efficient  Segmented  Foil  Model  [J].
Journal  of  Fluids  Engineering,2018,140(2)
[10] Dong  -Hyun  Lee.The  Static  Performance  Analysis  of  Foil
Journal  Bearings  Considering  Three  -Dimensional  Shape  of
the  Foil  Structure[J]. Journal  of  Tribology,2008,130(3)
[收稿日期:2020.8.9]
(上接第98页)
存,可以保证相同的接口同样的请求在缓存时间内可以迅速返
回袁减少了数据库的压力袁同时也增加了系统使用的用户体验;使
用Elasticsearch 进行聊天等文字信息的存储,支持中英文的文 本信息的存储和检索,可以支持页面上的全文高亮实时搜索,
Elasticsjarch 采用集方式部署,如果集中某些节点异常宕
机,将不会影响到正常的搜索服务;使用Mongodb 进行图片、小 文本的存储,Mongodb 也是采用主备同步,防止Mongodb 服务
宕机导致服务不可用袁同时也可以避免数据损坏或者丢失。
根据的架构图,其中多个业务可以共享同一套架构和服务, 只需要在Nginx 中根据不同的业务路由到不同的服务,即可实 现同一套架构中,多个业务共享服务。我们现在实际使用的后台 业务等多个系统袁 可以根据不同的业务类型袁 路由到不同的
Web 服务中,在需要添加新的业务时,只要在Nginx 网关系统 中,配置新的业务类型,Web 后台增加新的业务服务,即可实现
新的业务服务应用。 当服务压力较大时袁 可以动态添加网关服 务、动态添加Web 接口服务,满足不同的线上业务需求咱6]。4 结束语
使用 Nginx+SupDrvisor+Gunicorn+Flask  + MySQL+RD- dis+Elasticsjarch+Mongodb 技术栈,可以轻松地搭建一套稳
定的Web 后台系统,但是对于一些初学者而言,需要了解和掌 握全部的技术栈,还是需要一定的时间学习和探索。未来是否可
以有继承套件,将 Nginx+Supervisor+Gunicorn+Flask  组合做 成开箱即用的工具包袁集成在一起可能会有各种各样的问题袁这
仅是一种个人展望,也许会有其他更好的方案。
参考文献
[1] 李辉.Flask  Web 开发实战:入门、进阶与原理解析[M ]•北京:机械
工业出版社,2018:125
[2] 陶辉•深入理解Nginx :模块开发与架构解析[M ].2版.北京:机械工web前端的基本框架
业出版社,2016:100
[3] 西泽梦路.MySQL 基础教程[M ].卢克贵,译•人民邮电出版社,2020:
201
[4] 波哈维•荻西特(Bharvi  Dixit ).深入理解Elasticsearch  (原书第3
版)[M ].刘志斌,译•北京:机械工业出版社,2019:80
[5] 刘爱洁•负载均衡技术浅析[J ].电信工程技术与标准化,2002(6):
78-83
[6] 胡安波,苏金树,陈曙晖•应用层负载均衡技术研究[J ] •计算机工程
与应用袁2009袁45(14):84-86袁92
[收稿日期:2020l8l18]