APP下载

基于GAE和Azure云平台的可移植性研究

2016-06-17张嘉超

计算机时代 2016年6期

张嘉超

摘 要: 云服务商要提升云服务,最好的方法是提供云平台之间的移植性。在各种各样的编程语言和开发框架中,选择合适的移植性开发环境是必要的。文章提供了可移植性开发环境的分析方法,提供了一个GAE和Azure之间的中间层解决方案,同时还提供了针对中间层的编程测试。

关键词: 平台即服务; 可移植性; 谷歌互联网应用服务引擎(GAE); 微软云计算平台(Azure)

中图分类号:TP393.0 文献标志码:A 文章编号:1006-8228(2016)06-12-05

Abstract: To promote the cloud services, the best approach for cloud service providers is to realize the portability between the different cloud platforms. It is necessary to choose a suitable portability development environment in a variety of programming languages and development frameworks. This paper provides an approach to analyze the portability development environment, a middle-tier solution in between GAE and Azure, and the test of the middle-tier.

Key words: platform as a service; portability; GAE; Azure

0 引言

云计算是一种方便的模式,用户按需通过网络访问可配置的共享计算资源,(如网络,服务器,存储,应用程序和服务)。在云环境的架构中有三种服务模式。

⑴ IaaS(基础设施级服务):是位于底层的服务,提供给用户的服务是对所有计算基础设施的利用,用户能够部署和运行任意软件,包括操作系统和应用程序。

⑵ PaaS(平台级服务):是中间业务,提供给用户的服务是把客户开发的应用程序部署到供应商的云计算基础设施上去[1]。

⑶ SaaS(软件级服务):提供了完整的软件应用。提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问[2]。

然而,新技术总是有很多问题。由于没有统一的标准,不同厂商提供的云计算服务不能互操作和移植,这意味着开发人员需要在两个不同的平台上写两次相同的程序。

要解决解决云可移植性问题,本文采用的方法是提供一个应用程序,在两个不同的平台上建立一个抽象层。

要实现的目标是:在PaaS上让两个不同的PaaS厂商之间的应用程序可移植。本文采用GAE(谷歌应用程序引擎)和微软Azure,使开发人员可以在两个PaaS之间迁移基于Python的应用程序和数据存储器。

GAE(Google App Engine)是一个由谷歌公司在2008年创立的互联网应用服务引擎,它采用云计算技术、多服务器和数据中心来虚拟化应用。因此GAE可以看作web应用托管的平台[3]。

Azure是微软提出的基于云计算的操作系统,它的主要目标是提供一个平台,为开发者提供云服务器、数据中心、Web和PC应用程序[4]。

基于这两个开发环境的简单研究,本文选择的开发语言是GAE和Azure都支持的Python。

1 实现方法

1.1 Python Web框架的选择

目前市场上流行的Python Web框架,GAE和微软Azure同时支持的是Django、Flask和Bottle,本文将比较这三个Web框架的功能和性能。

1.1.1 功能介绍

Flask是用Python编写的一个轻量级Web应用程序框架。Flask被称为“微框架”,因为它使用简单的内核,通过扩展来添加其他功能,所以在大多数情况下,它只用来在一些小项目上使用一个或两个功能[4]。换句话说,它不适合中型和大型网站或应用程序。

Bottle是一个非常微妙的框架,它提供Python Web开发的基本支持:URL路由、请求/响应对象包、模板支撑和集成支持WSGI服务器。Bottle对小型Web开发更好,它可以根据项目的规模实现较小项目的快速开发[5]。然而,由于其功能有限,对于大型Web应用程序,bottle功能略显不足,需要人工干预。

Django是迄今为止基于Python最大的Web框架之一。它由一个庞大而活跃的社区支持。它配备了一个强大的后台管理界面,以及许多其他功能[6]。Django还提供了基于表格的模型、模板语言和完整的文档。

1.1.2 性能比较

对Django,flask,bottle性能进行测试,使用的操作系统是cenos6 64位,测试软件是siege,测试命令请求只返回一个字符串。测试结果见图1。

从测试结果可看出,纯框架的性能排序为:bottle>flask>Django。但是,当真正使用这些框架时,bottle需要的东西太多,随着开发复杂性的增加,性能会下降。

就比较结果进行可行性分析,该项目的目标是帮助Python程序员建立可以同时在谷歌App Engine和微软Azure上运行的网站或应用程序。Flask具有建立如博客和电子邮件的功能,但它是一个“微框架”,因此,当程序员要建立一个中等规模的网站或应用程序时,它缺乏可扩展的能力。

