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添加一个行为类型系统就能定义出这种“普通话”了。
时至今日,在这种“普通话”上已经发展出了一套复杂的技术链,你可能已经想到了,就是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有一个可预期的标准流程:
- 获得该服务的WSDL描述
- 根据WSDL构造一条格式化的SOAP请求发送给服务器
- 接收一条同样SOAP格式的应答
- 根据先前的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