用于构建 RESTful Web 服务的多层架构

做者:Bruce Sun, Java 架构师, IBMhtml

出处:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/前端


用于构建 RESTful Web 服务的多层架构

简介java

现代 Web 应用程序必须提供桌面风格(desktop-like)的富浏览器界面,对外部客户端应用程序使用 Asynchronous JavaScript and XML (Ajax),或者 Google Web Toolkit (GWT) 以及 RESTful Web 服务。本文建议对 Ajax/GWT 使用 Resource Request Handler (RRH) 并从外部客户端应用程序中调用,以及使用一个 Browser Request Handler (BRH) 处理浏览器的请求,生成可在浏览器中显示的输出。两个处理程序共享一个通用 Business Logic Layer,并与 Data Access Layer 交互。RRH 和 BRH 的抽象简化了设计并帮助简化代码重用,产生更加灵活和可扩展的架构。web

什么是 REST?数据库

REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,好比 web 应用程序。它首次出如今 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。REST 指的是一组架构约束条件和原则。知足这些约束条件和原则的应用程序或设计就是 RESTful。编程

Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每一个请求都必须包含理解请求所必需的信息。若是服务器在请求之间的任什么时候间点重启,客户端不会获得通知。此外,无状态请求能够由任何可用服务器回答,这十分适合云计算之类的环境。客户端能够缓存数据以改进性能。设计模式

在服务器端,应用程序状态和功能能够分为各类资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每一个资源都使用 URI (Universal Resource Identifier) 获得一个唯一的地址。全部资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,好比 GETPUTPOST  DELETE。Hypermedia 是应用程序状态的引擎,资源表示经过超连接互联。浏览器

另外一个重要的 REST 原则是分层系统,这表示组件没法了解它与之交互的中间层之外的组件。经过将系统知识限制在单个层,能够限制整个系统的复杂性,促进了底层的独立性。缓存

当 REST 架构的约束条件做为一个总体应用时,将生成一个能够扩展到大量客户端的应用程序。它还下降了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST 简化了客户端和服务器的实现。

RESTful Web 服务与 RPC 样式的 Web 服务

最近,使用 RPC 样式架构构建的基于 SOAP 的 Web 服务成为实现 SOA 最经常使用的方法。RPC 样式的 Web 服务客户端将一个装满数据的信封(包括方法和参数信息)经过 HTTP 发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并做为响应发回客户端。客户端收到响应并打开信封。每一个对象都有本身独特的方法以及仅公开一个 URI 的 RPC 样式 Web 服务,URI 表示单个端点。它忽略 HTTP 的大部分特性且仅支持 POST 方法。

因为轻量级以及经过 HTTP 直接传输数据的特性,Web 服务的 RESTful 方法已经成为最多见的替代方法。可使用各类语言(好比 Java 程序、Perl、Ruby、Python、PHP 和 Javascript[包括 Ajax])实现客户端。RESTful Web 服务一般能够经过自动客户端或表明用户的应用程序访问。可是,这种服务的简便性让用户可以与之直接交互,使用它们的 Web 浏览器构建一个 GET URL 并读取返回的内容。

在 REST 样式的 Web 服务中,每一个资源都有一个地址。资源自己都是方法调用的目标,方法列表对全部资源都是同样的。这些方法都是标准方法,包括 HTTP GET、POST、PUT、DELETE,还可能包括 HEADER  OPTIONS

在 RPC 样式的架构中,关注点在于方法,而在 REST 样式的架构中,关注点在于资源 —— 将使用标准方法检索并操做信息片断(使用表示的形式)。资源表示形式在表示形式中使用超连接互联。

Leonard Richardson 和 Sam Ruby 在他们的著做 RESTful Web Services 中引入了术语 REST-RPC 混合架构。REST-RPC 混合 Web 服务不使用信封包装方法、参数和数据,而是直接经过 HTTP 传输数据,这与 REST 样式的 Web 服务是相似的。可是它不使用标准的 HTTP 方法操做资源。它在 HTTP 请求的 URI 部分存储方法信息。好几个知名的 Web 服务,好比 Yahoo 的 Flickr API 和 del.icio.us API 都使用这种混合架构。

RESTful Web 服务的 Java 框架

有两个 Java 框架能够帮助构建 RESTful Web 服务。erome Louvel 和 Dave Pawson 开发的 Restlet(见 参考资料)是轻量级的。它实现针对各类 RESTful 系统的资源、表示、链接器和媒体类型之类的概念,包括 Web 服务。在 Restlet 框架中,客户端和服务器都是组件。组件经过链接器互相通讯。该框架最重要的类是抽象类 Uniform 及其具体的子类 Restlet,该类的子类是专用类,好比ApplicationFilterFinderRouter  Route。这些子类可以一块儿处理验证、过滤、安全、数据转换以及将传入请求路由到相应资源等操做。Resource 类生成客户端的表示形式。

JSR-311(见 参考资料)是 Sun Microsystems 的规范,能够为开发 RESTful Web 服务定义一组 Java API。Jersey(见 参考资料)是对 JSR-311 的参考实现。

JSR-311 提供一组注释,相关类和接口均可以用来将 Java 对象做为 Web 资源展现。该规范假定 HTTP 是底层网络协议。它使用注释提供 URI 和相应资源类之间的清晰映射,以及 HTTP 方法与 Java 对象方法之间的映射。API 支持普遍的 HTTP 实体内容类型,包括 HTML、XML、JSON、GIF、JPG 等。它还将提供所需的插件功能,以容许使用标准方法经过应用程序添加其余类型。

