Architecting Cloud-Aware Applications
** ODCA(Open Data Center Alliance)最佳实践 **
MagicBowen(e.bowen.wang@icloud.com) 翻译
简介
为了更有效的利用云计算的潜力,企业必须从根本上改变开发和运维的方式。在这种新的计算模式上采用新的开发方式才能更好地获得云计算全方位的好处。在云计算下,应用程序的构建、运行和消费方式都和以往大大不同,这些不同导致需要新的思考模式以及掌握新的设计模式才能取得最好的结果,这些技术和传统解决问题时的权衡方式有所不同。
本文档为专注于应用架构和开发实践的开发人员提供了一个视角:从多个层面构建可以充分发挥云计算的独特能力的应用程序体系架构。
为了更有效的过渡到云计算,开发者需要:
- 了解基于云计算的新的设计范式,区别云和传统的计算平台在软硬件上存在的基本差异。
- 熟悉和使用能够构建更好的云应用的软件设计模式。
- 发展和完善技能,针对云计算的范式进行转型。
摘要
为了跟上日益普及的云计算,开发人员必须在开发基于云计算的应用架构时考虑云的基本特征。虽然开发人员很容易地将原来的分布式软件迁移到云上,但是这种从物理到虚拟化(physical-to-virtual,P2V)的简单移植并不能发挥出云计算的独特能力。使用明确为云环境所设计的设计模式,可以让软件保持高水平的可靠性、安全性和弹性。
本文为开发人员所写:
- 总结了云计算应用程序体系架构的基本原理;
- 介绍了云计算应用程序的结构原则;
- 提出了一些已经被证明有效的云计算架构的设计模式;
- 提出了云计算应用程序的关键运维原则,通过云应用成熟度模型帮助企业进行云应用的演进。
开发人员、架构师、CTO、CIO等都可以从本文介绍的云应用开发技术中受益!
目标读者
本文主要贡献给软件开发社区,同时为任何在云上构架、设计、实施、部署和运维服务的人员提供有价值的信息。
目标受众有:
- 参与设计、开发和部署云应用程序的软件开发者;
- 为企业进行云应用设计和部署的企业决策者;
- 负责规划、运营和采购的企业IT组织;
- 致力于提高云平台互操作API和云计算相关的标准和指南的标准组织;
术语
在本文档中,“云应用程序(cloud application)”这个词指的是一组在云中托管的组件(components)的集合,这些组件连通着一些在设备或者浏览器中运行的客户端应用(client app)。例如,一个用户可能使用iPad中的视频播放器观看电影,这依赖于在云中运行的身份验证、授权、媒体流、媒体存储、缓存和其它服务组件,总的来说这些构成了一个完整的“云应用程序”。但是本文只关注于托管在云端的组件部分。
应用程序架构的演进
随着计算机硬件、网络以及设备从个人电脑到智能手机的变化,应用程序架构也随之演进。云计算是最近的改变应用程序架构演进的力量。要了解云计算如何改变软件架构,需要看看在传统的非云环境中软件架构是什么样子的。
分层体系架构
分层体系架构(见下图)将应用程序的功能分布在不同的层中。例如,在三层架构中:
- 表示层提供用户接口;
- 中间层处理从客户端过来的用户请求,完成应用的商业逻辑;
- 数据层提供应用的数据存储;
电子邮件就是典型的三层架构。这种类型的应用包含一个表示层客户端,例如运行在PC上的Outlook,一个中间层的消息服务器(Exchange Server),以及一个后端信息存储。中间层以API的形式对外提供服务。客户端使用这些API和中间层通讯,基于一个应用协议,如互联网信息访问协议(IMAP)。中间层往往与多个后端服务进行交互。在电子邮件系统中,中间层可能与后端的目录服务、消息存储、消息转发代理等等进行集成。
分层体系架构中的每一个组件通常都运行在各自独立的服务器上,层之间通过静态配置其依赖的服务器主机名来进行互通。这种分层架构往往比单体架构(monolithic architecture:即不做分层,把整个应用构建在一起)有更多的优势。分层架构中每一个组件都可以独立运行并且层之间可以提供负载均衡以便获得更好的性能和可靠性。因为中间层通过网络API的方式进行访问,所以多个客户端可以共享一个中间层服务器。每个层都可以独立开发,只要接口和数据保持兼容。
在多层架构中,服务的部署是静态的。层之间的依赖通过上电时的配置文件进行描述。例如:一个邮件客户端通过配置文件知道邮件服务器的主机名和IP,客户端无法动态发现离自己最近的邮件服务器,它必须通过已知的主机名直接连接到服务器。
多数的web应用都是分层体系架构的例子。一个网络服务器向用户的网页浏览器分发应用代码和内容,用户侧使用JavaScript代码为用户提供交互式体验。中间层的服务器上往往运行Java、Ruby on Rails或者PHP等代码为前端用户交付动态内容,反过来中间层需要与后端的数据库服务进行通信。
基于虚拟化环境的分层体系架构
许多企业已经将他们的应用迁移到自己的数据中心的虚拟化基础设施上。在虚拟化环境中,应用组件是部署在虚拟机上而非传统的物理硬件上。虚拟化可以让计算资源更有效的被利用,通过自动化手段减少资源供应时间和成本,从而提高效率。
在虚拟化环境中,应用的部署和配置和其在物理数据中心是相同的,例如都是通过静态配置来构建的。然而,虚拟化可以让应用程序更高效的扩展,因为新的应用组件实例可以按需创建和配置。这种动态性可以通过基于虚拟化的负载均衡和虚拟IP(VIPs)来实现。分层架构中的每一层都可以独立的进行扩展,而对其它层是透明的。
云应用架构
为云创建应用程序时,开发人员可以不改变他们原来架构应用程序的方式。例如:一个开发人员可以简单地把一个分层架构的应用部署到云基础设施上,特别是使用基础设施即服务(IaaS),可以方便地把原来基于独立服务器的应用组件直接移植到对应的虚机(VM)上。然而,这种P2V的方式,并不能很好的让应用程序发挥云的独特功能。传统分层架构,通常和特定的基础设施位置,例如服务器名称、IP地址、以及网络服务配置等强耦合。这种方式使得它基本难以在云上进行快速的多虚机或多实例自动扩展。为了更有效的发挥云的全方位能力,开发人员必须在架构设计的时候全面考虑云环境特点,包括弹性、自服务、和多租户等。下图对别了传统的分层架构和基于云架构应用的差异。
一般情况下,使用云平台的应用程序需要满足分布式系统的约束要求。Peter Deutsch在1994年描述了开发人员在开发分布式系统时经常犯的8大谬误。这些谬误适用于跨网络的分布式服务系统,包括今天的云架构应用。针对这些谬误,Peter Deutsch提出了一些构建分布式系统的原则和最佳实践,这些最佳实践可以有效指导如何进行基于云架构特点的应用架构设计。