首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区
|
基于Spring实现远程服务编程
一.引言
从根本上分析,Remoting实际上是一种企业分布式计算的组件。在同一服务器(Java虚拟机)内进行调用的服务(或类)并不需要把自己暴露为一种远程服务;但是,如果你需要与一个外部程序(在不同的服务器上或在一个不同的组织中)进行通讯的话,那么,必须把它实现为一个远程服务。Spring框架为把业务类暴露为远程服务提供了一种独特而灵活的方式。 Spring Remoting架构的核心是服务对象,这些对象其实是一些POJO,也称作Spring bean。Spring框架能够把这些服务对象与基础结构细节(例如它们暴露为远程服务的方式)隔离开来;这样以来,开发者就可以专注于实现服务对象的业务接口而不是牵涉到这些细节中去。 这个Remoting模型提供了对业务服务的远程抽象。它负责编排和反编排方法参数并且还负责处理服务方法中抛出的任何异常—使用未检查的RemoteAccessException异常对它们进行包装。为了实现各种服务,Spring使用了若干设计模式。例如,它使用代理设计模式把你对HTTP POST请求的调用翻译成指向输出服务的URL。 本文将着重探讨如何使用Spring实现一个远程服务。也就是说,要展示使用Spring Remoting API把一个普通Java对象(POJO)转化成一个远程服务;这样以来,外部程序就可以从其业务实现中调用该服务。该演示使用一个示例贷款处理应用程序把一个业务服务实现为一个远程HTTP服务并且从一个测试客户端调用该类中的业务方法。 二.Spring Remoting工作机制 在本节中,让我们更为细致地分析Spring的Remoting工作机制。要把一个普通的Java类实现为一个远程服务,需要提供如下一些内容: 1.远程服务输出器(exporter)—这些类用于创建为客户端程序所调用的远程服务端点。服务导出器还管理任何用来查询远程服务的注册表。 该技术依赖于RMI Invoker的基础结构,但是使用HTTP作为传输协议。 在客户端方面,Spring HTTP Invoker提供两种类型的客户端:Java SE提供的标准API和Commons HttpClient API。默认情况下,它使用的是HttpClient。 接下来,让我们看一下Spring框架所支持的远程(Remoting)技术。 Spring框架支持的远程技术列举 Spring框架支持多种Remoting技术。下面,我们来对它们作逐一简单介绍。 ①远程方法调用(RMI) Spring以两种方式支持RMI:传统型RMI和使用RMI Invoker的远程技术。 ②Hessian ③Burlap ④HTTP Invoker ⑤EJB ⑥Java消息服务(JMS) ⑦Web服务 其实,每一种远程技术都有其优点与不足,表格1对它们进行了简单的对比。
表格1:各种Spring Remoting技术优缺点比较 如你所见,每一种Spring Remoting技术都有各自的优缺点,但是大多数实际的应用程序都会要求使用一种轻量级Remoting技术。当实现远程服务时,使用例如EJB这样的重量级远程组件模型需要其它额外的开销。通常情况下,使用一种支持对象串行化能力的HTTP服务就足够了。 三.远程应用程序编程举例 现在,让我们开始讨论本文相应的示例程序。这个程序的设计目的如下: ◆基于接口的设计:一个基于接口的设计使客户端不必了解远程服务的实现细节;而且该实现能够在不需要对客户端代码进行任何修改的情况下作出改变。 除了这些目标外,该示例在设计上还遵循了一种敏捷软件开发方法来编写该示例应用程序所使用的类(请参考本文相应源码)。 业务需求分析 现在,既然你知道了明确应用程序的设计目标,那么接下来,让我们讨论实际的业务要求。这个示例应用程序是一个贷款处理系统(loanapp),顾客用它来提交应用程序以实现家庭抵押贷款。该Remoting示例的业务用例是:针对一指定的家庭财产实现水灾认证检查。每一个家庭贷款应用程序都需要一个水灾认证检查以确保财产不是位于一个水灾地区。如果它位于一个水灾地区,那么要求该家庭的主人通过支付一种“813费”(813是用于标识水灾认证费的代码)来获得相应的水灾保险。 在水灾地图上,一般把高、中等或低风险地区作为“水灾危险地区”,而把最高风险地区作为“特殊水灾危险区域”。在高水灾风险地区(AE,A或AO地区)的财产每年都有大约1%的发生水灾的可能性,而对于一种达30年之久的财产抵押大约存在26%发生水灾的可能性。在VE或V地区(也是高风险地区)的房地产财产每年也都有大约1%的发生水灾的可能性,并且还会面临如沿海暴风雨这样的危险。而那些处于低级或中级水灾风险地区(B或C地区)的家庭显然是位于高风险地区之外的;尽管这些地方的水灾风险会大大降低,但是却不能被删除。 一旦借款人完成家庭贷款应用程序并且选择好贷款数额的相应利率,即会触发水灾认证检查。在抵押处理的贷款处理和保险阶段开始之前必须进行相应的水灾情况检查。 用例分析 下面是实现水灾认证检查用例相应的步骤: 1.顾客通过输入细节数据(例如借款人名,属性名称,属性地址,城市,邮政区码和贷款数额)完成贷款应用程序。 技术设计 根据敏捷开发过程的思想,接下来应该是对上面定义的要求进行技术设计。本示例中使用了下列设计(类和方法)来实现用例中的要求: 1.客户端类(FloodCertClient)调用水灾控制器类(FloodCertController)的requestFloodCheck()方法。 既然远程服务充当进入一个企业的业务域模型的入口点,那么把服务层作为一个整体进行设计还是很重要的。下列是在设计远程服务时你需要牢记的一些问题: 1.远程调用类型(远程调用是无状态的还是有状态的?) 为了实现此用例的所有以上要求,本文中的示例贷款处理应用程序需要使用下列技术和框架: ◆Tomcat 5.5 Spring配置 本文中的HTTP Invoker Remoting示例使用了两个配置XML文件,这两个文件中定义了相应于你编写的实现水灾远程服务的类的Spring bean;它们分别是loanapp-servlet.xml和loanapp-client.xml。 实现 下列是基于HTTP Invoker技术针对示例贷款处理应用程序实现一个远程服务所需的步骤: 1.创建一个HTTP Invoker服务输出器类(HttpInvokerServiceExporter)。 测试 本文下载源码文件中包含了一个JUnit测试客户程序(FloodCertClientTest)用于测试调用水灾远程服务的客户端类。它通过若干不同的测试贷款应用程序(使用不同的邮政区码属性)来调用客户端。凭借提交的邮政区码属性,水灾服务就能够返回水灾认证分析的结果。 四.总结 Spring远程技术为把业务域服务暴露为远程服务提供了一种简单而灵活的方案。同时,它还为暴露多种协议(当然,位于不同的URL处)之下的相同服务提供了相当的灵活性。例如,你可以把本文示例程序中的水灾认证检查服务实现为一种RMI服务(对于Java客户,应该利用更快速的Java到Java远程技术,而对于非Java客户则宜使用一种HTTP服务)。这样以来,你可以仅在一处编写业务服务逻辑,但是最终可以把该服务暴露为两个远程服务端点。 HTTP Invoker框架为普通Java服务接口提供了必要的代理;同时,还为把Java类实现为远程服务提供一致的用法和配置风格。这是一种把两个世界的实现达到最佳结合的远程方案—把HTTP通讯的简单性与Java内置对象串行化技术结合在一起。这使得HTTP Invoker无论对RMI还是对Hessian/Burlap都成为一种优秀的选择。 当然,HTTP Invoker的一个重要局限性就是它仅为Spring框架所提供—这意味着,客户端和服务应用程序都必须使用Spring框架实现。但是,当你需要一种轻量级的易于安装而灵活的方案时,这是一种不错的选择。 相关链接
频道热门
热门新闻
|
精粹集锦
特别推荐
频道精选
|