编者注:本文作者是Persistent Systems 的云计算助理副总裁Shreekanth Joshi,描述了该公司是如何使用Windows Azure为他们的ISV客户开发和交付基于Java的应用程序。
Persistent Systems是一家全球性的公司,专门从事软件产品和技术服务。我们专注于在下一代技术领域的四个主要领域开发最佳解决方案,它们是:云计算、移动性、BI及分析和协作。Persistent Systems很早就涉及云计算领域并且曾经和很多初创企业和创新型企业合作帮助开发和部署各种云计算应用程序。我们利用精心定制的产品工程流程为北美、欧洲和亚洲各地的300多个客户开发创新的解决方案。
在软件即服务(SaaS)能力和经验的基础上,我们为先进的云计算平台建立了专门的能力中心。作为Windows Azure社区的积极参与者,我们发布了开源的项目,包括:
- Windows Azure Plugin for Eclipse with Java
- OData SDK for PHP
- AppFabric SDKs for PHP、Java 和 Ruby
Persistent Systems最近推出一个新的开放源码项目,CloudNinja for Java,如下所述。
CloudNinja for Java
Windows Azure上基于Java的应用程序的数量在不断增长,因为客户意识到Windows Azure的开放性能够为他们的Java应用程序提供可扩展性和高可用性。我们从怎样设计各种项目组件来管理单租户和多租户应用程序到怎样使用Windows Azure服务整合项目组件的过程中遇到了很多问题。客户学习Windows Azure时面临的普遍问题是除.NET平台以外很少有详细的文章和代码示例。
Windows Azure通常被视为.NET云计算平台,实际上这是错误的。出现这种误解的原因是相关的演示和how-to博客都是围绕Microsoft Visual Studio来写的。事实证明,Windows Azure提供虚拟机,Windows Server 2008 SP2 或 Windows Server 2008 R2,也就是说大部分的基于Windows的可执行文件或脚本都可以运行在Windows Azure上。
要增加对Windows Azure开放性的认识,我们最近发布了基于Java的CloudNinja项目(CloudNinja for Java),该应用说明了如何为Windows Azure构建多租户应用程序。CloudNinja for Java包括以下的特性和功能:
- 租户寄宿
- 租户级自定义项(例如,管理徽标)
- 每个租户的数据隔离
- 每个租户计量
- 通过不同标示提供程序提供登录支持。例如Yahoo!、Google和Windows Live ID
- 一般拥堵任务计划程序
此应用程序是建立在几个常见的开源软件库中,例如Spring、 Hibernate、Log4j和jqPlot。
该项目运行在Windows Azure里并且完全基于Java的Windows Azure Plugin for Eclipse。下图描绘了CloudNinja的体系结构。
我们在CloudNinja for Java的开发和部署过程中利用各种Windows Azure服务。下面是主要用到的几个:
- Windows Azure Access Control Service
- Windows Azure Storage
- SQL Azure
- Windows Azure Service Management
我们相信CloudNinja for Java将对Java社区有用并将鼓励Java开发人员创建自己的Windows Azure应用程序。
当部署Windows Azure的Java应用程序时,有几个注意事项:
- 部署中是否要捆绑第三方工具和运行时
- 监测应用程序
- 处理缺失的SDK功能
部署中是否要捆绑第三方工具和运行时
Windows Azure plugin for Eclipse结合Java应用程序,与Windows Azure项目一起被放到一个包中,上传并部署到Windows Azure。Windows Azure项目包括负责设置Java环境和启动应用程序的启动脚本,包括:
- Web Server设置(该例使用Apache Tomcat)
- JRE设置
- WAR文件部署
- 环境变量配置
当启动一个Windows Azure虚拟机实例时需要设置环境。通过启动脚本来完成这一点。因为Tomcat和JRE不是Windows Server VM影像的一部分,我们需要自己提供这些。在Windows Azure部署包中引入这些东西很简单。不过,Tomcat和JRE添加项导致包大小增长70MB,是运行时应用程序部署的两倍。有几个问题:
- 将部署包上传到Windows Azure时间较长。
- 如果我们想要更新Tomcat 或 JRE 的版本就必须要重新部署整个包。
我们不需要在部署包中包含Tomcat和JRE。为了避免上面提到的问题,我们将运行时存储在Windows Azure Blob存储里。启动脚本从Blob存储中下载Apache Tomcat 和 JRE,然后启动Apache Tomcat。从Windows Azure Blob存储中下载东西到虚拟机存储速度极快,因为我们的虚拟机和存储账户被放在同一个数据中心中。此类Java应用程序的包大小随着Apache Tomcat和可安装JRE的大小的减小而变小。
在将我们的部署升级到最新的Tomcat和JRE的同时,需要将新版本复制到Blob存储。然后,使用Windows Azure门户将所有托管应用程序的虚拟机实例重新映像,这样我们的应用程序就运行着最新版本的Tomcat/JRE了而不需要重新部署我们的任何代码!
检测应用程序
Windows Azure提供一个诊断监视器,能够捕获性能计数器、事件日志、文件目录、Windows Azure基础设施日志和崩溃转储。Java版的Windows Azure项目默认情况下不提供诊断信息配置。我们为CloudNinja for Java创建了一个独立的实用程序,设置我们想要观察数据(主要是CPU利用率)的特定的性能计数器。
我们还需要观察Tomcat访问日志和存储分析日志来为每个租户生成使用情况统计信息。为了捕获Tomcat日志,我们配置Windows Azure Diagnostics来监控Tomcat存储其访问日志文件的目录中的文件。诊断监控将访问日志推送到blob,后面可以从worker进程中访问它们。这样很好,因为我们能为Tomcat的每个运行实例访问日志。由于这些文件被存储在Windows Azure存储中,也很容易从外部程序访问它们,所以一旦出现异常可以手动检查日志文件。
检测blob存储时情况又有点不同。在CloudNinja for Java项目中,我们将租户徽标存储在blob存储中。在html输出中有图像标记直接指向这些徽标而不用穿过Apache Tomcat服务端。为了捕获这些blob访问和相关带宽,Windows Azure提供存储分析。分析有两种类型:Logging, 提供每次blob访问的详细统计资料;metering,提供每小时的汇总信息。默认情况下禁用分析。CloudNinja for Java项目中我们启用了Windows Azure存储账户日志记录。这些日志提供时间戳、源IP、blob访问和结果状态(访问成功或失败)。存储分析是Windows Azure的一个特色特性,它对CloudNinja for Java这样的需要捕获租户级存储使用情况信息的多租户应用程序尤其有用。
在调试的时候,日志记录不一定就够了。我们启用远程访问,允许开发人员连接到托管应用程序的虚拟机。通过Windows Azure门户网站,我们可以打开远程访问连接到任何正在运行的实例。
处理缺失的SDK功能
Windows Azure SDK for Java中,一些Windows Azure功能尚未提供。我们依赖的一个功能是访问控制服务(ACS)。我们想要在CloudNinja for Java中使用ACS来允许租户使用一种身份提供程序登录,例如Google、Yahoo!和Live ID。
事实证明,ACS具有完整的基于REST的管理接口。在REST 库 (Restlet)的帮助下,我们能将ACS构建到CloudNinja for Java中。同样的技术也可以被Windows Azure中其他任何基于REST的功能所使用。庆幸的是,Windows Azure SDK for Java涵盖了不少:
- Service Runtime
- Storage (blobs、 queues和tables)
- Service Bus
总结
对Persistent Systems 来说Windows Azure是一门核心技术,我们将继续为客户创建基于Java的解决方案。我们成功地在Java应用程序中使用Windows Azure的几乎每个功能,而不需要写.NET代码。CloudNinja for Java项目很好地证明了这一点。例如,我们整合了ACS管理服务,即使是微软的Windows Azure SDK for Java没有API支持此服务。我们可以成功地利用基于REST的API创建与ACS管理服务交互的依赖方应用程序。这种基于REST的方法确实为使用任何一种语言开发Windows Azure应用程序提供了机会。
我们鼓励Java社区参考CloundNinja for Java构建Windows Azure的多租户应用程序。
阅读Persistent Systems博客上的博客文章“介绍CloudNinja for Java”以了解更多信息。