据长期不断的测试,Django虽然性能最差(因为Django框架很大),但开发人员使用起来十分方便。本文选择Django框架是因为它有完整的框架功能和可以接受的性能。

1.2 部署的方法

选定框架后,需要找到一种方法将其部署到GAE和微软Azure上。微软Azure很容易部署,因为微软Azure支持Django框架。要做的只是使用Visual Studio开发程序,并把它上传到微软Azure上。

对于GAE,需要导入一个适配器,即Django-nonrel,它可以使Django运行在非关系型数据库上,它支持MongoDB和GAE。

1.3 使用数据存储的方法

一旦应用程序可以在两个平台上运行时,接下来就要考虑如何连接数据存储。这里有三个选择,分别是GAE云存储、Azure存储和亚马逊简单存储服务(S3)。我选择S3为应用程序的数据存储,因为其拥有最大量的合作伙伴和ISV集成商,并且还具有强大的网络供应商和数据恢复能力[7]。

对于GAE和Azure连接S3的方式,我导入一个云平台无关的API,即Boto。Boto是一个用于AWS的Python接口,通过使用Boto,开发人员可以轻松地使用Python控制S3。

2 中间层的搭建

我为Python程序建立了整个中间层,这个中间层的功能是:

⑴ 通过使用中间层,Python开发人员可以不改变任何代码,就能把Django应用部署到GAE和微软的Azure上;

⑵ 开发人员可以使用亚马逊S3来存储数据。它包含大量的文件,后面会给出这些文件的解释和内容。

2.1 可移植性文件在程序层面的解释

该程序的根目录为myblog002,这个文件夹下包含两个文件夹,分别是myblog002、google app engine和一个叫myblog002.sln的文件。Google app engine中包含google app的软件开发包,myblog002.sln是项目文件,Visual Azure同样会使用到这个文件。当进入myblog002文件夹,会看到更多文件夹和文件。

他们可以分为三部分。

第一部分是项目和程序文件,包括myblog002、blog、manage.py。在manage.py中,可以看到环境变量路径,这里我使用myblog002.settings。

第二部分是Azure中间层,这部分有三个文件夹:bin、env、obj,五个文件:myblog002.pyprol、myblog002.splite,ptvs_virtualenv_proxy.py,web.config和web.debug.config。Bin文件夹存储程序代码,用于部署控制和组件,例如Azure Setup,microsoft python tool和FastCGI。Env文件夹包含项目中用到的所有环境。Obj文件夹用于在编程过程中生产的临时文件的存储,同时包含debug和release两个子目录,用于控制版本。以pyproj为后缀的脚本包含所有项目的配置。以splite为后缀的脚本用于存储sqlite3数据库。ptvs_virtualenv_proxy.py脚本用于读取WSGI指针,激活虚拟环境和日志错误。

web.config文件描述服务器如何处理请求。web.debug.config当你将应用程序发布到开发环境时,进行转换。所有的文件可以创建微软Azure需要的.NET框架。

第三部分包括除boto文件夹之外所有文件夹和文件,这些可以形成GAE中间层。这部分包括autoload、dbindexer、django、diangoappengine、djangotoolbox、templates六个文件夹。Autoload在处理任何请求之前,通过确保信号指针或序号的加载,来正确地安装diango项目。Dbindexer可以帮助开发人员在使用GAE时使用非关系型数据库。Django包含django库。Djangoappengine包含Django-nonrel的应用程序后端,如数据库和email后端。

Djangotoolbox是一个小的django工具集。可以使用非关系型数据库的Django后台,加载不必要的代码,并提供良好的编码规范和工具,这对你的代码有好的实际影响。这四个文件夹是GAE中间层的核心。Templates包含一些错误展示页,如404 error或505 error。

中间层的第三部分包含八个文件,分别是“urls.py”,“cron.yaml”,“build.sh”,“__init__.py”,“app.yaml”, “index.yaml”,“indexes.py”and“settings.py。Urls.py包含项目的所有url。cron.yaml重新索引那些由于新访问需要高频更新的任何文档。

build.sh被用来编译文件包中的所有资源。__init__.py使python处理包含程序包的目录,在模块搜索时避免被有相同名字的目录隐藏有效的模块。app.yaml指定URL如何对应于请求应用程序和静态文件。index.yaml和应用程序一起加载来创建数据库中的索引。indexes.py包含所有条目的字母索引。settings.py包含项目的所有环境变量。这些文件中最重要的是setting.py,它是GAE和Azure之间的链接。

对Python脚本的第一部分GAE和Azure的数据库设计,我使用splite数据库,并把数据库名字命名为myblog002.sqlite。

