Why RoadMap
由于网络带宽的发展,WebService作为分布式计算的解决方案越来越重要。如果想学习WebService,那应该首先从最高层次了解WebService的工作原理,以及技术构成。然后再往底层深化,细分,了解每一个细节。
WebService发展
WSDL+SOAP
WebService是一种通用的,夸语言,夸平台,夸系统的分布式解决方案。首先,我们需要抛开所有的平台,语言和实现细节,从最初设计WebService时的想法,来讨论一下WebService的基础构成。
WebService依赖于4个标准,HTTP, XML, SOAP和WSDL。
让我们来设想一个场景。存在一个网站A,A的数据库数据越来越丰富,A的功能也越来越多。A发现,如果对外提供服务,可以使其它网站使用自己的功能和数据,那岂不是可以赚更多的钱?于是A做了以下几个步骤:
开发了一些服务项目,做好对外开放的准备。
A需要把自己开放的服务制定一个描述文件(WSDL),好让其它网站能够遵照描述的方式,使用开放的服务。
网站B想使用网站A的服务,于是A把WSDL全部发给了B.
B遵照WSDL的描述,产生请求。这个请求的数据格式为SOAP,编码格式为XML。
载着SOAP格式数据的XML实体,通过HTTP协议发往A。
A接收HTTP请求带来的XML数据,由于XML数据是遵循SOAP协议组织的,A知道如何解析其中的内容。
A执行服务,产生响应。这个响应的数据格式为SOAP,编码格式为XML。
载着SOAP格式数据的XML实体,通过HTTP协议发往B。
B根据WSDL的描述,明白A返回的数据如何解析。
上面的步骤,粗略的解释了HTTP, XML, SOAP与WSDL在WebService中的作用。
Restfull
使用WSDL和SOAP的代价挺大,首先,作为一个java web程序员,需要额外的学习WSDL相关的知识。其次,由于客户端需要导入WSDL,这使得耦合度加大。再其次,SOAP协议使得HTTP承载的body比较大,浪费带宽。最后,生成和解析SOAP协议也要花时间。
随着AJAX和JSON的流行,逐渐兴起了一种更加宽松,灵活,轻量级的WebService,这就是Restfull API. Restfull是使用HTTP传输XML或JSON或任意格式的数据。这抛弃了WSDL, SOAP。
Java WebService
无论是WSDL+SOAP方式,还是Restfull方式,产生和解析传输数据实体,都是比较费代码的。于是Java提供了一种机制,可以帮助我们自动的产生传输数据,我们在编程的时候,只需要专注于服务接口的调用。这个帮助我们产生传输数据的就像是一个Proxy。在WSDL和SOAP模式下,Proxy可以根据WSDL产生相应的SOAP数据,也可以解析返回的SOAP数据。
在J2EE 1.4时代,有JAX-RPC做proxy。后来从J2EE5开始,多了JAX-WS. 到了J2EE6,又有了JAX-RS.
当前开发WebService最常用的框架就是Axis2和Metro,也有用Spring-WS的。
Metro与Axis2
Metro是由sun,现在的oracle开发的服务栈,Metro只支持JAXB与JAX-WS,由于历史原因,也支持JAX-RPC。而Axis2不仅支持JAXB和JAX-WS,还支持其它所有可能的技术。所以,JAXB与JAX-WS技术几乎就是Metro的全部,而JAXB与JAX-WS只是Axis2的一方面,在Axis2下,也可以不适用JAX-WS。
在发布方面,Metro引擎需要被部署的webservice war包含sun-jaxws.xml。而Metro的servlet会为所有的webservice请求服务。
因为oracle的原因,我们接下来所学的均是Metro框架。https://metro.java.net/2.3/
下面是Metro对WebService的支持所指定的规范,其中J2EE部分是Proxy的实现,我们在开发的时候,会任选一个。XML部分是对XML使用的规范,这部分属于XML的知识范畴。
后面的文章,我会从实例出发,描述WebService在Java的实现方式。