一、序言

  大家或多或少都听过WebService(Web服务),有一段时间非常多计算机期刊、书籍和站点都大肆的提及和宣传WebService技术,当中不乏非常多吹嘘和做广告的成分。可是不得不承认的是WebService真的是一门新兴和有前途的技术,那么WebService究竟是什么?何时应该用?

   当前的应用程序开发逐步的呈现了两种迥然不同的倾向:一种是基于浏览器的瘦client应用程序,一种是基于浏览器的富client应用程序(RIA),当然后一种技术相对来说更加的时髦一些(如如今非常流行的Html5技术),这里主要讲前者。

   基于浏览器的瘦client应用程序并非由于瘦客户可以提供更好的用户界面,而是由于它可以避免花在桌面应用程序公布上的高成本。公布桌面应用程序成本非常高,一半是由于应用程序安装和配置的问题,还有一半是由于客户和server之间通信的问题。传统的Windows富客户应用程序使用DCOM来与server进行通信和调用远程对象。配置好DCOM使其在一个大型的网络中正常工作将是一个极富挑战性的工作,同一时候也是很多ITproject师的噩梦。其实,很多ITproject师宁愿忍受浏览器所带来的功能限制,也不愿在局域网上去执行一个DCOM。关于client与server的通信问题,一个完美的解决方法是使用HTTP协议来通信。这是由于不论什么执行Web浏览器的机器都在使用HTTP协议。同一时候,当前很多防火墙也配置为仅仅同意HTTP连接。很多商用程序还面临还有一个问题,那就是与其它程序的互操作性。假设全部的应用程序都是使用COM或.NET语言写的,并且都执行在Windows平台上,那就天下太平了。然而,其实大多数商业数据仍然在大型主机上以非关系文件(VSAM)的形式存放,并由COBOL语言编写的大型机程序訪问。并且,眼下还有非常多商用程序继续在使用C++、Java、Visual Basic和其它各种各样的语言编写。如今,除了最简单的程序之外,全部的应用程序都须要与执行在其它异构平台上的应用程序集成并进行数据交换。这种任务通常都是由特殊的方法,如文件传输和分析,消息队列,还有仅适用于某些情况的的API,如IBM的高级程序到程序交流(APPC)等来完毕的。在曾经,没有一个应用程序通信标准,是独立于平台、组建模型和编程语言的。仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信,不论两个程序的平台和编程语言是什么。

 

二、WebService究竟是什么?

   一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

   所谓跨编程语言和跨操作平台,就是说服务端程序採用java编写,client程序则能够採用其它编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和client程序能够在不同的操作系统上执行。

    所谓远程调用,就是一台计算机a上的一个程序能够调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统,商场的POS机转账调用的转账方法的代码事实上是跑在银行server上。再比方,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方站点和程序能够调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA应用。

   事实上能够从多个角度来理解WebService,从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService的应用程序叫做client,而把提供这个WebService的应用程序叫做服务端。从深层次看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序怎样在Web上实现互操作性,你能够用不论什么你喜欢的语言,在不论什么你喜欢的平台上写Web service ,仅仅要我们能够通过Web service标准对这些服务进行查询和訪问。 

   WebService平台须要一套协议来实现分布式应用程序的创建。不论什么平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。Web service平台必须提供一种标准来描写叙述Web service,让客户能够得到足够的信息来调用这个Web service。最后,我们还必须有一种方法来对这个Web service进行远程调用,这样的方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这样的RPC协议还必须与平台和编程语言无关。

 

三、WebService平台技术

  XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。

XML+XSD:

  WebService採用HTTP协议数据传输,採用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的參数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML基本的长处在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。 

  XML攻克了数据表示的问题,但它未定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。比如,整形数究竟代表什么?16位,32位,64位?这些细节对实现互操作性非常重要。XML Schema(XSD)就是专门解决问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,全部你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自己主动帮你完毕了这个转换,但你非常可能会依据你的须要改动一下转换过程。

SOAP:

   WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都採用XML格式封装,并添加�了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。

  SOAP协议 = HTTP协议 + XML数据格式

  SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的快速公路。

