基于Sring技术应用的远程服务编程.docx

上传人:罗晋 文档编号:11088108 上传时间:2021-06-29 格式:DOCX 页数:9 大小:17.78KB
返回 下载 相关 举报
基于Sring技术应用的远程服务编程.docx_第1页
第1页 / 共9页
基于Sring技术应用的远程服务编程.docx_第2页
第2页 / 共9页
基于Sring技术应用的远程服务编程.docx_第3页
第3页 / 共9页
基于Sring技术应用的远程服务编程.docx_第4页
第4页 / 共9页
基于Sring技术应用的远程服务编程.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《基于Sring技术应用的远程服务编程.docx》由会员分享,可在线阅读,更多相关《基于Sring技术应用的远程服务编程.docx(9页珍藏版)》请在三一文库上搜索。

1、一.引言从根本上分析, Remoting 实际上是一种企业分布式计算的组件。在同一服务器( Java 虚拟机)内进行调用的服务(或类)并不需要把自己暴露为一种远程服务;但是,如果你需要与一个外部程序(在不同的服务器上或在一个不同的组织中)进行通讯的话,那么,必须把它实现为一个远程服务。 Spring 框架为把业务类暴露为远程服务提供了一种独特而灵活的方式。SpringRemoting 架 构 的 核 心 是 服 务 对 象 , 这 些 对 象 其 实 是 一 些 POJO , 也 称 作Springbean 。 Spring 框架能够把这些服务对象与基础结构细节 (例如它们暴露为远程服务的方式

2、) 隔离开来; 这样以来, 开发者就可以专注于实现服务对象的业务接口而不是牵涉到这些细节中去。这个Remoting模型提供了对业务服务的远程抽象。它负责编排和反编排方法参数并且还负责处理服务方法中抛出的任何异常使用未检查的 RemoteAccessException 异常对它们进行包装。为了实现各种服务, Spring 使用了若干设计模式。例如,它使用代理设计模式把你对 HTTPPOST 请求的调用翻译成指向输出服务的 URL 。本 文 将着 重 探讨 如何 使用 Spring 实 现一个远程服 务 。 也 就是说 , 要 展示使用SpringRemotingAPI 把一个普通Java 对象

3、(POJO) 转化成一个远程服务;这样以来,外部程序就可以从其业务实现中调用该服务。 该演示使用一个示例贷款处理应用程序把一个业务服务实现为一个远程HTTP 服务并且从一个测试客户端调用该类中的业务方法。二 .SpringRemoting工作机制在本节中,让我们更为细致地分析Spring 的 Remoting 工作机制。要把一个普通的 Java类实现为一个远程服务,需要提供如下一些内容:1. 远程服务输出器( exporter ) 这些类用于创建为客户端程序所调用的远程服务端点。 服务导出器还管理任何用来查询远程服务的注册表。2. 代理工厂 Bean 它们是用于创建代理的工厂类,客户端能够使用

4、这些代理连接到远程服务。3. HTTPInvoker 如前面所提及, SpringHTTPInvoker 使用了一种 Remoting 模型,你可以使用这种模型实现跨HTTP 的远程调用, 同时使用 Java 串行化技术传递Java 对象。 这样使得从一个普通Java 类中实现一个远程服务容易得多了,并且允许你专注于远程服务的业务接口而不必亲自考虑远程基础结构的实现细节。该技术依赖于RMIInvoker 的基础结构,但是使用 HTTP 作为传输协议。在客户端方面, SpringHTTPInvoker 提供两种类型的客户端: JavaSE 提供的标准API 和CommonsHttpClientA

5、PI 。默认情况下,它使用的是HttpClient 。接下来,让我们看一下Spring 框架所支持的远程(Remoting )技术。Spring 框架支持的远程技术列举Spring 框架支持多种Remoting 技术。下面,我们来对它们作逐一简单介绍。1. 远程方法调用( RMI )RMI 是一种分布式Java 技术,远程Java 对象的方法能够从一个不同的 Java 虚拟机上进行调用。它基本上是远程过程调用( RPC )的 Java 版本,但是,它还提供了连同相应的请求一起传递多个对象的能力。 RMI 使用真正的对象串行化来编排与反编排方法的参数而不会截断其相应类型。Spring 以两种方式

