阿里巴巴集团B2B子公司技术专家李锟:没有万能的银弹式架构REST

【CSDN现场报道】2010年12月9日,年度收官技术盛宴SD2.0大会在上海光大会展中心国际大酒店隆重开幕。这是自2007年成功举办首届以来,由CSDN和《程序员》杂志主办的连续第四届SD2.0(软件开发2.0)大会。来自IBM、微软、盛大、FaceBook、阿里巴巴等众多企业的技术领袖全部汇聚,共同剖析当前IT技术发展大势,分享在各自领域的技术成就与成功秘诀。

阿里巴巴集团B2B子公司技术专家李锟,在大会现场做题为《REST与面向资源的Web开发》的主题演讲。

阿里巴巴集团B2B子公司技术专家李锟做大会演讲

以下是演讲实录:

李锟:今天我跟大家分享的话题是REST与面向资源的Web开发,副标题是深入理解Web的架构风格,今天的演讲是最后一位的演讲,现在下面基本是满座的状态,大家的精神很好,所以我感觉非常欣慰。今天这个话题对大家来说可能是比较抽象的,但是这个话题对做Web开发来说非常重要,前面听到了有很多老师讲云计算,讲虚拟化,还有讲淘宝开放平台,这些都是非常大的话题,我今天讲REST,相对来说是一个比较小的话题,REST大家觉得这个东西跟大家关系不大,但是其实跟阳光和空气一样就存在于大家身边,有的时候突然感觉到你身边有一些人,有你的亲人你的父母他们一直对你非常好,但是你给他们的付出很少,很多你身边的跟你密切的人你并不真正了解他,对于REST也是这样,今天讲座主要有这些内容,在开讲座之前首先自我介绍。

大家需要记住的第一个我是一本书的翻译作者,大家可以加入我们的讨论组进行深入讨论,大家可能对REST开发有很多期望,有些话说在前头,在演讲里面你们会听到,这个演讲并不是实战性的,看不到源代码,我讲REST是什么,不会讲为什么采用REST架构风格?如何采用REST架构作开发?REST是内涵非常丰富的架构概念,如果有足够时间讲清楚REST是什么?对大家来说已经足够大了,如果大家感兴趣到明年或者后年也许我可以做后续讲座,比如大家对REST安全性,REST与AJAX的关系,REST与MOBILEAPP的关系,我仍然可以跟大家分享。在演讲过程中保持一个轻松开放的心态,提高抽象思维的能力,展开丰富的想象力,重要的是保持大局观,首先掌握全貌而不是深入细节。通过这个演讲您可以期待的是正本清源,从根本上理解Web架构风格,开阔思路提高分布式应用架构设计水平。

下面首先我提一个问题,什么是Web?在座的有没有人可以清晰地给出一个Web的定义?

主持人:我解释一下,Web本身三W缩写,基于STTB协议的和传输协议的,然后是STML呈现的,基于浏览器来浏览的。

李锟:这些都是Web,但是它们只是Web的一部分,今天大家听了我的演讲之后,大家对究竟什么是Web会更加清晰。首先是万维网,有人想到浏览器,HTML,AJAX,FLASH,Web2.0,这些属于Web,我们做技术出身,所以从技术角度来考虑一下究竟什么是Web?从技术角度理解Web有三大基石,第一是URI,标识资源,第二个HTTP操作资源,第三个HYPERTEXT抄文本,描述资源的状态,抄文本也可以有XML JSON或者纯文本。下面我们给Web应用下一个定义,究竟什么是Web应用?首先要使用三大技术,其次是运行在英特耐特环境中,而不是运行在局域网、内网环境,Web应用名词与企业应用相对应。Web应用有两种广义和狭义的两种定义,广义Web应用包括了所有使用上述三大技术的应用,狭义的Web应用仅仅包括在浏览器中应用,狭义的应用和桌面名词相对应。下面我介绍一下什么是架构风格?REST其实是一种架构风格,这个概念来自于建筑学,比架构更加抽象的概念,架构风格和架构之间的关系可以做类别,接口实现或者类实例关系一样,架构风格是一种研究和评价软件架构设计的方法,架构风格这种研究方法建立在两个前提之上,第一个前提就是软件的架构设计,必须要考虑其运行的环境,软件架构并不是纸面上源代码结构,大家可以画一个图,大家认为漂亮的图认为是软件架构,在运行时的架构才是源代码架构。

