Java WebService异构系统通信的原理及特点:SOAP与WSDL

相关阅读:

1. Java 分布式通信的几种方式及其特点
2. Java WebService异构系统通信的原理及特点:SOAP与WSDL
3.Java EJB、CORBA、Webservices分布式通信基本原理及特点
4. Java 远程调用与分布式通信的区别

从标准上来说,整个技术架构是WebServices(带s的), 有时会看到很多人写成WebService(不带s的),其实这是不标准的WebService指的是单独一个服务,而WebServices指的是它的技术架构,目前WebServices技术使用的稍多些,因为它走的是HTTP协议,它可以穿越防火墙,它天生就能穿越80端口,但是WebServices的缺点就是:慢!!因为WebServices是基于HTTP协议传送大文本,实际传送的是XML文件而IIOP(属于CORBA技术架构)协议传送的就是二进制,所以它的效率要比WebServices快,很多所以在一些行业里,也大量的使用了CORBA技术,比如说电信网,而CORBA的缺点就是:编程模型复杂,它是属于重量级的

SOAP——简单对象访问协议

  假设我们在本地通过Java写一个main()方法与远程的一个可以是用任何语言写的取得天气预报的服务打交道

如果打交道的过程中采用的是WebServices技术的话,那么它传送给远程的就是XML文件,使用的是SOAP协议

SOAP即简单对象访问协议其实质就是HTTP+XML,也就是说它是通过HTTP协议来传送XML文件

也就是说SOAP是基于XML的简易协议,可以使应用程序在HTTP之上进行信息交换

或者更简单地说SOAP是用于访问网络服务的协议,而一条SOAP消息就是一个普通的XML文档

使用SOAP协议通信的过程中,远程对象会将所要返回的信息形成一个XML文件传给Stub

然后客户端就会把XML文件转换成Java对象,而当客户端在调用远程服务时

客户端就会把Java对象转换成XML文件作为参数传给Skeleton,而Skeleton就负责把XML文件转换成远程服务的相应语言的对象

比如说服务端是采用Java开发的,那么Skeleton就会将接收到的数据解析成Java对象,再传送给服务端

同理若服务端是采用C#开发的,那么Skeleton就会将接收到的数据解析成C#对象,再传送给服务端

所以,WebServices能够实现异构语言的通信,可以用来整合异构系统

同理,如果不是异构系统的话,也就没有必要使用WebServices技术

比如说客户端和远程对象都是采用Java开发的,那么就没有必要使用WebServices了

因为二者都是采用Java开发的,它们之间可以直接以二进制来传输数据,访问效率会快的很多

而WebServices其实就是基于XML的数据交换,即WebServices所传送的是大文本,效率自然就慢了

除非我们的系统是采用多语言开发的,那么就可以考虑使用WebServices技术

或者说我们的系统想做的通用一些,则可以采用并开放WebServices的一些方法

其实SOAP就是用来最终完成Web服务的调用的而WSDL则用于描述如何使用SOAP来调用Web服务

WSDL——WebServices描述语言

  仍以上面为例,即客户端采用Java开发,服务端是采用C#开发的天气预报的服务

作为客户端,它知道在服务端提供了一个能够获取天气预报的服务,并且客户端也可以调用该服务

但作为服务端,应该对这些服务进行描述,以告诉客户端都有哪些服务可供调用

而这个服务是不能用C#语言来描述的,因为采用Java开发的客户端是无法识别的

所以服务端就需要使用一套语言来描述它所提供的服务,这套语言就是WSDL

其实WSDL就是一个XML文件,也就是说WebServices定义了一套标准,里面都是XML格式

使用这套标准来描述服务端对外提供的服务,比如C#的方法名、参数名、返回值等信息

假设服务端的天气预报功能还没有使用C#来实现,并且客户端也没有使用Java来实现

这时突然要求定义一套标准来描述一下即将准备实现的服务端的天气预报的功能

并且客户端可以任意调用这个天气预报功能,此时就可以写一套WSDL来描述方法名、参数、返回值等信息

当服务端的C#得到该WSDL时,就可以通过WSDL生成C#代码,然后它就可以把取得天气预报功能的逻辑补充上

而客户端的Java在得到这个WSDL之后,同样可以生成Java代码,然后把相应的约定的接口实现补充上

在使用WSDL生成相应语言的代码的过程中,就需要用到一些引擎来实现

比如在WebServices中就有:Axis、CXF、XFire等框架,它们就可以根据WSDL解析成Java代码

所以WSDL是一种中立的语言

CORBA架构中也有类似于WSDL的一种东西,叫做IDL它的语法类似于C++语言,但IDL不是C++

UDDI——发现和整合服务

类似于JNDI。客户端去寻找服务端所能提供的服务时,可以找UDDI索要,而UDDI就会把WSDL传送给客户端

实际上,该过程一般不通过UDDI,而是直接把WSDL拷贝过来就可以了,可以通过Email或硬盘直接拷贝

当客户端得到WSDL之后,就可以通过SOAP协议与远程的服务端进行通信了