架构概述
在 J2EE 应用程序中,Java API 或服务公开为 Stateless Session Bean API(Session Façade 模式) 或 SOAP web 服务。在这些服务与使用非 Java 技术 (如 .net 或 PHP)的客户端应用程序集成时,处理 SOAP Web 服务将变得非常麻烦,还涉及到大量的开发工作。
这里提到的方法通常用于有很多服务、服务可以重复使用,但使用 SOAP 创建快速集成障碍的互操作性和开发成本很大的组织,帮助它们进行服务集成。此外,在内部治理组织不会在企业 ESB 或 EAI 上公开服务的情况下,很难以点到点的方式集成两种不同的技术服务。
例如,在电信 IT 环境中:
- 将一个 SMS 发送到特定圆的 SMSC,公开为 SOAP web 服务或 EJB API;或
- 在 CRM 应用程序中创建服务请求,使用 MQ 或 JMS 绑定通过 ESB 公开为一个数据库存储的过程 (如 Oracle CRM);或者
- 创建 Sales Order(销售订单)请求,用于使用 SMSGateway 的移动 SMS 的 Distributor。
如果以上服务是由一个非 Java 应用程序使用的,那么使用 SOAP web 服务的集成会很麻烦,并需要更多的开发工作。
这种新方法可以用一种框架的形式实现,使它可以在 Java 服务公开为一种类 REST 的资源的其他领域中重新使用。这种方法类似于 Struts 框架方法,由以下组件组成(如下图所示):
图 1. 架构概述
该架构包括 Front Controller,作为接收请求并向客户端提供响应的中心点。Front Controller 将请求处理委托给包含此框架处理逻辑的 ActionController。ActionController 执行验证,将请求映射到相应的 Action,并调用生成响应的动作。为请求处理、日志记录和异常处理这些可以被单个 Action 以及 ActionController 使用的动作提供了各种 Helper Service。
框架组件
下图展示了框架的各个组件以及彼此之间如何相互关联。
图 2. 框架组件
各种组件描述如下:
服务客户端
这是一个需要调用服务的客户端应用程序。此组件可以是基于 Java 的,也可以是任何其他客户端,只要它能够支持 HTTP 方法
通用组件
这些都是日志记录、 异常处理和任何常见功能所需的实用程序服务或者实现所需的常量。在示例代码中使用 Apache Commons 日志记录和 Log4j 实现。
RESTServiceServlet
框架使用 Front Controller 模式进行集中请求处理,并使用此 Java Servlet 组件处理输入的请求。它支持常见的 HTTP 方法,如 GET、PUT、POST 和 DELETE。
RESTActionController
此组件是核心框架控制器,管理加载服务和框架配置的核心功能,验证请求,映射请求与配置 REST 动作并执行动作。
RESTConfiguration
该组件负责在运行时加载和缓存框架配置,以及各种 REST 服务配置。此组件供 RESTActionController 用于确定请求要调用的正确动作,并验证输入请求。
RESTMapping
此组件存储在配置文件中指定的 REST 动作映射。映射主要包括客户端调用的 URI 和进行处理的动作类。
ActionContext
此组件封装执行 REST 动作所需的所有功能。它可以帮助开发人员提供请求和响应处理功能,因此开发人员只需要编写实际的业务逻辑实现代码。它向动作组件隐藏协议特定的请求和响应对象,因此允许独立测试 POJO 之类。它还提供一个指向 XML Binding Service 的句柄,让 Java 业务对象可以基于配置的 XML Binding API 方便地转换为 XML,反之亦然。RESTActionController 动态配置此组件,并将其提供给 Action 组件。
XMLBinding
此组件封装 Java XML Binding 机制,提供了一个统一的界面用于将 Java 业务对象转换为 XML,反之亦然。通过实现标准的框架接口,它支持任何 XML 绑定机制,如 JAXB、SDO、Castor 等。默认情况下,它为 XMLEncoder 和 XMLDecoder 提供了开箱即用功能。
Configuration XML
此组件包含框架和服务配置。当开发 REST 服务时,它们可以加入服务配置文件中。框架配置包含日志记录和 XML Binding 服务,不需要定期更换。
处理典型 POST 请求的这些组件之间的交互如下所示:
图 3. 组件交互
如上图所示,REST 服务配置最初加载,并缓存到 RESTConfiguration 组件中。对于 REST 服务的每个 HTTP 请求,RESTServiceServlet 组件将请求委托到 RESTActionController,它又会检索相应的映射、验证请求、创建 ActionContext 组件以及路径和查询输入,并调用 Action 类 (例如,createUserAction)。Action 类调用后端 Java 业务服务进行处理。
让所有组件运作起来
本节介绍了这篇文章提供的框架的示例实现。它展示了类关系图、各种配置文件和显示如何将上述设计付诸实行的代码片段。
注意: 示例代码可能没有遵循所有 Java 编码的最佳做法,因为它只是一个示例。
示例实现
下图显示了示例实现中的类。蓝色所示的类是框架外部的类,将它们放在这里是为了展示与框架的结构关系。