第二个是脱离开运行环境的上下文,无法评价架构的优劣,不考虑两种环境具体上下文没有办法对两种架构比较,所以不存在包治百病的银弹式架构,向你推荐包治百病的银弹架构,这些架构不存在的。下面看一些建筑中的架构风格,这个是拜占廷风格,这个叫罗曼风格,这个叫做哥特风格,这个叫做巴罗克风格,这四种风格在意大利最常见的建筑风格,在中国也有建筑风格,比如这种老北京四合院的风格,现在北京人已经很难见到了,下面风格是江南民居的风格,在江南水乡里面经常可以看到。我们同建筑风格能够得到哪些教育?这些建筑架构风格都是不同的,而且如果某一个地方因为历史原因,还有地理原因,已经形成了某种风格的建筑群落,你在这个地方修建另外一种完全不同的架构风格的建筑,肯定会破坏这个地方整体外观,比如你在苏州的拙政园旁边修建一座哥特式风格的建筑,肯定是对苏州的拙政园的整体风格造成很大损害,如果在苏州修了很多哥特式的,还有罗曼的拜占庭风格,那么有一天大家不想去苏州看园林,因为已经搞了一塌糊涂。

我们再看软件的架构风格,一种架构风格由一种相互协作架构约束来定义,架构约束指的是运行环境施加在架构设计之上的约束,刚才举的例子在苏州架构风格里面不可能再建其他建筑,因为运行环境对架构的风格提出了很多约束,如果建其他很多架构会破坏这个地方整体风貌。然后有一些常见分布式应用架构风格,主要有三大类,第一类是分布式对象,包括CORBA、DCOM,REMOTING,还有一种远程过程调用,简称RPC,比如SOAP、JSON等。第三种表述性状态转移,简称REST,这是我们详细探讨的一种新的架构风格。首先REST是一个缩写,中文翻译成为表述性状态转移,REST来自ROY FIELDING博士论文,中文名字叫架构风格与基于网络的软件架构设计,作者是DAY Software公司的首席科学家,是APACHE软件基金会的合作创始人,在美国加州大学欧文分校获得博士学位,他和一些人创建了Web的体系架构,在我们REST讨论组里面有这篇论文的导读,REST是Web自身的架构风格,Web这样一种世界上最大分布式应用,它的架构风格是REST,REST还是Web之所以取得成功架构因素的总结,这些设计Web标准的人取得了很大成功以后,有什么因素取得成功,有哪些因素取得成功?如果破坏因素之后可能Web不会取得成功,他们经过一段时间以后,把这些研究总结出来加入风格就是REST。所以REST是世界上最成功的架构风格,主要的成功案例就是Web。

REST在英特耐特环境超媒体系统量身定制,需要注意三个部分,第一在英特耐特环境里面,第二部分在分布式系统,第三部分使用了超媒体,首先我们看一下英特耐特环境,有很多特点,其中有重要的两个特点,第一个特点可伸缩性无法控制,可能建造一个网站第一月访问量非常小,经过了一番推广之后,它的访问流量突然爆增,但是爆增之后仍然有可能会突然减少,明天它的访问量到底多大?是设计者无法控制,安全性也是设计者也是无法控制,不能控制数据包是什么格式?也可能有漏洞,被人发现,发过来一个不安全包导致网站无法工作。对于面向英特耐特环境Web应用,架构设计考虑两个方面,一个是可伸缩性,另外一方面是安全性。REST还是HTTP1.1等Web标准设计指导原理。HTTP1.1为实现REST风格架构而设计,新的Web标准的设计必须符合REST的要求,否则整个Web的架构会因为引入严重的内矛盾而崩溃,比如苏州建筑风格旁边再修建其他建筑设计,这样导致苏州原来的架构风格不复存在。所有的Web应用都应该遵守的架构设计原理,不是必须要遵守的法律条文,是诱导而不是强迫,甚至在某种程度上可能还运行更好,但是如果遵守Web架构风格可以得到很多好处。

