Meng Yan ( 孟岩 )’s Weblog

Web Service : WebOS中的Function Call

by Meng Yan on Jun.09, 2006, under Other

前一段,Blogsphere里面关于WebOS的大讨论甚是激烈,如果说Web2.0的时代,整个Web将会是一个大大的WebOS的话,将各个应用和服务联系在一起的就是两个东西:

  • RSS
  • Web Service

以前RSS说的太多了,今天就来说说Web Service。Mac OS最新的Tiger里面的Dashboard,里面的每个小Widget都是由简单的HTML、CSS以及Web Service组成的,你可以用这些Widget来查询股票,天气,以及其它很多事情。这些Widget的核心组件,就是调用外部的Web Service。我以前曾经说过的Google IG、Live.com中的Gadget,也都是这个道理。

说到Web Service,就不能不说到RPC(远程系统调用)。所谓的远程,包括进程外,甚至本机外,经典的RPC协议包括DCOM、CORBA以及ICE等等。我觉得,对于RPC来说,最重要的就是两点:

  • 将过程调用的参数和返回值序列化(Serizialize)成一系列的数据 - marshalling,中文翻译成“列集”这个怪怪的名字;
  • 用某种方式来传递这种数据。对于进程外RPC来说,可以采用共享内存、管道等等。而不同机器之间,则多是用专署协议了,比如DCOM和CORBA,现在有更轻量级的ICE。

Web Service解决以上两个问题的办法是:

  • 采用XML来进行数据的Marshalling;
  • 采用HTTP来进行数据的传递(SOAP的新标准中也支持了其它协议,比如SMTP);

记着2000年我刚刚接触Web Service的时候,对采用HTTP来进行数据传输这点很是不以为然,觉得穿透防火墙这些Feature绝对是宣传上的噱头。那时的自己还醉心于对桌面平台的COM、DCOM以及CORBA的研究。现在我慢慢认识到,采用XML(明文可读)、HTTP(最常用的网络协议),绝对是Web Service得以成功的两个重要的因素。

现在比较流行流行的Web Service主要有三种,分别来说说:

1)SOAP

SOAP,全名是Simple Object Access Protocol,是Microsoft提交给W3C的Web Service协议。我觉得SOAP的两个最大的好处是:

  • 协议的可扩展性(Extension Mechanism)
  • 良好的工具支持

SOAP的消息称为一个SOAP Envelope,包括SOAP Header和SOAP BODY。其中,SOAP Header可以方便的插入各种其它消息来扩充Web Service的功能,比如Security(采用证书访问Web Service),SOAP BODY则是具体的消息正文,也就是Marshall后的信息。

SOAP调用的时候,也就是向一个URL(比如http://ws.invesbot.com/stockquotes.asmx?WSDL)发送HTTP Post报文,调用方法的名字在HTTP Request Header SOAP-Action中给出,接下来就是SOAP Envelope了。

服务端接到请求,执行计算,将返回结果Marshall成XML,用HTTP返回给客户端。

SOAP的工具支持非常好,比如在.NET里,可以用WSDL.exe非常方便的为一个Web Service生成本地Proxy(Proxy模式),这样,你的程序就像调用本地API一样了,而由Framework为你完成Marshall和传送的工作。

2)XMLRPC

XMLRPC ,我记着看过一段Don Box的采访,他说当时Microsoft费了7年的时间(大概,记不清楚了)才成功的把SOAP提交给W3C,而Dave Winer(眼熟吧,RSS’s Father)借鉴SOAP实现了一个更轻量级的协议,那就是XMLRPC。以前曾经大概看过XMLRPC,XMLRPC就是SOAP的简化和改进,比如说:

  • Marshall类型的支持有限
  • 取消HTTP Header中的SOAP Action,而将Method Name也放到XMLRPC的Body中
  • 传送的XML信息中没有Header,只有Body。

XMLRPC相比于SOAP最大的优势就是它的简单,弱点就是扩展性弱,另外,工具支持也不如SOAP那般正规,感觉起来,一个像正规军,一个像游击队。不过,游击队才有作战灵活的特点 :P。

XMLRPC在社区中非常流行,我这篇Blog是在Writely写的,通过WordPress的XMLRPC接口发布到我的Blog上。

3)REST

REST - Representational State Transfer, 是Roy Fielding的博士论文中提出的概念,其实,与其说REST是一种Web Service协议,不如说REST是一种Web based软件架构,一种基于Resource State的服务访问架构。

通俗的将,可以用你访问我的Blog的过程来描述REST的工作流程。当你访问我的Blog首页,其实就是对我的Blog的一个资源访问,那么Web Server会将这个资源的Representation返回给你,也就是我的Blog的首页的HTML。当你点击了这个HTML中的一个link,比如某篇Blog,你实际上就又对另一个资源发生了请求,Web Server会将新的资源Representation以HTML的形式发送给你。

