在人们尚热烈地讨论以 Web Service 为基础的 SOA 的时候, 我介绍 WebSphere sMash 的文章引来了一些关于 REST 和 SOA 的关系的讨论和疑问. 这里就对 REST 做一个介绍, 并且比较一下 REST 和 SOA.
REST 是 REpresentational State Transferring 的简称, 有很多翻译, 我比较喜欢的是 \"表述性状态转移\", 它是 Web 这种分布式计算系统的架构风格, 包括了一系列的设计原则和架构约束. 在这种分布式计算系统中, 应用由超媒体驱动, 这些超媒体构成资源, 分布各地, 每个资源都有自己的全局唯一标识 (URI), 在 Web 世界里, 也就是 URL. 这些资源由服务器提供, 由浏览器等应用使用. 为了保证系统的大规模分布(全球规模)和扩张的能力, 我们需要加入一些约束. 最主要的就是:
(1) 统一接口约束: 所有的资源, 都提供同样的接口, 以使得使用者无需理解不同资源的不同操作方法. 这一点跟 WS-* 的服务不同, 在基于 SOAP 的 Web 服务中, 每个服务都有自己独特的接口. 这种差别让 Web 系统的扩张能力更强.
(2) 无状态约束: 服务器不为客户保留状态信息, 所有的请求需要将相应的会话信息传回. 这让服务器可以更好地为更多的客户服务, 因为在 Web 上, 每一台服务器都潜在地为全球的人们所访问
(3) 缓存约束: 允许客户端和中间代理(与网关) 缓存来自服务器, 被标识为可缓存的响应内容. 这大大地改善了服务器和整个网络的性能和可扩展能力.
在 REST 中, 资源 (resource) 和资源表述 (resource representation) 是很重要的概念. 资源的表述, 就是对资源的某个状态的数据描述, 可以是 HTML, XML, JSON 或者其他的 MIME 类型. 举个例子, 当浏览器请求一个网页(比如
www.google.com) 的时候, 它发出 HTTP GET 请求到某个服务器的资源, 服务器返回 HTML, 这个 HTML 就代表了此时这个资源的状态, 而它到达客户的时候, 会引起客户从前一个资源的状态转移到这个新的状态. 这就是 REST 被成为 \"表述性状态转移\" 的由来. 我们可以将 Web 系统中数据和能力, 看做 \"以资源为中心, 满足 REST 架构约束的 Web Service (Web 服务)\".
这种架构风格, 遵循着 SOA 架构风格的约束, 包括松散耦合, 关注点分离, 单一实现, 无状态等等. 不过 REST, 主要侧重和应用在互联网和 Web 这个特定的分布式系统领域, 而 SOA 作为一种分布式计算的架构风格, 有很多不同的实例, 从传统的 CORBA, 到今天以 Web Service 为主要基础的 SOA, 也就是大家今天讨论很多的 SOA, 我更愿意称之为 Web Service SOA, 或者 WS-* SOA. 伴随着 SCA/SDO 的出现, 新的元素和概念正在加入 SOA. 因此, 基于 REST 的 Web 系统, 也是基于 SOA 的实现形式, 我们可以称为 RESTful SOA.
在 WS-* 为基础的 SOA 中, 服务是以操作为中心的, 每个服务有一些操作, 每个操作接受 XML 文档为输入, 提供 XML 文档为输出. 从哲学上讲, 它们是 RPC 风格的. 在这个世界中, 系统的数据和能力以这些接口为基础来定义, 而这些接口的稳定, 和良好的建模变得极为重要, 否则这些系统的演变, 将变得异常的困难. 而在 REST 为基础的系统中, 服务是以面向资源的, 每个资源的操作都是统一的. 在 WS-* 中, 理解一个服务, 需要同时理解接口动作, 和这个动作所需要的输入和输出, 也就是操作契约和数据契约的一对耦合, 在 REST 中, 需要理解的只是数据契约, 也就是一个资源的状态表述 (Representation), 因此 RESTful SOA 中的服务, 其使用要简单一些, 整个系统的扩展能力要强一些.
伴随着 Web 2.0 的演进, 在继续提供 HTML 资源之余, 越来越多的网站开始提供以 XML, JSON, RSS Feed, 或者 ATOM Feed 等格式来表述的资源, 这就让整个 Web 逐渐地转化为一个机器可以理解, 可以编程的平台, 人们能够将来自 Web 世界不同地方的资源聚合, 转换, 变成满足各种新需求的数据或者服务, 让 Web 更快, 更好地增值, 更大程度地满足我们的需要. 这种最佳实践的发展, 已渐成潮流, 我们不妨称之为 RESTful SOA, 或者 Web SOA. 也有人称之为 Web Oriented Architecture.
面对这样一个发展, 有人很担心, 说这是一个倒退, 将来安全成问题等等. 我觉得不必要, 它不过是今天 Web 的自然演变, 确实有不少问题, 但是不需要夸张到否定它. 它跟 WS-* SOA 是相互补充的, 所适用的领域, 需要的技能, 服务概念背后的哲学, 其实都各有不同. 就如同编程世界, 有的时候, 一个问题跟需要从数据的角度出发, 有的时候, 更适合从操作和过程出发. 世界很多样, 不必一律.
伴随 Web 的快速演进成为一个应用和服务的 Web, 基于 REST 设计和实现的简单性, 基于它基于几个发展越来越成熟的核心 Web 标准, 我对 REST 为基础的 SOA 实践很有信心. 它将变成一个我们企业信息化的一个重要架构实践领域.
后面的文章将讨论 IBM 的 WebSphere sMash (也就是 Project Zero) 如何支持 RESTful SOA 的编程模型, 让人们可以快捷简易地开发 REST 风格的 SOA 应用和解决方案.
IBM 的软件产品不仅仅全面支持 WS-* SOA, 也全面支持 Web 2.0 和 RESTful SOA, 和这两种 SOA 的融合. IBM 的 5 大品牌, 即 WebSphere, InformationManagement, Lotus, Rational 和 Tivoli 在 Web 2.0 方面都有很大的投资, 和很好的创新.我也将介绍这些新产品, 或者产品的新特性, 来展示我们的产品是如何将 SOA 和 Web 2.0 良好地结合在一起的.