6、支持 RMI :传统型 RMI 和使用 RMIInvoker 的远程技术。2.HessianHessian 是一个由 CauchoTechnology 开发的轻量级二进制 RPC 协议。 它使用一种定制的串行化技术来实现跨网络发送Java 对象。除了对Java 支持外, Hessian 还提供对于例如PHP , Python , C+ 和 C# 等其它语言的实现支持。3.BurlapBurlap 是一个轻量级的用于实现Web 服务的 XML-RPC 协议。 类似 Hessian , 它还使用一种专利性串行化机制来实现Java 对象的串行化。有关Hessian/Burlap 的更多信息,恕在此不

7、多及。4.HTTPInvokerSpring 提供一种专门的 Remoting 策略 HTTPInvoker ,它使用标准的 Java 串行化机制并通过 HTTP 协议来暴露服务。 这是一个很重要的特征, 特别是当你想传递给服务的方法参数是复杂的类型对象而不仅是简单的文本消息时尤为重要。5.EJBSpring 还支持 EJB 组件模型。 EJB 组件还提供其它的 J2EE/JavaEE 服务,例如基于角色的认证和授权以及声明性和编程性事务管理。然而, EJB 模型是一个重量级的组件模型,所以大多数业务应用程序往往敬而远之。6 .Java 消息服务 (JMS)JMSAPI 是一种消息发送标准允许

8、Java 应用程序异步地创建、发送、接收和处理消息。它提供了松耦合的和可靠的分布式通信。默认情况下, JMSRemoting 使用 Java 串行化,但是一个 JMS 提供者(例如,WebLogicJMS 或 JBossMQ) 能够使用另外一个不同的机制 (例如 XStreamAPI )以便允许通过其它技术实现消息发送。7 .Web 服务借助于开源Web 服务引擎 ApacheAxis 并通过 JAX-RPC 技术, Spring 为实现基于 SOAP的 Web 服务提供支持。 Web 服务提供真正的平* 立的远程技术, 但是它们的建立非常复杂,而且与常规HTTP 远程调用相比还需要额外的 S

9、OAP 消息处理的开销。因此,在不是真正需要平* 立性的情况下, 你应该尽可能避免使用 Web 服务。 另外, 你还能够使用 XFire(由 Codehaus 开发的一个轻量级 SOAP 库)对 Web 服务进行暴露。其实,每一种远程技术都有其优点与不足,表格 1 对它们进行了简单的对比。框架优点缺点RMI全面支持 Java 对象串行化。因此,你能够通过网络发送复杂数据类型。RMI 仅是一种 Java 到 Java 型远程方案。如果你拥有任何非Java 客户端的话,那么你无法使用它。另外,你还无法通过HTTP 协议存取对象,除非你有专门的“通道”实现RMI 通讯。 注意, 它需要一个RMI 编

10、译器(为了生成代理和框架)和一个外部注册表(用于查询服务)。Hessian/Burlap跨防火墙工作良好它们使用一种专利对象串行化机制。其中, Burlap 仅支持 Java 客户端。它们能够串行化Hibernate 对象,但是对集合对象执行“惰式”加载。HTTPInvoker基于 HTTP 的 Java 到 JavaRemoting ;通过 HTTP 实现 Java 串行化;容易建立。服务器和客户端应用程序都需要使用 Spring 。仅是一种 Java 方案。EJB支持 RemotingJ2EE 服务,应用程序安全以及事务处理EJB 是一种重量级技术。它要求使用一个J2EE 容器。Web 服

11、务平台和语言独立要付出 SOAP 操作所带来的开销,并且要求使用一个Web 服务引擎。表格 1 :各种 SpringRemoting 技术优缺点比较如你所见,每一种 SpringRemoting 技术都有各自的优缺点,但是大多数实际的应用程序都会要求使用一种轻量级Remoting 技术。当实现远程服务时,使用例如 EJB 这样的重量级远程组件模型需要其它额外的开销。 通常情况下, 使用一种支持对象串行化能力的 HTTP服务就足够了。三.远程应用程序编程举例现在,让我们开始讨论本文相应的示例程序。这个程序的设计目的如下:基于接口的设计:一个基于接口的设计使客户端不必了解远程服务的实现细节;而且该