接下来,设置查找类来查找静态文件,通过加密保证其惟一性,通过模板加载器从多种资源中导出模板,中间类可同时用于GAE和Azure,根URL配置文件和WSGI应用程序。

在安装的app类中,我导入了应用程序和GAE中间层工具包。对于Google APP Engine,设置模板文本处理器,最后一件事是,指定默认的测试程序和日志文件。

2.2 可移植性数据库层面文件的解释

最后一个叫boto的文件夹是AWS S3的接口。要使用这个API,我们需要设置setting.py,导入boto包,设置AWS的用户名、密码和存储名称。

接下来,我们就可以在请求信息中使用boto API来连接AWS S3存储了。

3 可移植性的测试和分析

首先用python写一个简单的博客应用程序,然后把代码放到中间层上,最后把它发布到GAE和Azure上。

3.1 在Django上创建一个简单的博客应用程序

开发环境是MAC OS X,处理器是2.4GHZ Inter Corei5,内存是4GB 1600MHZ DDR3。

数据库同步结果见图3。

3.2 创建一个GAE和Azure之间的中间层

⑴ 首先,创建一个命名为myblog002的文件夹,把文件夹都放入其中,把名为myblog002.sln(可由Visual Studioc创建)的GAE SDK放到该文件夹。

⑵ 进入myblog002文件夹,下载5个django-nonrel文件,包括djangoappengine,autoload,dbindexer,django和djangotoolbox,把它们放到test2文件中,复制GAE可用的指定文件,包括template, _init_.py, cron.yaml, indexes.py,requirement.txt,urls.py,app.yaml,index.yaml, build.sh, and settings.py。

⑶ 接下来是添加Azure文件夹,包含3个文件夹:“bin”, “env” and “obj”,以及5个文件:“myblog002.pyprol”,“myblog002.sqlite”,“ptvs_virtualenv_proxy.py”,“web.config”and“web.debug.config”。

⑷ 这个步骤很重要,它用来改写setting.py。

3.3 GAE的测试

安装GAE,并把所有文件移动到GAE文件夹中,然后运行它,结果见图4。

现在,程序可以在GAE上运行。接下来,我们需要把程序部署到网络上。

3.4 Azure的测试

⑴ 把项目导入到Visual Studio2013。

⑵ 运行程序,运行结果见图5。

现在,程序可以通过Visual Studio运行。

⑶ 把程序发布到网络上。

3.5 GAE和Azure之间python的存储可移植性测试

在这部分,我选择亚马逊S3。因此,第一件事是注册账号,获得来自亚马逊的认证。之后,我们导入boto API,放到根目录。

我使用名为cw00376的存储,在存储中,我创建了名为blog的文件夹,准备把博客放入其中。

现在,当用户在博客中写东西时,文章的标题和内容会存储在S3存储中。

4 结束语

首先,这份报告调查了当今社会对云计算可移植性的研究,重点在两个不同的云平台供应商之间的PaaS层面的中间层上。其次,基于对谷歌App Engine和微软Azure的分析,本报告决定使用Python+Django+ AWS S3作为中间层接口。完成中间层开发之后,创建了一个简单的博客应用程序,用于测试中间层。

该项目成功地实现不同的PaaS平台之间的可移植性,证明了中间层的可行性,并提供了更深入的研究方法。在开发的过程中,使用编程语言Python,操作系统Linux,开发Web框架如Django,云平台和亚马逊Web服务和大量已经实现的API。

为进一步的研究和开发,从纵向看,很多具有功能性和可移植性的程序可以开发,如Blob存储,邮件和队列。该中间层可以尝试添加更多的API,用于安装更多类型的云服务。从横向看,中间层可以尝试添加更多的开发环境和更多的编程语言,例如PHP和Node.js等。

参考文献(References):

[1] 李露.GAE的技术发展及应用[J].科技创业月刊,2012.25(8):

192

[2] 王鹏.云计算的关键技术与应用实例[M].人民邮电出版社,

2009.

[3] 刘枫.基于Google云计算平台的Web应用系统设计及实现[D].

四川电子科技大学硕士学位论文,2011.

[4] 孙越.基于Windows Azure的教学资源平台建设[J].福建电

脑,2013.29(10):159

[5] 王昊.基于GAE云计算的Web应用与开发[D].南京邮电大学

硕士学位论文,2013.

[6] 张天珍.迁移应用到Windows Azure云计算平台[J].软件,

2013.34(2):144

[7] 卢朝辉.基于Windows Azure的大规模Web应用程序设计[J].

计算机技术与发展,2014.24(12):57