下面看看REST架构风格有哪些架构约束?第一个架构约束是客户服务器,通信只能由客户端单方面发起,表现为请求响应的形式。第二个架构约束是无状态,通信的会话状态全部由客户端负责维护,服务器端负责维护会话状态之外的其他状态,第三个缓存,响应内容可以在通信链条某处被缓冲,以改善效率。第四个统一接口,通信组件之间要有统一接口,以提高交互的可见性,这样的话中间组件对请求语义非常清楚,很方便做一些缓存或者实施安全策略。第五个架构约束是分层系统,通过限制组件行为,将架构分解为若干等级的层,每一个组件看到与其交互的相邻层,这个大家如果熟悉,在通信链条当中插入很多中间的组件,每个组件能够看到和它直接交互的相连的层。最后一个架构约束是按需代码,通过下载并执行APPLET或者脚本形式的代码,允许对客户端功能进行扩展。这是我们每天遇到的,APPLET形式或者脚本形式代码扩充客户端功能,但是在理解了REST的6个架构约束之后,仍然并不能够完全理解REST究竟代表的是什么?要深入理解REST,还需要REST五个关键词,第一个关键词叫做资源,第二个关键词是资源的表述,第三个关键词是状态转移,第四个关键词是统一接口,第五个关键词最难理解的叫做超文本驱动,将超媒体作为应用状态的引擎,超媒体相当于超文本加上媒体内容,作为一个整体叫超媒体。

下面看一下究竟什么是资源?资源是一种看待服务器的方式,将服务器看作由很多的离散的资源组成,这种看待服务器的方式和分布式对象有很明显的分别,分布式对象看作一个对象,每个对象里面有调用的方法,REST看作是很多离散的资源,资源是服务器一个可以命名的抽象的概念,资源是一个抽象的概念,大家可能原来理解的资源仅仅是服务器的文件或者仅仅是一张表,但是资源是抽象的,资源以名词为核心的特征,首先关注的是名词,资源面向对象编程中的接口,暴露给外界的接口,资源由一个或者多个URI标识,URI是资源的名词,也是资源在Web上的地址,允许使用多个URI标识同一资源,对资源感兴趣的客户通过URI与资源交互。下面看一下什么是资源表述?它是一段对于资源在某一个特定时刻的状态描述,资源表述可以在客户和服务器之间转移,资源表述有多种格式,最常见的是HTML/XML/JSON纯文本,资源表述格式可以通过协商机制来确定。通常来说不同方向表述使用的是不同的格式,服务器到客户端,客户端到服务器端表述不一样。

下面看一下什么是状态转移?状态转移与状态迁移的含义不同,我分析了很长时间,把状态转移和状态迁移是同样的含义,但是实际上不一样,状态转移是讲在客户端和服务器之间转移代表资源状态的表述,通过转移和操作资源的表述来间接实现操作资源的目的,在REST架构风格里面操作资源是一种间接方式进行,是通过操作资源表述间接实现操作资源的目的,但是在分布式对象和IPC里面对于服务器里面暴露出来的对象或者方法是直接的操作。下面看一下什么是统一接口?统一接口是对资源执行各种操作,对每一个资源只能执行一组有限的操作,这个和分布式对象不一样,HTTP定义了操作资源统一接口,包括以下内容,首先是8个标准方法,GET、POST、PUT、DELETE五、HEAD等,后面的四个方法很少用到,基本用前面四个方法。HTTP头信息里面做开发的时候可以自定义新的信息。还有一部分HTTP响应状态代码,在协议里面有很多代码,在开发当中也可以自定义新的代码。统一接口操作的语义必须由HTTP消息体之前的部分完全表达,如果做操作或者消息体之内,不符合统一接口要求,统一要求必须在HTTP消息体之前的部分完全表达。

