技术开发 频道

基于Spring HTTP Invoker的两全其美的远程服务

    【IT168 专稿】使用Spring HTTP invoker从普通Java类中实现远程服务可以把HTTP通讯的简单性和Java内置的对象序列化机制结合起来。

    远程是企业分布式计算中的一项基本组成部分。你从同一台服务器里(Java虚拟机)调用的服务或者类称之为远程服务,但是如果你需要和一个外部程序(在不同的服务器上或者不同的组织里)通讯的话,它就必须实现为远程服务。Spring框架提供了一种独特且灵活的方式来把商业类实现为远程服务。

    Spring远程体系结构的核心是服务对象,它们是POJO,也被称为Spring bean。Spring框架把这些服务对象和它们是如何成为远程服务的等基础设施细节隔相分离,这样开发人员就可以集中精力在服务对象的商业接口上,而不是陷入这些细节的纠缠中。

    这种远程模型提供了商业服务的远程抽象。它处理编组的和未编组的方法参数,也处理服务方法里抛出的任何异常,用未验证的RemoteAccessException把它们封装起来。为了实现多种类型的服务,Spring使用了几种设计模式。例如,它使用代理设计模式来把你的调用翻译为指向输出服务的URL的HTTP POST请求。

    这篇文章解释了如何使用Spring来实现远程服务。它演示了使用Spring远程API把旧的普通Java对象(POJO)转换为能够让外部程序调用它的商业函数的远程服务。演示使用了一个处理贷款的应用程序的例子来把一个商业服务实现为一个远程HTTP服务,并且从一个测试客户端请求类里的商业方法。

一、Spring 远程方式是如何工作的呢?

    让我们来仔细看一下Spring远程机制是如何工作的。它提供了如下的元素把一个Java类实现为一个远程服务:

1. Remote Service Exporters – 这些类用来创建被客户端程序调用的远程服务端点。 Service exporters也管理查找远程服务的任何注册。
2. Proxy Factory Beans – 这些是工厂类,用来创建客户端使用的连接到远程服务的代理。
3. HTTP Invoker – 正如前面所述,Spring HTTP invoker使用了一种远程模型,你可以使用它通过HTTP进行远程调用,同时使用Java序列化技术传递Java对象。它使得由一个普通Java类实现远程服务容易了很多,并且让你把精力集中在远程服务的商业接口上而不是远程基础设施的细节上。它依靠基础设施RMI invoker,但是使用HTTP做为传输协议。
在客户端方面,Spring HTTPinvoker提供两种类型的客户端:由Java SE提供的标准API和普通HttpClient API。缺省使用HttpClient。

先让我们看一下Spring在所有远程技术列表中所支持的远程技术:

•  基于接口的设计: 基于接口的设计使得客户端不必知道远程服务的实现细节。在客户端代码中不做任何修改,实现方式就可以改变。
•  测试驱动的开发: 应用程序中所有组件在容器之外都应该是可测的。例子中将会使用JUnit写简单的单元测试,来验证你写的代码中每个类设计的合理性。
•  层次化的体系结构: 层次化的体系结构提供了松散的耦合,独立性和灵活性。一个典型的J2EE应用程序都有这样的层次:用户接口(UI),应用(或者控制器),域(域模型或服务),和基础设施。例子中的应用程序有控制器,服务和域这几层。
•  概念分离: 既然远程函数和商业服务无关,概念的分离在服务的实现上发挥着重要作用。
•  轻量级服务: 例子使用Spring HTTP invoker API来实现远程服务。 和其他组件模型相比HTTP invoker还是相当轻量的。
•  非侵入性: Spring因为在商业应用中有非侵入的API而成为出色的框架。它使用Aspects和AOP等技术,反向控制(IoC),代理和工厂模式等设计模式,你可以封装服务类中商业任务的实现细节,只把接口留给客户端。
除了这些目标,例子在应用类的设计和编码上还遵循敏捷软件开发方式:

 

0
相关文章