SOAP is what most people would consider a moderate success.

-- Don Box <A Brief History of SOAP>

上一篇:前言&RPC

(二)SOAP(90s)

RPC之后的下一个主流API设计风潮就是SOAP了。

SOAP(Simple Object Access Protocol)由Dave Winer, Don Box, Bob Atkinson, 和 Mohsen Al-Ghosein 在1998年为微软所设计。

这几个设计人员敏锐的观察到了RPC的最大缺陷:没有统一标准。使用RPC就好比发明团伙内部的黑话一样,更精简、更加保密、更加可定制,坏处就是要求双方(sender,receiver)也要懂黑话,而且一旦大家都说一种黑话了,换黑话就困难了。(是不是能联想到某些RPC框架了?)

于是,这个很有雄心的协议使用了XML来进行应用间通信,相当于说:“大家都别说各自的黑话了,都说用我这个普通话交流”。实际上,由于已经有XML-RPC(微软做事比较拖拉,前面的Dave Winer等不急在1998年提交的),只要给XML添加一个行为类型系统就能定义出这种“普通话”了。

soap message soap

时至今日,在这种“普通话”上已经发展出了一套复杂的技术链,你可能已经想到了,就是Web Service。由WSDL(Web Services Description Language)提供接口功能说明、由XML schema定义XML的结构类型、由UDDI(Universal Description Discovery and Integration)来做服务发现。

Web Service火了一段时间。然而,可悲的是,人们发现它创造的问题比解决的多。。。所以,现在,你会发现,现在越来越少的新接口是使用SOAP开发的了。


还是先说下SOAP的优点吧:

SOAP最大的好处:标准化了接口。相比于直接野蛮调用远程方法,SOAP给出了一个平台无关的、可预期的、类型安全的接口描述。WSDL用XML格式描述了哪个服务器提供什么服务,怎样找到它,以及该服务使用怎样的接口规范。从自己和对方沟通确定这个RPC应该用什么黑话来沟通相比,使用SOAP有一个可预期的标准流程:

  1. 获得该服务的WSDL描述
  2. 根据WSDL构造一条格式化的SOAP请求发送给服务器
  3. 接收一条同样SOAP格式的应答
  4. 根据先前的WSDL解码数据

这一统一,使得大部分语言和他们的IDE都实现直接从WSDL里面生成文档和访问代码。

另外一个好处是鼓励了从面向方法到面向接口的转换。虽然这可能并不是SOAP设计目的,但接口的定义的存在,或多或少的把原先RPC粗暴的暴露方法变成了暴露接口。面向接口编程的好处是不言而喻的(文章太多,感兴趣可自行搜索)。同时,面向接口使得不同语言,不同技术的互相访问变的更便捷了。你只要暴露出你服务的wsdl就行了,我可以根据定义用我自己的语言来开发,终于不用再调用别人的sdk了。


SOAP的缺点也同样耀眼:

SOAP是一种罗嗦,且难以置信的罗嗦的接口。你几乎无法在没有一大堆工具的帮助下使用SOAP。你需要工具来写测试、你需要工具来监听请求和响应、你需要工具来解析XML、你需要工具从XML中按照定义再解析出需要的数据,等等、等等。如果有一个REST的接口,我打开浏览器,一分钟之内就可以测好,如果是SOAP的话。。。今天仍然有好多老系统在用SOAP,但是当你开发一个新系统时,你会发现如果使用Web Service太过于笨重了。

SOAP的罗嗦也带来了另外一个问题:理论性能不佳。比如说访问一个远程的方法getOpenData,理论上我只需要发送下列信息到endpoint:(伪代码)

getOpenData?name=enix  

而如果你用SOAP的话...

<?xml version = "1.0"?>  
<SOAP-ENV:Envelope  
   xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
   SOAP-ENV:encodingStyle = "http://www.w3.org/2001/12/soap-encoding">
   <SOAP-ENV:Body xmlns:m = "http://www.xyz.org/quotations">
      <m:getOpenData>
         <m:name>enix</m:name>
      </m:getOpenData>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>  

而且,请记住,返回值也一定是这么一坨XML。在以前网速慢、流量贵的时候,这样发来发去简直就是犯罪!!!另外,解析、构建XML都不是一件简单的事情(SAX还是DOM?),解析和构建也非常消耗性能!!!

最后也是最重要的,SOAP本质上只是RPC的一种扩展及优化罢了。设计思路上仍然是以方法为中心的,比如上面例子中的getOpenData,本质上还是服务方的一个非常底层的方法暴露给调用方而已。系统还是存在强耦合性。

PLUS:这里有一段Java vs .Net的视频Java 4-EVER(墙外),里面爸爸声嘶力竭试图挽回学JAVA的孩子时喊出的“They(MS) actually enable us to send XML-message through SOAP! Through SOAP”很有喜感。

下一篇预告:REST