12、实现能够在不需要对客户端代码进行任何修改的情况下作出改变。测试驱动开发:该应用程序中的所有组件都应该是容器外可测试的。这个示例将使用JUnit来编写简单的单元测试以便对你编写代码时产生的每一个类的设计作出验证。分层架构:一个分层的架构能够提供松耦合、隔离及灵活性。一个典型的J2EE应用程序都会实现分层一用户接口(UI)层,应用程序(或控制器)层,域(域模型或服务)层和基础结构 层等。本文示例应用程序中提供了控制器、服务和域三个层。分离关注点:既然Remoting功能与业务服务之间毫无联系,那么,关注点的分离在实现服务的过程中就起着相当重要的作用。轻量级服务:本文示例使用了SpringHTTPI

13、nvokerAPI来实现远程服务。与其它组件模型比较, HTTPInvoker 是相当轻量级的。非入侵式:Spring是一个优秀的框架,非常适合于在业务应用程序中使用一种非入侵式API 的情况。 借助于例如 Aspects 和 AOP 等技术以及例如控制反转(IoC) , 代理和工厂模式等设计模式, 你可以把一项业务相关任务的实现细节封装到服务类中并且仅对客户端暴露接口。除了这些目标外, 该示例在设计上还遵循了一种敏捷软件开发方法来编写该示例应用程序所使用的类(请参考本文相应源码) 。业务需求分析现在,既然你知道了明确应用程序的设计目标,那么接下来,让我们讨论实际的业务要求。这个示例应用程序是

14、一个贷款处理系统(loanapp) ,顾客用它来提交应用程序以实现家庭抵押贷款。该Remoting 示例的业务用例是:针对一指定的家庭财产实现水灾认证检查。每一个家庭贷款应用程序都需要一个水灾认证检查以确保财产不是位于一个水灾地区。 如果它位于一个水灾地区,那么要求该家庭的主人通过支付一种“ 813 费” (813 是用于标识水灾认证费的代码)来获得相应的水灾保险。在水灾地图上,一般把高、中等或低风险地区作为“水灾危险地区” ,而把最高风险地区作为“特殊水灾危险区域” 。在高水灾风险地区(AE , A 或 AO 地区) 的财产每年都有大约1 的发生水灾的可能性,而对于一种达30 年之久的财产抵

15、押大约存在 26 发生水灾的可能性。在 VE 或 V 地区(也是高风险地区)的房地产财产每年也都有大约 1 的发生水灾的可能性,并且还会面临如沿海暴风雨这样的危险。而那些处于低级或中级水灾风险地区 (B 或 C地区)的家庭显然是位于高风险地区之外的;尽管这些地方的水灾风险会大大降低,但是却不能被删除。一旦借款人完成家庭贷款应用程序并且选择好贷款数额的相应利率,即会触发水灾认证检查。在抵押处理的贷款处理和保险阶段开始之前必须进行相应的水灾情况检查。用例分析下面是实现水灾认证检查用例相应的步骤:1. 顾客通过输入细节数据(例如借款人名,属性名称,属性地址,城市,邮政区码和贷款数额)完成贷款应用程序

16、。2. 用户选择一个贷款产品和利率并且在一个特定的时间周期 (例如, 30 或 45 天 )内锁定此项贷款。3. 本文 loanapp 程序基于细节属性(例如地址和邮政区码)调用一个水灾认证检查。4. 基于客户端的邮政区码属性, 水灾服务决定是否指定的属性处于一个水灾地带以及是否它要求水灾认证 (这个调用是同步的;所以,在继续贷款应用程序处理之前,客户端需要等待服务的响应)。5. 一旦水灾检查请求返回,贷款即被提交到一个自动化保险系统( AUS )以得到该借款人的信用历史以及该贷款应用程序的风险评价。技术设计根据敏捷开发过程的思想, 接下来应该是对上面定义的要求进行技术设计。 本示例中使用了下