WSDL:

   好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebServiceclient要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法能够调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务能够对外调用,服务是什么(服务中有哪些方法,方法接受的參数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。

   WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描写叙述Web Service及其函数、參数和返回值。它是WebServiceclient和server端都能理解的标准格式。由于是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个非常大的优点。一些最新的开发工具既能依据你的Web service生成WSDL文档,又能导入WSDL文档,生成调用对应WebService的代理类代码。

  WSDL文件保存在Webserver上,通过一个url地址就能够訪问到它。client要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商能够通过两种方式来暴露它的WSDL文件地址:1.注冊到UDDIserver,以便被人查找;2.直接告诉给client调用者。

 

四、WebService开发

  WebService开发能够分为server端开发和client开发两个方面:

   服务端开发:把公司内部系统的业务方法公布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框   架能够非常轻松地把自己的业务对象公布成WebService服务,Java方面的典型WebService框架包含:axis,xfire,cxf等,java eeserver通常也支持公布WebService服务,比如JBoss。)
   client开发:调用别人公布的WebService服务,大多数人从事的开发都属于这个方面,比如,调用天气预报WebService服务。(使用厂商的WSDL2Java之类的工具生成静态调用的代理类代码;使用厂商提供的client编程API类;使用SUN公司早期标准的jax-rpc开发包;使用SUN公司最新标准的jax-ws开发包。当然SUN已被ORACLE收购)

   WebService的工作调用原理:对client而言,我们给这各类WebServiceclientAPI传递wsdl文件的url地址,这些API就会创建出底层的代理类,我调用这些代理,就能够訪问到webservice服务。代理类把client的方法调用变成soap格式的请求数据再通过HTTP协议发出去,并把接收到的soap数据变成返回值返回。对服务端而言,各类WebService框架的本质就是一个大大的Servlet,当远程调用client给它通过http协议发送过来soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成soap格式的数据,通过http响应消息回给client。

 

五、适用场合

1、跨防火墙通信:

   假设应用程序有成千上万的用户,并且分布在世界各地,那么client和server之间的通信将是一个棘手的问题。由于client和server之间一般会有防火墙或者代理server。在这样的情况下,使用DCOM就不是那么简单,通常也不便于把client程序公布到数量如此庞大的每个用户手中。传统的做法是,选择用浏览器作为client,写下一大堆ASP页面,把应用程序的中间层暴露给终于用户。这样做的结果是开发难度大,程序非常难维护。假设中间层组件换成WebService的话,就能够从用户界面直接调用中间层组件。从大多数人的经验来看,在一个用户界面和中间层有较多交互的应用程序中,使用WebService这样的结构,能够节省花在用户界面编程上20%的开发时间。

2、应用程序集成:

   企业级的应用程序开发人员都知道,企业里常常都要把用不同语言写成的、在不同平台上执行的各种程序集成起来,而这样的集成将花费非常大的开发力量。应用程序常常须要从执行在IBM主机上的程序中获取数据;或者把数据发送到主机或UNIX应用程序中去。即使在同一个平台上,不同软件厂商生产的各种软件也常常须要集成起来。通过WebService,能够非常easy的集成不同结构的应用程序。

3、B2B集成:

   用WebService集成应用程序,能够使公司内部的商务处理更加自己主动化。但当交易跨越供应商和客户、突破公司的界限时会怎么样呢?跨公司的商务交易集成通常叫做B2B集成。WebService是B2B集成成功的关键。通过WebService,公司能够把关键的商务应用“暴露”给指定的供应商和客户。比如,把电子下单系统和电子发票系统“暴露”出来,客户就能够以电子的方式发送订单,供应商则能够以电子的方式发送原料採购发票。当然,这并非一个新的概念,EDI(电子文档交换)早就是这样了。可是,WebService的实现要比EDI简单得多,并且WebService执行在Internet上,在世界不论什么地方都可轻易实现,其执行成本就相对较低。只是,WebService并不像EDI那样,是文档交换或B2B集成的完整解决方式。WebService仅仅是B2B集成的一个关键部分,还须要很多其他的部分才干实现集成。

   用WebService来实现B2B集成的最大优点在于能够轻易实现互操作性。仅仅要把商务逻辑“暴露”出来,成为WebService,就能够让不论什么指定的合作伙伴调用这些商务逻辑,而无论他们的系统在什么平台上执行,使用什么开发语言。这样就大大降低了花在B2B集成上的时间和成本,让很多原本无法承受EDI的中小企业也能实现B2B集成。

4、软件和数据重用:    

      软件重用是一个非常大的主题,重用的形式非常多,重用的程度有大有小。最主要的形式是源码模块或者类一级的重用,一种形式是二进制形式的组件重用。採用WebService应用程序能够用标准的方法把功能和数据“暴露”出来,供其他应用程序使用,达到业务级重用。

 

六、不适用场合

1、单机应用程序:

      眼下,企业和个人还使用着非常多桌面应用程序。当中一些仅仅须要与本机上的其他程序通信。在这样的情况下,最好就不要用WebService,仅仅要用本地的 API就能够了。COM非常适合于在这样的情况下工作,由于它既小又快。执行在同一台server上的server软件也是这样。最好直接用COM或其他本地的API来进行应用程序间的调用。当然WebService也能用在这些场合,但那样不仅消耗太大,并且不会带来不论什么优点。

2、局域网的同构应用程序:

      在很多应用中,全部的程序都是用VB或VC开发的,都在Windows平台下使用COM,都执行在同一个局域网上。比如,有两个server应用程序须要相互通信,或者有一个Win32或WinForm的客户程序要连接局域网上还有一个server的程序。在这些程序里,使用DCOM会比SOAP/HTTP有效得多。与此相类似,假设一个.NET程序要连接到局域网上的还有一个.NET程序,应该使用.NETremoting。有趣的是,在.NETremoting 中,也能够指定使用SOAP/HTTP来进行WebService调用。只是不妨直接通过TCP进行RPC调用,那样会有效得多。