下面看一下什么是超文本驱动?是理解REST最困难最关键的一个方面,如果不理解超文本驱动,就相当于完全没有理解REST。超文本驱动首先是将Web应用看作是一个由很多状态所组成的有限状态机,这些状态既包括客户端负责维护,也包括资源状态,整个状态合在一起应用状态,资源之间通过超链接相互关联,超链接既代表资源之间的相互关系,也代表可执行的状态迁移。超媒体不仅仅包含数据,还包含了状态迁移语义。以超媒体作为引擎驱动Web应用的状态迁移,超媒体通过超媒体暴露出服务器所提供的资源,服务器提供哪些资源是客户端通过解析超媒体发现的,而不是实现定义的?这种方式和HTTP有巨大差别,REST提供资源是事后发起,而不是事先定义。从面向对象角度看,超媒体定义服务器所提供的服务协议,REST这种风格也可以暴露SUI的服务,客户端应该依赖的是超媒体的状态迁移语义,而不应该对于是否存在某个URI的某种特殊构造方式作出假设,一切都有可能变化,只有超媒体的状态迁移语义长期保持稳定,这些都是超媒体驱动含义,大家要理解需要思维的跨越,这种风格和IPC风格差距非常巨大,现在流行的EPI绝大多数都没有实现超媒体驱动,可能到08年的时候逐渐被大家理解,因为2008年的时候,有一篇文章REST必须是超软驱动。

理解了REST6个架构约束还有5个关键词之后,总结一下REST架构有哪些主要特征?第一个特征是可寻址性,REST有很多资源组成,每个资源至少有一个URI,代表了一个地址,所以RESTWeb应用架构可寻址的,第二个特征是无状态性,规划的状态完全由客户端维护,第三个特征是连通性,这种REST风格的架构必须要保证资源之间连通性,通过超链接相互连接,设计REST架构,其中存在大量孤立资源,彼此之间完全不连通,这种架构设计是非常失败,一定要通过超链接连接起来。下面主要特征是统一接口,无论是任何资源都是由统一接口操作。还有一个主要特征面向资源,REST架构风格以资源为核心进行设计,首先重要的是如何实现这些资源?还有一个主要特征就是超文本驱动,通过超文本来驱动Web应用的迁移,以上的特征合在一起最后达到效果,就是松耦合,REST架构风格总松的,分布式架构是紧的。

关于HTTP的一些误解,首先认为浏览器只支持GET/POST方法,HTML表单仅仅支持GET/PO四T方法,但是可以通过附加参数的方式模拟PUT请求,发送到服务器之后,把这个请求理解为PUT的请求,对于XMLHTTPREQUEST五对象支持POST等4种方法。还有一个误用HTTP方法。GET方法是安全的,不会对资源造成任何改变,幂等的,服务器端可以做一些日志,但是客户端不能观察到,对于观察到改变来说,不管发送多少资源请求得到结果一样,POST请求不安全的,但是不幂等的,服务器资源改变采用累计的方式完成,举个例子,在服务器端有一个总金额资源,当天值是10,我想改变它的值30,我发POST请求,直接设为10,这种做法是幂等的,不管什么请求得到的服务器结果是一样的,另外一种方法,在原来基础上10再加上两次,最后也得到30,这是PUT方法,但是不幂等,发送一个、两个,十个得到方法不一样,在浏览器刷新POST方法,浏览器提示你是不是需要真的刷新页面,因为刷新页面可能对服务器造成负作用。还有一种误解就是过度使用GET方法,在后面加上问号,把任何操作都使用GET方法发送,主要有两个缺点,第一个缺点敏感信息位于URL里面不够安全。第二个缺点很容易受到爬虫的伤害,做一个网站爬虫来网站做一个链接。比如做得事情删除服务器端,数据库里面一个用户的数据,这个时候你的网站被爬虫爬过之后,会发现你的数据库里面有很多用户数据没有了。还有一种是过度使用POST方法,最典型的是SOAP等RPC风格的调用协议,没有用到其他方法,一个缺点承担了过多职责,没有充分利用HTTP的优点,没有使用HTTP状态代码,根本没有充分利用HTTP的优点。

