web取得了非凡的成就,考虑将web架构的基础原理应用到其他的同类分布式系统当中。
web如何能够成为这样成功的应用平台?他的指导原理是什么?建造分布式系统的时候,我们应该如何应用这些原理?我们能够使用哪些技术?为何感到web的设计模型很熟悉,到那时任然与以前的平台有很大的不同?企业开发者面对的挑战,web总是适当的解决方案吗?
全书的目标就是描述如何基于web的架构来建造分布式系统。而HTTP协议则利用了REST的架构原则。
1.WEB的架构
web现在是一个混合了商业,研究,政府,社会以及个人兴趣的混合体,这导致web有多种多样的用户群体。而且,人们更加趋向于使用web来满足自己各种各样的需求。与之相应地,越来越多的网站接入到web当中。
今天的web架构,就是无数的简单的,小规模的交互共同作用造成的。这些交互使用了HTTP和URL技术,在代理和资源之间通信。在这样的架构中,资源和URL扮演了主要的角色,并得到了web缓存的支持以获得可伸缩性。
可伸缩性:(http://www.infoq.com/cn/news/2007/10/whatisscalability 什么是可伸缩性,使用更大的规模以处理更多的用户数量)
缓存:http://www.infoq.com/cn/caching/
缓存对可伸缩性的影响为:缓存可以减轻服务器的压力,资源可以在HTTP的中间件比如CDN进行缓存,而不必进入到最终的服务器。这样相当于服务器可以承担更多的并发访问量。
而服务边界可以是这些服务能够使服务隔离的进化,而不会相互影响,因此提供了松耦合。
web中间件是一组广泛部署的就像是日用品一样的服务器。从明显的中间件——包含了资源的web服务器(数据计算等),到隐含的中间件——HTTP代理,缓存,内容分发网络,他们管理者传输流量。这些元素在一起,共同支持行星规模的网路系统的部署,却没有求助于错综复杂的对象模型,或负责的中间件解决方案。
中间件技术:http://soft.zdnet.com.cn/software_zone/2007/1003/534425.shtml
在这种中间件技术下面,web将重点放在了使用超媒体来移动信息和分享文档。超媒体的本质是提供了一个URL,因此就存在了404的错误。
总结:web的架构的关键词:资源,URL,缓存,web中间件,超媒体。
一句话,就是,在广泛存在的web中间件基础上,以URL来定位资源,使用超媒体驱动资源跳转的一种架构。并利用了web中间件的缓存能力提供了可伸缩性,利用服务边界来提供松耦合性。
2从资源的角度思考
资源是基于web的系统的基础建造模块,一个资源可以是任何东西,文档,视频,业务过程设置一个设备。从消费者观点看,资源是可以与消费之交互提供服务的任何东西。我们可以通过抽象,讲一些看似不可能的东西放到web上作为一个资源。
2.1资源与标识符
一个URL标识了一个资源,但是一个资源可以有多个URL。
2.2资源表述
一个表示,指的的是某个资源在某个特定时刻的状态的转化形式或者视图。这个试图被编码为一种或多种可转移的格式,例如XHMTL,Atom,XML,JSON,甚至纯文本,都好分割的值(CSV ),MP3或者JPEG。
一句话:资源的表述就是资源的形式。是个网页还是json。
对于真实世界的资源,我们通过抽象将它转化为一个信息资源。
也许有一天,我们利用3D打印直接打印出来自己想要的东西,那么这个也是个表述吧。
对一个资源的访问,我们其实是得到了资源的一个表述。也就是说URI讲表述和资源分离开来,实现了分离。这种分离,促进了后端系统和消费者应用程序之间的松耦合。它对可伸缩行性也有帮组,因为表述是可以被缓存和复制的。一个资源可以有多种表述,这些表述可以满足不同的需求,不同的表述可以通过web的内容协商(content negotiation)机制在运行时进行转换格式的协商。
web 并没有为资源的表述格式规定任何特定的结构或者格式。这样的话,一台计算机可以理解的格式,也许在另外一天计算机上无法理解。因此可以通过选取一组适当的表述格式,达到在计算机之间交互的目的。(没错是计算机和计算机之间交互,不是人和计算机的交互)
资源表述的格式支持了服务消费者的需求。然而,这种消费者的友好型并没有无限延伸至允许消费者来控制资源如何标识,演化,修改以及管理。与之相反,是由服务自身来控制他们的资源,以及资源的状态如何展现给外部世界。这种封装是web的松耦合的一个关键方面。
一句话:资源的表述需要有服务自身来提供和实现,消费者是不能够参与其中的。这种对服务的封装实现服务和需求的解耦。
2.3 表述格式和URI
资源的表述未必需要通过不同的后缀扩展名(.htm,.xml,.json)来区分,也就是说表述不需要专有的URI。Http本身可以通过Accept请求头来协商内容格式,但是这个不强制,需要资源的服务或者拥有者来决定采用社么格式回复。
2.4 通信的艺术
我们现在有资源,有URI,有表述,我们还需要有所行动,让这一切动起来。这就HTTP method。
统一接口 :少量动词如何与定义良好的且被广泛接受的语义相互结合,来满足大多数分布式应用的需要。动词的结合用来在系统之间进行通信。
HTTP 动词集合: GET POST PUT DELETE OPTIONS HEAD TRACE CONNECT PATCH
这些动词足够组成一个通用的解决方案。
除了动词之外,HTTP还定义了一个响应码集合(200,500,301,302,404,400),来协调有动词的使用所引起的交互。整体来说,动词和状态代码为在网络之上操作资源提供了一个通用的框架。举个例子,重定向(http://blog.csdn.net/newjueqi/article/details/4782602 )。
资源,URL,HTTP动词,就是我们需要与在web之上的资源交互的东西。
3.从web架构到REST架构风格
Roy Fielding在他的博士研究工作中,概括了Web的架构原理,将这些原理表现为一个架构约束的框架,或者称作一种“架构风格”。通过这个框架,Fielding描述了分布式信息系统是如何建造和运作的。他描述了资源之间的相互影响,以及在此类系统中唯一标识符的角色。他也讨论到了使用有限的一组操作和统一的语义来假造一种到处存在的基础架构,能够支持任何类型的应用。Filding将这种架构风格称作“表述性状态转移(REpresssentational stat Transfer ,REST)”。REST 描述了web作为一个分布式超媒体的应用,相互连接的资源通过交换代表资源状态的表述进行通信。
状态或者资源的状态:某一刻的资源 ,从理论上我们访问的资源只是资源当时的一个状态,因为时间在变化。
注意:web 用户不只是人,也可能是机器,软件等 。然后,参考博士论文中的状态论述:http://www.cnblogs.com/timhua/articles/2725942.html
3.1 超媒体
将超媒体作为应用状态的引擎:
超媒体可以理解为含有超链接的文本,语音,视频,图片等。引擎就是驱动,使变化。那么这句话可以简单的理解为:通过超链接在应用状态之间切换。那么问题来了,啥是应用状态?应用状态是和请求有关的信息数据,或者应用状态就是请求。这句话最终可以解释为:通过超链接跳转页面。
所以这样看起来,web的能力除了存取资源外,还可以在不同的资源之间通过超链接进行跳转。也就是说,一个资源的表述中可以插入另一个资源的URI,进而可以从一个资源导航到另一个资源,好像个寻宝的过程。这也是为啥一上网根本停不下来的原因了,因为该死的链接,根本没有尽头,完全停不下来。
总结:web的原理:
web 构建的基础是资源,web的交互是通过 资源,URI,资源表述,HTTP动词完成的。
web 资源表述的协商能力,使的可以差别化的提供服务。而服务对此的封装解耦了需求与实现。而公共的表述形式的普及,加速了web的应用普及。
web服务之间的边界使服务之间隔离可以独立演进,web中间件的cacache能力提高了系统的可伸缩性,web的超媒体提供了资源之间的连接导航能力。
REST 就是充分利用web的这些基础能力进行分布式架构的一种风格。他的核心思想是超媒体驱动。
4.Web作为一个应用平台
尽管web一开始只是信息发布平台,不过它现在已经进化成为了链接分布式应用的手段。web作为一个平台具有这些特点:架构简单,广泛实现和认同的HTTP协议,无所不在的公共表述格式。web不仅仅是一个成功的大规模信息系统,而且可以作为一个平台来支持服务的生态系统。(大平台,小服务)
REST 设计Demo:
http://www.easemob.com/docs/rest/ 这里环信对自己的资源设计做了介绍,很具有参考价值。
参考:
http://www.infoq.com/cn/articles/understanding-restful-style
http://www.infoq.com/cn/articles/how-to-design-a-good-restful-api