Web Service 进阶 (七) 浅谈 SOAP Webservice 和 RESTful Webservice
REST 是一种架构风格,其核心是面向资源,REST 专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。REST 提出设计概念和准则为:
1.网络上的所有事物都可以被抽象为资源(resource)
2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识
3.所有的操作都是无状态的
REST 简化开发,其架构遵循 CRUD 原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理。您可以通过统一资源标识符(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有 GET,PUT,POST,DELETE。
由于 REST 强制所有的操作都必须是 stateless 的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。
对于 SOAP Webservice 和 Restful Webservice 的选择问题,首先需要理解就是 SOAP 偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时 SOAP 强调操作方法和操作对象的分离,有 WSDL 文件规范和 XSD 文件分别对其定义。而 REST 强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用 REST 架构风格。
如果从这个意义上讲,是否使用 REST 就需要考虑资源本身的抽象和识别是否困难,如果本身就是简单的类似增删改查的业务操作,那么抽象资源就比较容易,而对于复杂的业务活动抽象资源并不是一个简单的事情。比如校验用户等级,转账,事务处理等,这些往往并不容易简单抽象为资源。
其次如果有严格的规范和标准定义要求,而且前期规范标准需要指导多个业务系统集成和开发的时候,SOAP 风格由于有清晰的规范标准定义是明显有优势的。我们可以在开始和实现之前就严格定义相关的接口方法和接口传输数据。
简单数据操作,无事务处理,开发和调用简单这些是使用 REST 架构风格的优势。而对于较为复杂的面向活动的服务,如果我们还是使用 REST,很多时候都是仍然是传统的面向活动的思想通过转换工具再转换得到 REST 服务,这种使用方式是没有意义的。
REST 核心是 url 和面向资源,url 代替了原来复杂的操作方法。REST 允许我们通过 url 设计系统,就像测试驱动开发使用测试用例设计类接口一样。所有可以被抽象为资源的东西都可以使用 RESTful 的 url,当我们以传统的用 SOAP 方式实现的一个查询订单服务的时候可以看到,这个服务首先存在输入的查询条件,然后才是输出结果集。那么对于类似场景要使用 REST,不可避免的会将传统的 SOAP 服务拆分为一个 HTTP POST 操作和一个 HTTP GET 操作。前面是输入,而后面是输出。
使用 REST 的关键是如何抽象资源,抽象的越精确,对 REST 的应用越好。如何进行抽象,面向资源的设计和传统的面向结构和对象设计区别,资源和对象,数据库表之间的差别是另外一个在分析设计时候要考虑的问题。在 REST 分析设计中如何改变传统的 SOAP 分析设计思想又是一个重要问题。
在 SOA 的基础技术实现方式中 WebService 占据了很重要的地位,通常我们提到 WebService 第一想法就是 SOAP 消息在各种传输协议上交互。近几年 REST 的思想伴随着 SOA 逐渐被大家接受,同时各大网站不断开放 API 提供给开发者,也激起了 REST 风格 WebService 的热潮。
SOAP
什么是 SOAP,我想不用多说,google 一把满眼都是。其实 SOAP 最早是针对 RPC 的一种解决方案,简单对象访问协议,很轻量,同时作为应用协议可以基于多种传输协议来传递消息(Http,SMTP 等)。但是随着 SOAP 作为 WebService 的广泛应用,不断地增加附加的内容,使得现在开发人员觉得 SOAP 很重,使用门槛很高。在 SOAP 后续的发展过程中,WS-*一系列协议的制定,增加了 SOAP 的成熟度,也给 SOAP 增加了负担。
REST
REST 其实并不是什么协议也不是什么标准,而是将 Http 协议的设计初衷作了诠释,在 Http 协议被广泛利用的今天,越来越多的是将其作为传输协议,而非原先设计者所考虑的应用协议。SOAP 类型的 WebService 就是最好的例子,SOAP 消息完全就是将 Http 协议作为消息承载,以至于对于 Http 协议中的各种参数(例如编码,错误码等)都置之不顾。其实,最轻量级的应用协议就是 Http 协议。Http 协议所抽象的 get,post,put,delete 就好比数据库中最基本的增删改查,而互联网上的各种资源就好比数据库中的记录(可能这么比喻不是很好),对于各种资源的操作最后总是能抽象成为这四种基本操作,在定义了定位资源的规则以后,对于资源的操作通过标准的 Http 协议就可以实现,开发者也会受益于这种轻量级的协议。
REST 思想
归结以下有如下几个关键点:
1.面向资源的接口设计
所有的接口设计都是针对资源来设计的,也就很类似于我们的面向对象和面向过程的设计区别,只不过现在将网络上的操作实体都作为资源来看待,同时 URI 的设计也是体现了对于资源的定位设计。后面会提到有一些网站的 API 设计说是 REST 设计,其实是 RPC-REST 的混合体,并非是 REST 的思想。
2.抽象操作为基础的 CRUD
这点很简单,Http 中的 get,put,post,delete 分别对应了 read,update,create,delete 四种操作,如果仅仅是作为对于资源的操作,抽象成为这四种已经足够了,但是对于现在的一些复杂的业务服务接口设计,可能这样的抽象未必能够满足。其实这也在后面的几个网站的 API 设计中暴露了这样的问题,如果要完全按照 REST 的思想来设计,那么适用的环境将会有限制,而非放之四海皆准的。
3.Http 是应用协议而非传输协议
这点在后面各大网站的 API 分析中有很明显的体现,其实有些网站已经走到了 SOAP 的老路上,说是 REST 的理念设计,其实是作了一套私有的 SOAP 协议,因此称之为 REST 风格的自定义 SOAP 协议。
4.无状态,自包含
这点其实不仅仅是对于 REST 来说的,作为接口设计都需要能够做到这点,也是作为可扩展和高效性的最基本的保证,就算是使用 SOAP 的 WebService 也是一样。
SOAP Webservice 和 RESTful Webservice 的比较
成熟度
总的来说 SOAP 在成熟度上优于 REST。
SOAP 虽然发展到现在已经脱离了初衷,但是对于异构环境服务发布和调用,以及厂商的支持都已经达到了较为成熟的情况。不同平台,开发语言之间通过 SOAP 来交互的 web service 都能够较好的互通(在部分复杂和特殊的参数和返回对象解析上,协议没有作很细致的规定,导致还是需要作部分修正)。
REST 国外很多大网站都发布了自己开发的 API,很多都提供了 SOAP 和 REST 两种 Web Service,根据调查部分网站的 REST 风格的使用情况要高于 SOAP。但是由于 REST 只是一种基于 Http 协议实现资源操作的思想,因此各个网站的 REST 实现都自有一套,在后面会讲诉各个大网站的 REST API 的风格。也正是因为这种各自实现的情况,在性能和可用性上会大大高于 SOAP 发布的 web service,但统一通用方面远远不及 SOAP。由于这些大网站的 SP 往往专注于此网站的 API 开发,因此通用性要求不高。
由于没有类似于 SOAP 的权威性协议作为规范,REST 实现的各种协议仅仅只能算是私有协议,当然需要遵循 REST 的思想,但是这样细节方面有太多没有约束的地方。REST 日后的发展走向规范也会直接影响到这部分的设计是否能够有很好的生命力。
效率和易用性
REST 更胜一筹。
SOAP 协议对于消息体和消息头都有定义,同时消息头的可扩展性为各种互联网的标准提供了扩展的基础,WS-*系列就是较为成功的规范。但是也由于 SOAP 由于各种需求不断扩充其本身协议的内容,导致在 SOAP 处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。
REST 被人们的重视,其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源接口设计以及操作抽象简化了开发者的不良设计,同时也最大限度的利用了 Http 最初的应用协议设计理念。同时,在我看来 REST 还有一个很吸引开发者的就是能够很好的融合当前 Web2.0 的很多前端技术来提高开发效率。例如很多大型网站开放的 REST 风格的 API 都会有多种返回形式,除了传统的 xml 作为数据承载,还有(JSON,RSS,ATOM)等形式,这对很多网站前端开发人员来说就能够很好的 mashup 各种资源信息。
安全性
这点其实可以放入到成熟度中,不过在当前的互联网应用和平台开发设计过程中,安全已经被提到了很高的高度,特别是作为外部接口给第三方调用,安全性可能会高过业务逻辑本身。
SOAP 在安全方面是通过使用 XML-Security 和 XML-Signature 两个规范组成了 WS-Security 来实现安全控制的,当前已经得到了各个厂商的支持,.net ,php ,java 都已经对其有了很好的支持(虽然在一些细节上还是有不兼容的问题,但是互通基本上是可以的)。
REST 没有任何规范对于安全方面作说明,同时现在开放 REST 风格 API 的网站主要分成两种,一种是自定义了安全信息封装在消息中(其实这和 SOAP 没有什么区别),另外一种就是靠硬件 SSL 来保障,但是这只能够保证点到点的安全,如果是需要多点传输的话 SSL 就无能为力了。安全这块其实也是一个很大的问题,在 BEA 峰会上看到有演示采用 SAML2 实现的网站间 SSO,其实是直接采用了 XML-Security 和 XML-Signature,效率看起来也不是很高。未来 REST 规范化和通用化过程中的安全是否也会采用这两种规范是未知的,但是加入的越多,REST 失去它高效性的优势越多。
应用设计与改造
我们的系统要么就是已经有了那些需要被发布出去的服务,要么就是刚刚设计好的服务,但是开发人员的传统设计思想让 REST 的形式被接受还需要一点时间。同时在资源型数据服务接口设计上来说按照 REST 的思想来设计相对来说要容易一些,而对于一些复杂的服务接口来说,可能勉强要去按照 REST 的风格来设计会有些牵强。这一点其实可以看看各大网站的接口就可以知道,很多网站还要传入 function 的名称作为参数,这就明显已经违背了 REST 本身的设计思路。而 SOAP 本身就是面向 RPC 来设计的,开发人员十分容易接受,所以不存在什么适应的过程。总的来说,其实还是一个老观念,适合的才是最好的
技术没有好坏,只有是不是合适,一种好的技术和思想被误用了,那么就会得到反效果。REST 和 SOAP 各自都有自己的优点,同时如果在一些场景下去改造 REST,其实就会走向 SOAP(例如安全)。
REST 对于资源型服务接口来说很合适,同时特别适合对于效率要求很高,但是对于安全要求不高的场景。而 SOAP 的成熟性可以给需要提供给多开发语言的,对于安全性要求较高的接口设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义,关键还是看应用场景。
同时很重要一点就是不要扭曲了 REST,现在很多网站都跟风去开发 REST 风格的接口,其实都是在学其形,不知其心,最后弄得不伦不类,性能上不去,安全又保证不了,徒有一个看似像模像样的皮囊。
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc0ad0b9b89243ddd87375658】。文章转载请联系作者。
评论