Web服务是构建B2B应用最为重要的利器之一,使用它能够构建、集成大型的系统。这一切都是通过发送XML消息给已定义的模块化接口完成的。借助于无状态会话Bean能够构建Web服务。为实现Java客户对Web服务的访问,需要使用到JAX-RPC.Web服务是构建SOA的一种方式。SOA是架构方法,它能够将各种异构应用集成起来,并组成更大的分布式应用,最后通过服务接口的形式将整个应用支撑起来。
服务提供者创建抽象服务定义,并将它发布到服务注册器中。对于WEB服务而言,服务定义是通过WSDL文件给出的;服务注册器需要遵循UDDI标准。服务请求者可以使用一套查询机制从服务注册器中查找到WSDL文件,如果找到合适的服务定义,请求者将绑定到服务提供者上。
服务接口类似于对象或EJB接口。但是对于WEB服务而言,服务接口更为灵活。比如服务实现和客户处于松耦合的关系,而这在其他EJB应用或分布式应用中是实现不了的。这种松耦合使得客户和服务实现能够运行在不同平台上,比如Microsoft.NET客户能够访问到J2EE应用服务器中所运行的服务。另外,相比Java对象而言,Web服务实体的粒度更粗。
通过标准化接口,能够加强SOA的模块化;通过松耦合,能够提高SOA的灵活性;通过XML,能够增强SOA扩展性。在B2B场合,这些都是很重要的因素。WEB服务能够在那些使用了多种异构平台的企业应用中大显身手。所有的WEB服务都是构建在XML和Internet协议上的。EJB只能够采用Java开发。如果使用其他语言开发应用,互操作如何实现?
组成WEB服务的事实标准可以通过如下等式表达:
Web服务 = WSDL+SOAP+UDDI
1、WSDL语言比Java更抽象、广度更大。HelloWorldWSDL中存在<service>标签,它能够在具体地址提供若干<port>.<port>代表了服务接口及对具体协议的绑定。
2、服务描述包含了Endpoint地址。WSDL是由Java接口和对象引用构成的。换句话说,Web服务不存在真正的实体,它们不是对象,因此必须将它们按照模块化对待。
3、根据输入、输出定义操作。开发者需要将输入、输出消息表示为XML元素。
4、采用的绑定是SOAP绑定。到目前为止,只能采用SOAP绑定。也请注意,<soap:binding>标签还存在style="rpc"属性,因此可以看出style还存在其他取值,目前,用于交换SOAP消息的另一种风格是文档风格(document-style)。文档风格意味着在SOAP消息体中不在包含对具体操作的描述。
SOAP协议为Web服务和它们的客户定义了XML消息格式。SOAP消息格式非常简单。它实际包含两部分内容:其一,HTTP POST请求头信息。其二,XML文档,这就是SOAP信封(Envelope)。另外,通过上述两分SOAP消息,我们还想表达Web服务中的另一个重要概念。从SOAP协议的使用过程来看,它非常轻量,因为它对处于交互中的客户和服务没有任何限制。但是,从SOAP协议的大小、性能角度考虑,它并不轻量。如果不压缩SOAP消息,则需要在网络上传递大量的SOAP数据消息。因此,采用二进制更为明智,比如CORAB的IIOP协议。对于含有大量的SOAP数据消息进行压包和解包操作将耗费大量的CPU时间。请不要忘记,WEB服务的诞生背景,它只是为集成应用而来的,而不是替换现有的高性能中间件平台技术。否则,就不需要使用web服务了。
XML文档和平台无关性,借助于标准化的XML文档,WEB服务能够帮助集成异构的分布式系统。在实际应用开发过程中,它具有许多优势,比如松耦合、平台无关性、遵循XML方面的标准、能够合并不同的XML技术等。借助于XML能够实现应用和中间件平台的松耦合,这是很重要的优势。
比如在开发EJB组件时,客户和服务器端同事需要使用组件接口。一旦组件接口发生变动,比如需要往方法签名中新增参数,则EJB组件本身需要重新构建、集成、部署。当然,客户也逃脱不了重新编译的命运。因此,它们之间并没有实现松耦合,开发者不能独立的开发应用组件。否则,一旦某些组件发生变动,应用的其他部分也需要变动。我们都希望应用具有良好的扩展性。对基于IIOP的请求消息而言,所有的参与者必须使用相同的类型信息,否则不能够正确对消息进行解包操作。而且,在IIOP技术领域中,应用必须能够理解消息的所有内容。如果基于XML和XML消息开发应用,则这些限制将不复存在。
J2EE平台技术对WEB服务提供了一流的支持能力。无论WEB服务实现,还是WEB服务客户,都可以使用JAVA语言开发完成。在J2EE中,使用WEB服务同RMI、RMI-IIOP并没有多大区别。他们都将具体传输层屏蔽掉,使得开发者能够专注于业务逻辑。
JSR921规范,即实现企业WEB服务,定义了WEB服务编程模型。它使用术语port组件,描述web服务的服务器端视图。它是服务接口的java实现。而且,它遵循服务接口到Java的映射,并提供了相应的Java实现。需要将它部署并运行在容器中。使用EJB开发WEB服务需要创建若干port组件。其中,还需要提供若干XML部署描述符。当然,直接基于EJB实现WEB服务是J2EE平台中实现WEB服务的最大优势。
JAX-RPC服务端点接口,现在,来开发另一远程接口,它将企业Bean所提供的业务方法都列举出来,我们称之为服务Endpoint接口(Service Endpoint Interface,SEI),下面给出了代码。
package com.testproject.ejb.web;
/**//*
* Hello服务Endpoint接口
* 需要注意的是,这里使用的是EJB2.1无状态会话Bean,它作为WEB服务端点时可以不提供Home接口和Remote
* Locale接口,它提供的是web服务端点接口,这个接口扩展了Remote接口。
*/
public interface HelloInterface extends java.rmi.Remote {
public String hello()throws java.rmi.RemoteException;
}
JAX-RPC要求WEB服务提供SEI,EJB容器同WEB服务交互时需要使用它。JAX-RPC规范要求SEI遵循如下规则:
1、接口必须间接或直接继承java.rmi.Remote.
2、所有的方法必须抛出java.rmi.RemoteException.
3、方法参数和返回类型必须是JAX-RPC支持的JAVA类型。
4、SEI中不能包含敞亮。
在J2EE1.4平台中,可以对EJB技术进行了升级,使得无状态会话Bean可以直接部署为Web服务端点。这样,在J2ee1.4平台下,开发Web服务将更加简单。这样,EJB2.1中的无状态会话Bean可以有3种不同的客户端:本地接口的客户端、远程接口的客户端和web服务客户端。EJB的WEB服务客户端视图通过WSDL文档描述。
待续......
posted on 2009-11-09 10:22
王永庆 阅读(146)
评论(0) 编辑 收藏 所属分类:
EJB学习笔记