还有一种误解认为HTTP是RPC风格,因为HTTP调用协议和远程协议非常相似,其实HTTP是REST风格调用协议,主要区别有没有使用统一接口?在REST架构风格里面使用统一接口使用资源,因为采用统一接口,所以在HTTP链条之中插入很多HTTP缓存,插入大量HTTP缓存之后,有效提高Web应用可伸缩性,大家做分布式应用很难理解,为什么基于文本可伸缩性有些比HTTP风格更好?主要因为REST使用了统一接口,这样得到缓存支持,但是对于HTTP很难以统一的方式实现缓存。REST风格架构更容易实现大粒度的交互,不要涉及到非常细的调用,对于基于网络应用系统损害非常大。HTTP风格协议因为跟本地调用非常相似,所以一些架构经常涉及系统里面远程调用,但是REST采用间接方式,所以更容易实现大粒度交互。还有一种误解认为HTTP是传输协议,之所以有这种误解,是因为HTTP协议很长时间错误翻译为超文本传输协议,但是事实上HTTP是转移协议,HTTP之下TCP是传输协议,它工作做得很好,没有HTTP做传输事情。传输协议做的是底层搬运比特之类的苦力活,不包含操作语义,所以HTTP都是转移协议,不是传输协议。

还有一个常见误解认为HTTP过于简陋,不具有操作性,可以支持异构系统之间互相操作,这是因为有很多专家认为HTTP不具备操作性,所以他们设计了SOAP协议,这个协议里面S代表的是简单,但是实际上SOAP是复杂的协议,而且本身不能单独使用,必须要结合WS协议和复杂的协议结合在一起才能使用,所以SOAP是非常复杂协议,大家能够充分利用好HTTP已经足够得到可行性,如果大家做过SOAP开发,客户端和服务器端两边版本必须是一样的,这样才能互操作,但是使用HTTP使用任意语言,只要支持HTTP,两边很容易实现操作。

下面澄清关于REST的误解,第一个误解认为REST只适用于面向机器的Web应用,不适用面向人类的Web应用。但是事实上REST在Web上面普遍适用,只要开发广义的Web应用可以采用REST的架构风格。第二个误解认为直接使用HTTP的API就是REST API,这是大家看到混淆,就算没有SOAP,在SOAP和REST之间有广大的中间地带,要成为严格意义上的STFUL API很困难,是混合物,另外一种认为REST是更加漂亮的设计,大家听了我的演讲大家会理解,这个仅仅是REST一个特征而已,并不是REST的本质特征。

还有一些常见的问题认为统一接口和超文本驱动都不重要,但是事实上这两个方面是REST风格的核心特征,如果没有这两个特征可以确定肯定不是REST API。大家听了之后可以识别一下现在互联网上流行的REST API。最后一个问题认为统一接口只能使用HTTP实现。但是事实上HTTP仅仅是实现REST的一种方式,REST其实是分布式应用架构设计的一个思想,这种思想很一致的,并不一定非要使用HTTP实现,还有符合统一接口要求的例子,常见的例子有一个扩展HTTP的WebDAV协议,如果大家访问服务器,通过WebDAV访问代码库,也是符合访问要求,也不一定要基于HTTP协议访问,现在涉及下一代协议,肯定符合REST风格,可能与HTTP不同的另外一个协议。

