`
robbin
  • 浏览: 4799485 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:135756
社区版块
存档分类
最新评论

从分布式系统的角度看REST

    博客分类:
  • Tech
阅读更多
上周末在杭州网侠大会做了关于REST的演讲。会后经过一些交流,特别是今天在msn上面和dlee的交流,感觉自己对于REST的理解更深入了一层。

我们说REST架构风格,从REST具备的内在特征来说,它包括了这些特征:

1、基于HTTP的资源
2、以HTTP协议去操作
3、数据和表象分离

但是如果我们换一个角度,即分布式应用系统的角度来看,我们会有一些更有意思的结论:

分布式应用系统的架构,经历了好几代的变迁,我们来简单回顾一下:

1、基于CORBA协议的C++中间件时代
CORBA时代我还在上学,基本上没有怎么接触过Corba编程。曾经有一次我提供EJB培训的客户,正在进行传统Corba架构向EJB2架构迁移,通过和他们的交流,对Corba多了一些了解。当时就感叹,和EJB2相比,Corba实在太难用了。Corba时代在1998年EJB1.0发布以后,就逐渐淡出历史舞台了。

2、基于RMI/IIOP协议的EJB时代
这个时代开始于1998年,到现在基本上已经划上了句号。其实在EJB出现以前,在1996年Microsoft发布WindowsNT4.0以后,Microsoft当时也提出了自己的分布式架构,即MTS,但是MTS的光辉被随后出现的伟大的EJB技术彻底击败,此后,就拉开了Java的应用服务器时代,BEA也是在这个时代的转折点成长起来的。

不管是Corba,还是EJB,都有一些共同点:
1) 通过专有的网络协议通讯
2) 不能跨平台调用
3) 通过分布式对象调用来实现分布式架构,换句话来说就是,分布式架构是绑定在面向对象的机制上的

分布式对象架构的缺陷在EJB2时代被充分暴露了出来,乃至于Martin Folwer在《企业应用架构模式》当中强调,分布式调用的第一原则就是不要分布式。更多关于EJB2分布式对象架构的缺陷在Rod Johnson的《J2EE without EJB》当中被剖析的更加清楚。

3、基于SOAP协议的Web Services时代
这个时代始于2001年Microsoft公司推出dotnet平台,整个行业开始鼓吹Web Services。中间经历了一次低潮之后,在IBM,BEA成功的联手炒作SOA之后,再次王者归来。

web services有一些明显不同于Corba和EJB分布式对象架构的特征:
1) 通过标准SOAP协议通讯,一般走HTTP通道
2) 能够跨平台调用
3) 通讯格式是xml文本,而不是二进制数据格式
4) 通过RPC机制来实现分布式调用,而不是通过面向对象机制实现分布式调用

web services的优点和缺点都非常突出,这个不是本文的要点,不做具体分析。这里唯一要强调的是SOAP协议并不依赖于HTTP。事实上SOAP协议可以走很多底层协议,例如SMTP协议,Jabber协议等等。

REST也是一种分布式系统的架构风格,那么REST和上面这些分布式架构有哪些明显的区别呢?
1) REST走的是HTTP协议,并且充分利用或者说极端依赖HTTP协议
Corba和EJB是采用专有的二进制协议,SOAP可以但不依赖HTTP,并且仅仅使用HTTP POST。
2) REST是基于HTTP抽象资源的分布式调用,换句话来说,就是分布式调用是绑定在资源的操作上面的。

通过上面的总结,我们可以做一个直观的对比表格:

分布式架构       协议             调用方式
-------------------------------------------------------
Corba架构        专有二进制协议      对象的CRUD操作
EJB架构          专有二进制协议      对象的CRUD操作
Web Services     SOAP协议            RPC方式
REST             HTTP协议            对资源的CRUD操作
--------------------------------------------------------


REST最大的特点是什么呢?REST是为通过HTTP协议来进行分布式调用量身定造的架构

传统上,我们开发一个非分布式的软件系统,使用OO进行建模和架构,无往而不利。但是分布式对象却显得不那么有效。对于跨进程的调用,也许我们需要探索更好的面向对象的分布式调用架构。

REST是专门为分布式调用设计的架构,在REST里面,分布式是通过对资源的操作来实现的,不是像EJB那样通过对象的方法调用来实现的。资源是一种抽象的概念,资源被映射到相应的一套URL规则上面了。所以资源只和URL相关,而与具体实现无关,因此REST具有更好的解藕性。在RoR的实现当中,你可以把一些资源直接映射到model对象上面去,也可以不映射到model上面,而完全是由业务逻辑组合的抽象资源。

分享到:
评论
88 楼 jacking124 2013-01-02  
嗯,robbin大哥,我有一个问题咨询一下的,我公司目前有一个维护系统的,用的蓝宝石的bes服务器,现在这个公司被收购了,其产品也不更新了,我想有什么可以产品可以代替它,我的系统是ejb开发的!!
87 楼 Lordaeron 2007-06-20  
ozzzzzz 写道
Lordaeron 写道
ozzzzzz 写道
前面Lordaeron很能代表水平的两个发言那里去了?
就是那个什么HTTP是载体的。多高的水平啊,删除了怎么反应这个人的能力呢?只有前后联系起来一起看,才能知道他究竟是有多强的水平。
强!

要比水平, 你有興趣當然是會接受的.
你的水平是多少呢?

本人对比谁高谁低完全没有兴趣。只是本人觉得你前两个发言实在是精彩异常,被删除了实在是可惜。而这些讨论,本人实在不敢复述。而如果只是我看见了,我实在是为广大javaeye众感到万分可惜。

有些人一言堂習慣了, 是無法改變的.
86 楼 Lordaeron 2007-06-20  
回顧一下, 某些人的銘言REST, 但從未講出REST 實作後的樣子, REST 是個什麼樣的東西呢?

http://en.wikipedia.org/wiki/Representational_State_Transfer
簡單的講, 它就是使用Http, 甚至會再extend http. 以使用http  的gramma  來作為distributed system 的protocol.
主要主張為http 提供了 proxy, cache, 和tunnel 等等方式, 可以讓REST 暢通無阻的在internet/intranet 裏運行.
而使用http 就可以用現有的介面, 而不用像現在的RPC 系統一樣, 有各自的semantic. 還可以重新定義URI, 令整個distributed system 看起來可以像DNS 的行為一樣.
可以進行message 的轉送.

題外話:
就像fielding 主張WebDAV 的drawback, 說因為它用了http 來packing 它自己的message, firewall 可以很容易的設計出filter 來將它擋掉.
[我說]但softether 就用http 來packing tcp/udp protocol 了, 有幾個firewall 擋得了?

回正題:
它們一直在bull RPC 的問題, 在於原作fielding 對RPC 根本的不了解, 更別說在這主張RPC 已死的人.
http 是protocol level 的東西, RPC 是concept level 的東西, 拿這兩個東西來相比, 有點風馬牛不相及.

RPC 定義:
--------------------------------------------------------
Remote Procedure Call (RPC) is a protocol that one program can use to request a service from a program located in another computer in a network without having to understand network details.
RPC uses the client/server model. The requesting program is a client and the service-providing program is the server. Like a regular or local procedure call, an RPC is a synchronous operation requiring the requesting program to be suspended until the results of the remote procedure are returned. However, the use of lightweight processes or threads that share the same address space allows multiple RPCs to be performed concurrently.
----------------------------------------------------


fielding 的更有趣的一個主張:
----------------------------------------------------
People often mistakenly refer to HTTP as a remote procedure call (RPC) [23] mechanism simply because it involves requests and responses.
----------------------------------------------------
RPC 在protocol level(IIOP,RMI,DCOM) 說穿了, 不過就是接收的server 收到一串字串(C 的), 然後分柝裏面的內容, 再按照內容辨事. 和它的REST 我實在是在protocol level 看不出有何不同?


http://tools.ietf.org/id/draft-ietf-atompub-protocol-15.txt
這裏有一份IBM 的restful protocol, 有興趣者, 自已去究. 看定義出來的東西在作什麼.

題外話:
已經有類似能力的Distributed system 當然首先要講的是
DNS, 另外就是IBM 的SNA 也有. 要講近期的, FIX protocol 也有類似的能力.

咦, 一言堂到要封掉我的post 囉.
哈...............
85 楼 ozzzzzz 2007-06-20  
Lordaeron 写道
ozzzzzz 写道
前面Lordaeron很能代表水平的两个发言那里去了?
就是那个什么HTTP是载体的。多高的水平啊,删除了怎么反应这个人的能力呢?只有前后联系起来一起看,才能知道他究竟是有多强的水平。
强!

要比水平, 你有興趣當然是會接受的.
你的水平是多少呢?

本人对比谁高谁低完全没有兴趣。只是本人觉得你前两个发言实在是精彩异常,被删除了实在是可惜。而这些讨论,本人实在不敢复述。而如果只是我看见了,我实在是为广大javaeye众感到万分可惜。
84 楼 Lordaeron 2007-06-20  
ozzzzzz 写道
前面Lordaeron很能代表水平的两个发言那里去了?
就是那个什么HTTP是载体的。多高的水平啊,删除了怎么反应这个人的能力呢?只有前后联系起来一起看,才能知道他究竟是有多强的水平。
强!

要比水平, 你有興趣當然是會接受的.
你的水平是多少呢?
83 楼 zjlee 2007-06-20  
支持Lordaeron
82 楼 fangzhouxing 2007-06-20  
好好的技术讨论氛围,让Lordaeron给搅了,不管你的水平如何,很不欣赏你的。。。
81 楼 ozzzzzz 2007-06-20  
前面Lordaeron很能代表水平的两个发言那里去了?
就是那个什么HTTP是载体的。多高的水平啊,删除了怎么反应这个人的能力呢?只有前后联系起来一起看,才能知道他究竟是有多强的水平。
强!
80 楼 Lordaeron 2007-06-19  
http://en.wikipedia.org/wiki/Representational_State_Transfer
REST versus RPC 這一段, 如果有人對DNS 的行為有認識的
話, 應該會知它在打什麼主意
79 楼 Lordaeron 2007-06-19  
差點忘了一件事.
我一開始只講出了.
一個人連Corba/J2ee 是什麼都搞不清楚, 他引申下來的
也沒什麼好講. that's all.
以後REST 被檢驗時, 會不會被歸類到RPC 和
要說什麼REST 會被大規模應用.
我們還有半年的時間, 大家慢慢看. 事實勝於雄辯.
78 楼 Lordaeron 2007-06-18  
http://www.restlet.org/documentation/1.0/tutorial
一個將http 這個載台拿來作別的用法.
就正如該訪問一下, 否定rails 用POST的作法, 覺得
自己用PUT 會更好.
來, 哪位自認http protocol 比我還熟的, 講一下
POST 和PUT 的差異吧.

protocol 是一個載台, 要怎麼用, 是你家的事.
就像softether 就拿http 來載tcp/udp packet.
77 楼 winterwolf 2007-06-18  
能说明问题就可以 不要太复杂
76 楼 winterwolf 2007-06-18  
楼上做分布开发经验丰富 能否拿出一个具体的例子比如某种分布应用

dlee用rest去设计一下如何实现

Lordaeron用corda或其他技术设计一下

然后我们再继续讨论
75 楼 Lordaeron 2007-06-18  
xly_971223 写道
Lordaeron是不是来吵架的?
就是论事别撤没用的

哦. 就事論事?
誰在就事論事, 誰在講笑話?
你有本事來判定?
74 楼 xly_971223 2007-06-18  
Lordaeron是不是来吵架的?
就是论事别撤没用的
73 楼 江南白衣 2007-06-18  
Lordaeron 写道
在你的案子裏就可以拿來當大多數, 你是以偏蓋全還是自大?
你到底搞清楚RPC 的定義了嗎?
http://www.pcmag.com/encyclopedia_term/0,2542,t=RPC&i=50652,00.asp
(Remote Procedure Call) A programming interface that allows one program to use the services of another program in a remote machine. The calling program sends a message and data to the remote program, which is executed, and results are passed back to the calling program.

PC Magazine 不能力的話
http://searchwebservices.techtarget.com/sDefinition/0,,sid26_gci214272,00.html

名詞的基礎要搞清楚再出來和別人討論, 這是基本的禮貌.
一個連名詞都搞不清楚的人, 連討論的價值都沒有.
特別是REST. 作者連基礎都錯, 別跟我講它的引申會對.


看来你没有仔细看我举的两个例子,两个例子里REST是截然不同的地位。

dlee花那么多精力又是翻译又是发文,只是希望大家多了解一点REST的知识,这份推广的热心值得大家支持,现在中国的技术推广者还是太少了!!

但推广一个新技术的时候,不加定语修饰的将所有旧技术钉死也是危险的:)

BTW.http://searchwebservices.techtarget.com/sDefinition/0,,sid26_gci214272,00.html 里的RPC定义,和大家理解的没什么不同,没什么相悖的地方啊,client/server,synchronous ,stub,都是熟悉的字眼。
72 楼 dlee 2007-06-18  
嘿嘿。

我说:“其实我跨栏很牛的”,刘翔笑了。
刘翔说:“如果我要是打篮球,估计也能去NBA”,姚明笑了。
姚明说:“HTTP那玩艺儿太简单了,我最熟了”,Fielding笑了。
71 楼 Lordaeron 2007-06-17  
江南白衣 写道
我之前参与的电信认证计费项目,critical的代码用C++,业务管理的代码用Java,还有一些shell脚本写的任务,算是比较典型的分布式调用情景:

主力的同步调用方案是BEA Tuxedo,异步用IBM MQ,Java内部则是EJB和JMS(一个Weblogic搞定),对外的接口主要是WebService和FTP,另有少量的Socket接口,而旧版系统用Corba连。

在这个生态圈里,REST如果要替换,只能是替换少量外围没有跑WS-*标准的WebService和某些简易Socket接口,大部分的用例里都没有它插手的份儿。而且,整个系统基本上是面向消息而不是面向RPC的,Function在这里主要充当的是Channel的角色。所以,这里dlee说的RPC风格逐渐过时没有错,但和REST将成为主流又没有直接联系。

而最近参与的一个系统,要做一个公共数据服务平台,REST就发市了,我打算利用某个ESB引擎发布WebService/REST双接口,适用不同AP的技术水平和效率要求。设计的过程中dlee给了我很多建议和指导。

所以,我觉得大家火冒三丈的争论没有任何意义,大家先把讨论的场景、前提搞好了再讨论才互有长进,否则口舌之争,吵赢了对方,自己身上又不会长块肉。

在你的案子裏就可以拿來當大多數, 你是以偏蓋全還是自大?
你到底搞清楚RPC 的定義了嗎?
http://www.pcmag.com/encyclopedia_term/0,2542,t=RPC&i=50652,00.asp
(Remote Procedure Call) A programming interface that allows one program to use the services of another program in a remote machine. The calling program sends a message and data to the remote program, which is executed, and results are passed back to the calling program.

PC Magazine 不能力的話
http://searchwebservices.techtarget.com/sDefinition/0,,sid26_gci214272,00.html

名詞的基礎要搞清楚再出來和別人討論, 這是基本的禮貌.
一個連名詞都搞不清楚的人, 連討論的價值都沒有.
特別是REST. 作者連基礎都錯, 別跟我講它的引申會對.
70 楼 江南白衣 2007-06-17  
我之前参与的电信认证计费项目,critical的代码用C++,业务管理的代码用Java,还有一些shell脚本写的任务,算是比较典型的分布式调用情景:

主力的同步调用方案是BEA Tuxedo,异步用IBM MQ,Java内部则是EJB和JMS(一个Weblogic搞定),对外的接口主要是WebService和FTP,另有少量的Socket接口,而旧版系统用Corba连。

在这个生态圈里,REST如果要替换,只能是替换少量外围没有跑WS-*标准的WebService和某些简易Socket接口,大部分的用例里都没有它插手的份儿。而且,整个系统基本上是面向消息而不是面向RPC的,Function在这里主要充当的是Channel的角色。所以,这里dlee说的RPC风格逐渐过时没有错,但和REST将成为主流又没有直接联系。

而最近参与的一个系统,要做一个公共数据服务平台,REST就发市了,我打算利用某个ESB引擎发布WebService/REST双接口,适用不同AP的技术水平和效率要求。设计的过程中dlee给了我很多建议和指导。

所以,我觉得大家火冒三丈的争论没有任何意义,大家先把讨论的场景、前提搞好了再讨论才互有长进,否则口舌之争,吵赢了对方,自己身上又不会长块肉。


69 楼 blueoxygen 2007-06-17  
dlee 写道
关于REST,最近InfoQ China翻译了两篇文章,大家有兴趣的可以仔细看一看。

http://www.infoq.com/cn/articles/restlet-louvel-interview
http://www.infoq.com/cn/news/2007/06/rest-description-language

Fielding论文的中文版如果做review的各位专家没有什么大的修改意见,这周之内就会发布。希望在一两个月以后,我不需要在这里反复做关于REST的扫盲工作了,我们可以深入讨论一些更加有趣的话题。

赶紧放出来吧。
然后想听听类似这种讨论
引用
Bobby Woolf(因企业集成模式而闻名)同样认为REST需要声明性接口并怀疑当REST最终获得这些能力时,结果是否还会与WSDL有什么显著不同。

相关推荐

    论文研究-基于REST的分布式系统中会话与角色管理的研究 .pdf

    基于REST的分布式系统中会话与角色管理的研究,程曦,邹华,首先对REST风格的分布式web系统进行了介绍,接着对REST风格和普通的分布式Web系统进行了对比,指出REST风格具有的优势以及在会话管理与

    rest-tcc分布式事务

    tcc 分布式事务 解决方案 基于rest的分布式事务解决方案

    REST微服务的分布式事务实现-分布式系统、事务以及JTA介绍

    在介绍分布式事务之前,先来来回顾一下事务的ACID原则:原子性(A):原子性是指一个事务的所有操作,要么都做完,要么都不做。 一致性(C):一致性是指一个事务的执行,不管外部环境如何,不管怎么执行,结果应该...

    REST实战(REST in Practice)

    三位soa专家对于rest进行了讲求实际的解释,并且通过将web的指导原理应用到普通的企业计算问题中,向你展示了如何开发简单的、优雅的分布式超媒体系统。你将会学习到很多技术,并且随着一家典型的公司从最初的小企业...

    REST API.md

    REST是设计分布式网络服务或API时遵循的架构原则以及设计风格, 前后端分离最佳实践的开发标准或规范。本文为资料收藏的.md笔记,选取比较重要的资料,收集了以下内容: 重要概念介绍,如前述的第2-第4个关键词。 ...

    SOA与REST 用REST构建企业级SOA解决方案

    然而,二者却站在不同的层次看架构,SOA的角度偏向于战略;而REST的角度则偏向于战术。SOA给出了一组架构原则实现其战略目标,而REST则通过一系列约束实现其战术目标。  《SOA与REST:用REST构建企业级SOA解决方案...

    atomix:用于构建容错分布式系统的React性Java框架

    用于构建容错分布式系统的React性Java框架 请参阅以获取完整文档。 Atomix 3.0是用于构建容错分布式系统的功能齐全的框架。 它提供了构建可伸缩且容错的分布式系统通常所需的一组高级原语。 这些原语包括: 集群...

    REST_cn 中文版

    这篇论文定义了一个框架,致力于通过架构风格来...最后,我描述了从在超文本转移协议(HTTP)和统一资源标识符(URI)的标准中应用REST,以及从这两个标准在Web客户端和服务器软件的后续部署等过程中学到的经验教训。

    一种基于REST的分布式地理资源聚合系统.pdf

    #资源达人分享计划#

    Masters:Minho大学-形式方法和分布式系统

    -了解了分布式系统中常用的不同体系结构,例如Actor和面向事件的编程,REST API,0MQ中间件(PUB-SUB,PUSH-PULL,REQ-REP体系结构)以及与协议缓冲区的接触非常少的方法。 -在分布式体系结构中设置复杂应用程序的...

    httpfs:OCaml中的REST分布式文件系统,C#中的客户端

    HTTPFS HTTPFS提供了一个REST接口,该接口公开了分布式文件系统,就好像它是一台服务器一样。 服务器在启动时必须没有冲突。 然后,系统将保证文件仅存在于单个服务器上。 启动服务器: ./httpfs [-p PORT] [[list ...

    nodejs+websock+rest+rest调用

    基于nodejs的websocket平台,该平台包括异步的数据库调用,异步的rest api访问,以及能够提供rest api的服务。该平台能实现基于ws的聊天室,可以将聊天的信息调用rest api存储到数据库,可以通过网页访问该平台提供...

    java rest api入门实例

    它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。 目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务...

    Learning WordPress REST API

    Chapter 1, Getting Started with REST API, gives you an overview of what the REST API is, how it functions, and all that it is capable of doing. You will also find information about other platforms if ...

    rest风格webservice框架

    它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务。 Restlet项目受到Servlet API、JSP(Java Server Pages)、HttpURLConnection及Struts等Web开发技术的影响。该项目的主要目标是:在提供同等功能的同时...

    C# 实现Rest服务接口,含实现文档

    使用asp.net 实现了Rest服务接口,包括实现的文档。Rest接口返回的数据包括json、Stream等。代码结构清晰,可以直接用VS2013运行

    REST服务示例入门

    2. 由于【1】的改动,使得只有以/rest开头的URL才能映射到某资源,使用rest服务时,必须要加上/rest。 3. 由于【1】的改动,RestComponent类注册application时将资源字符串加上了/rest。 4. 由于【1】的改动和本人...

    springboot+dubbo分布式架构,提供分布式缓存、分布式锁、分布式Session、读写分离

    多系统交互:Dubbo,ActiveMQ多系统交互。 前后端分离:前端使用ajax访问后端的rest服务,后端返回json格式数据。页面用nginx反向代理访问。 支付功能:实现微信和支付宝支付客户端。 日志:Logback打印日志,默认...

Global site tag (gtag.js) - Google Analytics