REST的参数传递是采用URL Query,而返回值就是XML了。

我曾经看过一个人对REST和SOAP的解释,我觉得很对,SOAP是面向活动,而REST是面向资源的。

Build一个Web Service,in SOAP way还是in REST way还是有很大的不同的。

比如说,要实现一个世界杯赛程、赛果、球员评分查询的这样一个简单的Web Service,如果用SOAP的话,我们可以生成一个WSDL:

http://www.mengyan.org/worldcup2006/?WSDL

它包含很多方法,比如GetMatchResult, GetPlayerScore, GetFixture,客户端通过调用这些Web Method来获得相应的数据。

如果用REST的方法来构架,就得先分析系统中都有那些资源,每一个资源有一个URL,比如:

http://www.mengyan.org/worldcup2006/fixture/?team=Brazil

http://www.mengyan.org/worldcup2006/match/?id=1

http://www.mengyan.org/worldcup2006/player/?name=Beckham

每种资源都是一个URL,然后利用URL Path或者Query来实现参数的传递,Response则是这个资源的一个表示形式。

当然,这些只是逻辑上的URL,具体的实现是采用URL Rewrite还是其它就可以你的具体设计了。

万事没有绝对,你也可以用其它方法设计REST Web Service。比如Flickr,它的Rest Service都是如下样子:

http://www.flickr.com/services/rest/?method=flickr.test.echo&name=value

也就是说,整个Service是一个资源,method变成了参数,用Method来标明不同的方法调用。我觉得,Flickr的REST Service其实还是采用传统的SOAP思想考虑的,只不过用了REST来实现。不能称作Thinking in REST way :-)。

Ok,就说到这里吧。最后别忘了,和本机的Function Call相比,Web Service还是有很多需要注意的地方,最重要的两点就是Performance和Security。有很多需要注意的地方,这些说起来就太多了,而我也还有很多需要学习的地方,就简单举两个例子:

  • 减少方法调用的次数
  • Message-Based Programming
  • 利用Cache

我一直在想,如果有一天,我在Debug的时候,Stack Trace是一层层、一个个的Web Service,是不是很有意思?

Popularity: 42%


6 Comments for this entry

  • IUSR

    我觉得文中的概念有点混乱。不过说回来,w3c的规范里没有造成混乱的几乎没有吧:S

  • robinz-hbifts

    对于WebService来说,最大的优点就是:
    XML + Http 协议.

    xml使得数据是自描述的.谁都可以看得懂.谁都可以明白.而且可以使用XSL(XML Schema)来对数据进行合法性校验.
    Http是一个无状态的跨Internet的协议,最大的优点就是可以跨Firewall. 在某些场合,这是个非常重要/显眼的优点…

    不过,WebService的调用,我觉得不应该属于Function Call. Function Call是RPC (远程调用)的提法,其实质是在本地有一个远程对象的代理.对本地的对象所做的任何操作,都会如实的反映到远程服务器上面的.
    WebService只是数据的交互.你把数据给我,我再把数据返回给你.仅仅只是数据的交互~

  • Meng Yan

    to Robin:
    我觉得这其实是一个度的问题,Web Service是更进一步的RPC,就像我说的。当然,传统的RPC可以控制远程对象的Life Cycle,Web Service是不可以的。

  • tinyfool

    按重量级来排序SOAP>XML RPC > REST > RSS
    那天去csdn跟另外那个孟岩和还有火炬作live的聊天节目,我们聊过这个问题,认为RSS的前途大于SOAP,原因在于soap讲究的是互操作性,rss是信息的交换.企业领域更需要互操作,而web领域需要更多的是信息交换.

    应该说Dave winer是XML思想的重要推广者,《软件研发》第二期,《web服务的起源》一文讲述了这段历史,Dave写了篇文章《RPC over HTTP via XML》,提出了思想。然后被微软邀请,合作按照这个思想制定一个协议规范。don box也是参与者之一,然而等到soap开发完成后,微软内部不同团队的竞争造成协议一直不能得以公布。于是Dave winer,制作了一个简化版本公开发行,也就是xmlrpc。

  • Meng Yan

    谢谢Tinyfool介绍这段历史 :)

    Dave Winner确实是XML的重要推广者,RSS、OPML、XMLRPC。说起RSS的互操作,不由得想起微软的SSE,而Dave Winner也受Ray Ozzie之邀参与了其中。

  • chenqj

    xml的生成和解析太占cpu

2 Trackbacks / Pingbacks for this entry

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!