构建 RESTful Web 服务的多层架构

RESTful Web 服务和动态 Web 应用程序在许多方面都是相似的。有时它们提供相同或很是相似的数据和函数,尽管客户端的种类不一样。例如,在线电子商务分类网站为用户提供一个浏览器界面,用于搜索、查看和订购产品。若是还提供 Web 服务供公司、零售商甚至我的可以自动订购产品,它将很是有用。与大部分动态 Web 应用程序同样,Web 服务能够从多层架构的关注点分离中受益。业务逻辑和数据能够由自动客户端和 GUI 客户端共享。唯一的不一样点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各类类型的数据存储提供插件能力。

图 1 展现了自动化客户端,包括 Java 和各类语言编写的脚本,这些语言包括 Python、Perl、Ruby、PHP 或命令行工具,好比 curl。在浏览器中运行且做为 RESTful Web 服务消费者运行的 Ajax、Flash、JavaFX、GWT、博客和 wiki 都属于此列,由于它们都表明用户以自动化样式运行。自动化 Web 服务客户端在 Web 层向 Resource Request Handler 发送 HTTP 响应。客户端的无状态请求在头部包含方法信息,即 POSTGETPUT  DELETE,这又将映射到 Resource Request Handler 中资源的相应操做。每一个请求都包含全部必需的信息,包括 Resource Request Handler 用来处理请求的凭据。


图 1. 多层 Web 应用程序环境图
多层应用程序环境图 

从 Web 服务客户端收到请求以后,Resource Request Handler 从业务逻辑层请求服务。Resource Request Handler 肯定全部概念性的实体,系统将这些实体做为资源公开,并为每一个资源分配一个唯一的 URI。可是,概念性的实体在该层是不存在的。它们存在于业务逻辑层。可使用 Jersey 或其余框架(好比 Restlet)实现 Resource Request Handler,它应该是轻量级的,将大量职责工做委托给业务层。

Ajax 和 RESTful Web 服务本质上是互为补充的。它们均可以利用大量 Web 技术和标准,好比 HTML、JavaScript、浏览器对象、XML/JSON 和 HTTP。固然也不须要购买、安装或配置任何主要组件来支持 Ajax 前端和 RESTful Web 服务之间的交互。RESTful Web 服务为 Ajax 提供了很是简单的 API 来处理服务器上资源之间的交互。

图 1 中的 Web 浏览器客户端做为 GUI 的前端,使用表示层中的 Browser Request Handler 生成的 HTML 提供显示功能。Browser Requester Handler 可使用 MVC 模型(JSF、Struts 或 Spring 都是 Java 的例子)。它从浏览器接受请求,从业务逻辑层请求服务,生成表示并对浏览器作出响应。表示供用户在浏览器中显示使用。表示不只包含内容,还包含显示的属性,好比 HTML 和 CSS。

业务规则能够集中到业务逻辑层,该层充当表示层和数据访问层之间的数据交换的中间层。数据以域对象或值对象的形式提供给表示层。从业务逻辑层中解耦 Browser Request Handler 和 Resource Request Handler 有助于促进代码重用,并能实现灵活和可扩展的架构。此外,因为未来可使用新的 REST 和 MVC 框架,实现它们变得更加容易,无需重写业务逻辑层。

数据访问层提供与数据存储层的交互,可使用 DAO 设计模式或者对象-关系映射解决方案(如 Hibernate、OJB 或 iBATIS)实现。做为替代方案,业务层和数据访问层中的组件能够实现为 EJB 组件,并取得 EJB 容器的支持,该容器能够为组件生命周期提供便利,管理持久性、事务和资源配置。可是,这须要一个听从 Java EE 的应用服务器(好比 JBoss),而且可能没法处理 Tomcat。该层的做用在于针对不一样的数据存储技术,从业务逻辑中分离数据访问代码。数据访问层还能够做为链接其余系统的集成点,能够成为其余 Web 服务的客户端。

数据存储层包括数据库系统、LDAP 服务器、文件系统和企业信息系统(包括遗留系统、事务处理系统和企业资源规划系统)。使用该架构,您能够开始看到 RESTful Web 服务的力量,它能够灵活地成为任何企业数据存储的统一 API,从而向以用户为中心的 Web 应用程序公开垂直数据,并自动化批量报告脚本。

结束语

REST 描述了一个架构样式的互联系统(如 Web 应用程序)。REST 约束条件做为一个总体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。因为它简便、轻量级以及经过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SOAP 服务的一个最有前途的替代方案。用于 web 服务和动态 Web 应用程序的多层架构能够实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax 和 RESTful Web 服务本质上是互为补充的。开发人员能够轻松使用 Ajax 和 RESTful Web 服务一块儿建立丰富的界面。

本文是一篇率先演示如何使用文中介绍的多层架构构建 RESTful Web 服务和动态 Web 应用程序的文章。它提供了 REST Web 服务、Ajax 和 Spring Web Flow 如何一块儿生成类桌面富 Web 界面的示例。该教程使用 Jersey、Spring、MySQL 和 Tomcat。它在 Eclipse 中配置和实现。

根据与 the University Corporation for Atmospheric Research 的联合协议,National Science Foundation 的研究为本文提供了依据。National Center for Atmospheric Research 由 National Science Foundation 发起。此外,我还要感谢来自 NCAR 的 Markus Stobbs,他提供了不少好建议并负责编辑了本文。


参考资料

学习

得到产品和技术

相关文章
相关标签/搜索