17、列设计(类和方法)来实现用例中的要求:1 . 客 户 端 类 (FloodCertClient) 调 用 水 灾 控 制 器 类 (FloodCertController) 的 requestFloodCheck() 方法。2 . 然后, 该控制器又调用服务 (FloodCertService) 中的 processFloodCheck() 方法, 通过在HTTP 请求中发送贷款细节实现。3 .水灾服务调用 FloodDAO 类来存取后端数据库并且检查是否指定的属性需要进行水灾认证。4 .DAO 返回一个含有水灾认证结果的结果对象。然后,该结果数据被返回到客户端并显示于 Web 页面。既然远程

18、服务充当进入一个企业的业务域模型的入口点, 那么把服务层作为一个整体进行设 计还是很重要的。下列是在设计远程服务时你需要牢记的一些问题:1. 远程调用类型(远程调用是无状态的还是有状态的?)2. 远程调用激活类型(同步还是异步调用?)3. 客户端类型(Java , .NET 或一些其它类型的客户端)4. 操作系统 (Windows , Unix 或另一种 OS)5. 事务(你是否需要该远程服务是事务性的以便在服务方法中实现任何数据库或JMS 队列更新时都能够作为一个独立的工作单位被提交或回滚? )为了实现此用例的所有以上要求,本文中的示例贷款处理应用程序需要使用下列技术和框架:新omcat5.

19、54Spring2.0Unit* CommonsHttpClient* Eclipse* ntSpring 配置本文中的 HTTPInvokerRemoting 示例使用了两个配置XML 文件, 这两个文件中定义了相应于你编写的实现水灾远程服务的类的 Springbean ; 它们分别是loanapp-servlet.xml 和loanapp-client.xml 。实现下列是基于HTTPInvoker 技术针对示例贷款处理应用程序实现一个远程服务所需的步骤:1. 创建一个 HTTPInvoker 服务输出器类(HttpInvokerServiceExporter) 。2. 创建一个HTTP

20、代理 (使用HttpInvokerProxyFactoryBean) 。你需要在这个类中指定如serviceUrl 和 serviceInterface 等参数。3. 定义一个 URL 映射,以便客户端调用远程HTTP 服务。4. 在 loanapp-servlet.xml文件中配置Springbean 。5. 在 web.xml 文件中配置SpringWeb层 (DispatcherServlet)。6. 编写客户端类(使用HTTP 或 CommonsHttpClient)7. 编写一个 JUnit 测试用例来调用客户端类中的方法。测试本文下载源码文件中包含了一个JUnit 测试客户程序(F

21、loodCertClientTest) 用于测试调用水灾远程服务的客户端类。 它通过若干不同的测试贷款应用程序 (使用不同的邮政区码属性)来调用客户端。凭借提交的邮政区码属性,水灾服务就能够返回水灾认证分析的结果。四 . 总结Spring 远程技术为把业务域服务暴露为远程服务提供了一种简单而灵活的方案。同时,它还为暴露多种协议(当然,位于不同的 URL 处)之下的相同服务提供了相当的灵活性。例如,你可以把本文示例程序中的水灾认证检查服务实现为一种 RMI 服务(对于 Java 客户,应该利用更快速的 Java 到 Java 远程技术,而对于非Java 客户则宜使用一种 HTTP 服务) 。这样

22、以来, 你可以仅在一处编写业务服务逻辑, 但是最终可以把该服务暴露为两个远程服务端点。HTTPInvoker 框架为普通Java 服务接口提供了必要的代理;同时,还为把Java 类实现为远程服务提供一致的用法和配置风格。 这是一种把两个世界的实现达到最佳结合的远程方案把HTTP通讯的简单性与Java内置对象串行化技术结合在一起。这使得HTTPInvoker无论对RMI还是对Hessian/Burlap都成为一种优秀的选择。当然, HTTPInvoker 的一个重要局限性就是它仅为 Spring 框架所提供这意味着, 客户端和服务应用程序都必须使用Spring框架实现。但是,当你需要一种轻量级的易于安装而灵活的方案时,这是一种不错的选择。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1