最后我们看一下在互联网上有哪些可以称之为REST风格的Web应用?在互联网上有很多REST的Web应用,但是绝大多数是国外应用,国内应用并不多,大家看一下这里面的图(PPT),这是里面最有名的几个REST的Web风格应用,随着大家对REST风格深入,我们会看到越来越的Web架构应用,最后面是REST相关的资料,重要的是FIELDING的博士论文,这篇博士论文对于作分布式应用架构设计是非常有帮助的,还有Web标准的协议,比如HTTP1.1协议,还有HTTP身份认证协议,JSS是基于Web开发,这里有很多文章大家看一下。REST开发图书有10几本,我给大家推荐三本书,第一本有中文版,第二本、第三本现在中文版正在翻译,这里隆重推荐的是RESTFUL IN PRACTICE。

下面是提问环节,大家对REST有什么问题可以提出。

提问者:我问一下你提到REST提到无状态性,是不是我理解为没有做一个概念?

李锟:购物车有很多方法,定义为资源,然后把状态定义为是一个保存资源状态,保存在服务器资源库里面。

提问者:我只要在客户端里面,假设类似ID可以了?

李锟:ID仍然是对服务器端状态类似与指针东西,应该把这个状态本身也保存在客户端,就算你在客户端服务器端也不符合要求。一种做法把这种状态的数据全部保存在客户端里面,如果你觉得不安全,比如购物车定义为资源,然后把它的状态保存在服务器端数据库里面,这两种做法都是符合REST的要求。

提问者:我听了以后启发很大,您频繁说到超文本驱动?能不能举个例子。

李锟:可以想象平常用浏览器访问如淘宝网,你用浏览器首先打开淘宝网首页,在淘宝网里面搜索东西,输入一段你要的东西,点击其中某个结果,这种做法并没有办法实现预知淘宝网上面的URL,给你一个超文本,有很多链接,有很多语义,人类可以理解,你明白这个链接,点了一个链接,触发了一个迁移,到下一个状态,这种就是超文本驱动,对于人类用户来说是有效的,同样对于Web服务,对于机器客户端应用也可以是有效的。

提问者:你列了一个图国外符合REST风格应用,为什么要符合REST风格?为什么国内新浪网没有?哪里看出?

李锟:充分利用了REST机制,正确使用了四种方法,利用了HTTP内容上的机制,利用了HTTP同情心,正确使用了HTTP的代码,这个符合REST的要求。

提问者:请问一下采用从投资角度来说,让我的团队技术方面采用REST,需要多大投资成本?第二个问题我就算下了这样的成本做了这样的事情,效果从商业角度来说有多大?

李锟:如果采用REST的风格来建造Web应用,或者是建造Web服务,你的这个网站或者Web服务,它的能够得到很多好处,一个是可伸缩性更好,第二个好处就是这样一种Web应用或者Web服务非常容易建造,别人很容易把你的应用和其他网站结合在一起,第三个好处对于客户端来说有更好的可融性,编程模型非常简单,至于能不能收回商业上面的投入,REST这个思想非常直接的,也不需要它的学习曲线并不高,根据我的经验一般一个Web开发人员,如果熟悉Web开发框架,他在学习REST开发框架,通常来说两三天一般可以学会,现在一些主流语言很好支持REST开发。

主持人:REST更多说ERP设计方面,如果不考虑对Web内部的架构有用吗?

李锟:在企业内部比如SOA场景,国外已经有很多人在SOA场景里面抛弃基于SOAP很笨重协议,在国外采用SOA方式,最典型的例子是ABM,有很多产品,以前因为历史原因全部暴露出来协议,现在大多数通过两种方式,一种产品方式,一种暴露方式协议,大多数人员采用REST方式。

最后大家直接想到浏览器是最符合要求的Web应用,大家以后在设计分布式应用架构的时候,想想浏览器是如何工作的?无论开发的是Web应用还是Web服务,模仿浏览器的工作方式都是值得推荐的做法,最后希望大家向我一样拥抱Web架构风格,融入Web,成为Web的一部分,谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值