论坛首页 Java企业应用论坛

从分布式系统的角度看REST

浏览 76343 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-06-15  
Lordaeron 写道
你知你每天在打的電話的計費系統是用什麼的嗎?
請問EJB 的底層是什麼? 它用什麼protocol?

你是想说用的是CORBA或者EJB吧?你说的是哪一家公司的交换机产品呢?你该不是想说全世界的交换机计费系统都使用CORBA或者EJB吧?
你知道我以前是做什么的?我以前是做7号信令的。电话计费系统虽然没有亲自做过,还算略微有些了解吧。
0 请登录后投票
   发表时间:2007-06-16  
Lordaeron 写道
另外, CORBA 和EJB 是不對level 的東西, 不要拿來比較.
corba 是架構的名字, 和J2EE 一樣.
EJB 要比的是CCM.
所以我認為你的<还算略微有些了解> 是真的太<略微>了.

CORBA和EJB都是分布式对象架构风格的具体的架构实例。从架构风格的角度来说,它们是完全可以相提并论的。

不要再跟我说分布式对象像阳光空气和水一样重要,每一个企业应用都需要它。事实就是:绝大部分企业应用都不需要分布式对象。拿了一只锤子把什么都看作钉子乱砸,这是什么样的态度呢?
0 请登录后投票
   发表时间:2007-06-16  
Lordaeron 写道
請你回去好好的看一下Corba 不用在這跟我爭論, 你連EJB, CCM
CORBA, J2EE 這些名詞都未搞清楚, 更別說它們的底層是什麼一回事了.
什麼樣的系統做什麼事, 本來就不會都需要的.
我從沒說過每個enterprise 都需要它, 別亂給我給加話.
事實上就是, 你沒有碰過需要distributed 的系統, 如此而已.
舉個簡單的, 人們每天在用的銀行服務, 後端CORE BANKING大多數都是主機, 而主機又主要是CICS.
海關每天進出的貨物, 很多還在用TUXEDO.
真的有在用J2EE 來做Distrbuted 的還真的不是哪麼critical.

扯的这么远做什么呢?我前面其实一直是说“分布式对象”这种架构风格并不是很成功。你居然会上纲上线到说我坚决反对“分布式应用”,认为“分布式应用”毫无用处。我对你实在是无语,你开的帽子工厂也忒厉害了。

你的问题其实是没有理解我说的“分布式对象”到底是什么含义,将“分布式对象”与“分布式应用”等同了起来。另外你也不理解我说的“架构风格”到底是什么东西。我觉得我们讨论之前最好有一个共同的认识基础,否则很容易出现鸡同鸭讲的情况。“架构风格”这个词来自Fielding的著名论文“Architectural Styles and the Design of Network-based Software Architectures”,我觉得是研究软件架构的一种非常有效的方法。参与这个主题讨论的robbin、白衣和我都读过这篇论文,我们当然要反对教条主义,不过你读一下这篇论文,应该也会很有收获。

其实分布式应用有很多种开发方式,也有很多种分布式应用的架构风格。分布式对象是一种、RPC是一种、REST也是一种。REST是基于Web的分布式应用的一种非常有效的架构风格,为何有效拜托你自己去读Fielding的论证,并且使用自己的大脑好好思考一下。我个人认为,从成功的程度来说,可以这样来排列:REST、RPC、分布式对象。

CICS和TUXEDO我并不熟悉,还要向你请教一下,它们是否属于“分布式对象”这样一类架构风格?不过你在讨论问题之前,拜托你先把怀里揣的帽子放下,然后我们才好心平气和地讨论分布式应用各种架构风格的优缺点。

我觉得你将“分布式”供上了神坛,认为它是一个非常高不可攀的东西,似乎做分布式应用就一定要使用一些非常复杂的技术和产品。虽然你会不屑一顾,不过其实一般的Ajax应用和RIA应用,已经算是分布式应用了,我并不认为我对分布式应用的开发完全没有经验。但是Martin Fowler和Rod Johnson等人一再强调,除非万不得已,不要为项目引入“分布式”。网络调用越少越好,否则会对应用的性能和可伸缩性造成很大影响,严重情况下甚至会毁掉应用的可用性。

同时我们要看到,软件大厂其实也一直在寻找建造分布式应用更加有效和简单的方式。CORBA宣称自己是一种简化,EJB宣称自己是比CORBA更大的简化,现在出来的REST是比EJB更大的简化。今年之内就会出现不少基于REST的产品,以后还会出现更多的产品。分布式应用开发方式是在走向越来越简化的方向。REST可能并不是简化的唯一选择,但是目前看来是很有希望的一个方向。当然目前REST本身的功能还很少,但是REST并不是一种具体的架构实例,而是一种架构风格。我相信软件大厂会基于REST这种架构风格设计出来更加有效地利用HTTP的分布式架构(比SOAP更加有效,SOAP对于HTTP低效利用已经是人所共知的事情了)的规范,REST这种架构风格的架构将来肯定会越来越多的。

尺有所短、寸有所长,即使你对分布式应用的开发经验真的极其丰富并且信心满满,REST也有可能给你带来一些新的思路,你说呢?
1 请登录后投票
   发表时间:2007-06-16  
又见REST.

我觉得拿REST和EJB,CORBA比较太奇怪了。

毕竟REST只是一种风格,甚至没有定义传回来的究竟是XML还是JSON,还是

其他的。

而且上次也提到过REST地提出还是和HTTP有很大的关系,也就是说用不到H

TTP的地方就和REST关系不大。

至于新思路,这个确实不好说,他的那个通过GET,POST,DELETE,PUT来对应

然后通过URL来映射资源,究竟是好还是不好,感觉现在REST总是处于一种

和WEB SERVICE(狭义的特指基于SOAP的)对立的位置,像是一个革命者自

居。其实反过来看REST这东西究竟能够上升到多大的高度?


另外"目前REST本身的功能还很少" 这个是什么含义 不太明了。

0 请登录后投票
   发表时间:2007-06-17  
Lordaeron 写道
soap 是RPC 的一種,REST 也是.

没想到你是这么无知的一个人。无知者无畏,领教了。我是真的没什么可说的了。
0 请登录后投票
   发表时间:2007-06-17  
cctvx1 写道
另外"目前REST本身的功能还很少" 这个是什么含义 不太明了。

这个意思是说,Fielding在论文中所阐述的REST是作为一种架构风格的REST。他所设计的HTTP和URI就是根据REST的思想来设计的,REST其实就是Web架构本身,也是Web在技术上取得成功的原因。HTTP和URI其实就是为建造具体的REST风格架构实例而服务的。但是我们做开发,还是要基于具体的REST架构来做。这些架构现在已经越来越多了,包括我以前介绍的几个Java的REST框架、Ruby on Rails。还有Google、Amazon、Yahoo!等公司以REST风格暴露出来的API。因为REST的内涵非常丰富,我们手工从零开始来建造一个REST应用或者REST API在简单的场合下是适合的,但是在复杂的场合下会带来很多重复的劳动。所以我建议使用一些精心设计的REST框架,例如Cetia4和Ruby on Rails来做REST设计和开发,它们对REST的概念做了很好的抽象,并且提供了基础设施来尽量减少我们需要做的重复劳动。从Fielding的论文来说,REST是有些空泛,但是从这些REST框架来说,其实REST是非常具体的东西。

你如果真正理解了REST,会感到REST的优越性其实是相当大的。它是一种很好的分布式应用的架构风格。这正是robbin和我等朋友希望在这里讨论的问题。不要一看到有人将REST和CORBA或者EJB相提并论就火冒三丈,好像动了某人的奶酪一样,甚至阻止别人进行讨论。CORBA和EJB也不是谁的私有物,神圣而不可侵犯。面向Internet的Web应用所面对的很多问题要比企业应用更加复杂,这些需求在Fielding的论文中有很详细的介绍,正是因为这些需求,决定了分布式对象这种架构风格并不适合Web,必须要设计一种新的架构风格。
0 请登录后投票
   发表时间:2007-06-17  
Fielding 写道
3.6.3 分布式对象(Distributed Objects,DO)
分布式对象风格将系统组织为结对进行交互的组件的集合。一个对象是一个实体,这个实体封装了一些私有的状态信息或数据、操作数据的一组相关的操作或过程、以及一个可能存在的控制线程,这种封装使得它们能够被整体地看作单个的单元[31]。通常,一个对象的状态对于所有其他对象而言,是完全隐藏和受到保护的。检查或修改对象状态的唯一方法是对该对象的一个公共的、可访问的操作发起请求或调用。这样就为每个对象创建了一个良好定义的接口,在对象的操作实现和它的状态信息保持私有的同时,公开操作对象的规格,这样做改善了可进化性。
一个操作可以调用可能位于其他对象之上的操作。这些操作也同样可以调用其他对象之上的操作,以此类推。一个相关联的调用链被称作一个动作(action)[31]。状态分布于对象之间,这对使状态尽可能保持最新而言是有利的,但是不利之处是难以获得系统活动的总的视图(缺乏可见性)。
一个对象为了与另一个对象交互,它必须知道另一个对象的标识。当一个对象的标识改变时,它必须对所有显式调用它的其他对象做修改[53]。这就必需要有一些控制器对象来负责维护系统的状态,以完成应用的需求。分布式对象系统的核心问题包括:对象管理、对象交互管理和资源管理[31]。
分布式对象系统被设计用来隔离正在被处理的数据,因此该风格通常不支持数据流。然而,当它和移动代理风格相结合时,可以为对象提供更好的移动性。

3.6.4 被代理的分布式对象(Brokered Distributed Objects,BDO)
为了降低对象标识的影响,现代分布式对象系统通常使用一种或更多种中间风格(intermediary styles)来辅助通信。这包括基于事件的集成风格和被代理的客户/服务器(brokered client/server)风格[28]。被代理的分布式对象风格引入了名称解析组件——其目的是将该组件接收到的客户端请求中一个通用的服务名称解析为一个能够满足该请求的对象的特定名称,并使用这个特定名称来答复客户端。尽管它改善了可重用性和可进化性,但额外的间接层要求额外的网络交互,这降低了效率和用户可觉察的性能。
被代理的分布式对象系统目前受到两个标准的控制:OMG[97]所开发的CORBA行业标准和ISO/IEC [66]所开发的开放分布式处理(ODP)的国际标准。
尽管分布式对象引起了非常多的兴趣,然而与大多数其他的基于网络的架构风格相比,这样一类架构风格能够提供的优点很少,它们最适合被使用在包括了对已封装服务(例如硬件设备)的远程调用的应用中,在这些应用中,效率和网络交互的频率并不是很值得关注。

Fielding 写道
这与类似CORBA[97]那样的中间件形成了对比。因为CORBA仅仅允许通过一个ORB来进行通信,它的转移协议IIOP对于通信的参与方使用什么内容来进行通信做了太多的假设。HTTP请求消息包括了标准化的应用语义(application semantics),而IIOP消息却没有包括。“Request”符号在IIOP中仅仅提供了方向性,这样ORB能够根据自身是否应该作出回应(即“LocateRequest”)或者是否应该通过一个对象来解释该请求,来对请求进行路由。具体的语义通过一个对象的key和操作的组合来表达,它是特定于对象的,而不是跨所有对象标准化的。
一个独立开发者能够生成与一个IIOP请求相同的比特,而不使用相同的ORB,但是比特本身是由CORBA的API和它的接口定义语言(IDL)定义的。生成这些比特需要一个由IDL编译器生成的UUID、一段对IDL操作签名做镜象的结构化二进制内容、遵循IDL规范的回应数据类型(definition of the reply data type(s))的定义。其语义因此由网络接口(IIOP)来定义,而不是由对象的IDL规范(IDL spec)来定义。这是否是一件好事,取决于应用的性质——对于分布式对象这是必需的,对于Web这并不是什么好事。
为何这些差别是很重要的?因为它将一个网络中间组件能够成为有效的代理(effective agent)的系统,和一个网络中间组件最多只能成为路由器的系统区分了开来。
这种形式的区分也可以在将消息解释为一个单元(a unit)或者解释为一个流(a stream)中看到。HTTP允许接收者或发送者来自行决定。CORBA的IDL甚至(仍然)不允许使用流,即使当它确实得到了扩展以支持流之后,通信的双方仍然被绑定在相同的API上(译者注:即CORBA的基于库的API),而不是能够自由地使用最适合于它们的应用类型的东西。

6.5.2 HTTP并不是RPC
人们常常错误地将HTTP称作一种远程过程调用(RPC)[23]机制,仅仅是因为它包括了请求和响应。调用远程机器上的一个过程(procedure)的观念,是RPC与其他形式的基于网络的应用通信的区别所在。RPC的协议识别出过程并且传递给它固定的一组参数,然后等待在使用相同接口返回的一个消息中提供的回答。远程方法调用(RMI)也是类似的,除了过程被标识为一个{对象,方法}的组合,而不是一个简单的服务过程(service procedure)。被代理的RMI添加了名称服务的间接层和少量其他的技巧(trick),但是接口基本上是相同的。
将HTTP和RPC区分开的并不是语法,甚至也不是使用一个流作为参数所获得的不同的特性,尽管它帮助解释了为何现有的RPC机制对于Web来说是不可用的。使得HTTP与RPC存在重大不同的是:请求是使用具有标准语义的通用的接口定向到资源的,这些语义能够被中间组件和提供服务的来源机器进行解释。结果是使得一个应用支持分层的转换(layers of transformation)和间接层(indirection),并且独立于消息的来源,这对于一个Internet规模、多个组织、无法控制的可伸缩性的信息系统来说,是非常有用的。与之相比较,RPC的机制是根据语言的API(language API)来定义的,而不是根据基于网络的应用来定义的。
0 请登录后投票
   发表时间:2007-06-17  
to Lordaeron:
对于服务器端来说,REST与RPC的建模方式还是有很大区别的。REST不是RPC,Fielding说的很清楚。你根本就没有读懂Fielding的含义,也完全不理解HTTP是用来做什么的。

少跟我来你这一套下三烂的流氓手段,不要再以势压人了,尽管这种手段在你们公司内部也许屡试不爽。到底是我一直在跟你客气,还是你一直在跟我客气,拜托先搞搞清楚。我一直在试图心平气和地讨论我们真正关心的问题,你从来就不屑于以一种心平气和的态度说出你真正的观点,也不肯正面抨击我提出的观点,唯有以势压人而已。瞧不起人的似乎更应该是我,你也配来鄙视别人?在我看来你真的是很滑稽,一大早就碰到了一件乐事。
0 请登录后投票
   发表时间:2007-06-17  
dlee 写道
to Lordaeron:
对于服务器端来说,REST与RPC的建模方式还是有很大区别的。REST不是RPC,Fielding说的很清楚。你根本就没有读懂Fielding的含义,也完全不理解HTTP是用来做什么的。

一個從定義上就錯的人, 他引申下去的東西, 依然是錯的, 這是簡單不過的道理了.
一個人, 連RPC 的定義是什麼, 連Corba 也是RPC 的一種也搞不清楚, 就談http 不是RPC, 真是笑話.
http 當然不是RPC, 兩種不同的東西, 一個是concept, 一個是protocol.
更別講他的銘言:HTTP is not a Transport Protocol
更舉一個好笑的例子, WEBDAV 批評.
你最好還是抱著你的REST 來拜, 我就等看下半年有沒有你口中的REST 被大規模的使用.

dlee 写道
to Lordaeron:
少跟我来你这一套下三烂的流氓手段,不要再以势压人了,尽管这种手段在你们公司内部也许屡试不爽。到底是我一直在跟你客气,还是你一直在跟我客气,拜托先搞搞清楚。我一直在试图心平气和地讨论我们真正关心的问题,你从来就不屑于以一种心平气和的态度说出你真正的观点,也不肯正面抨击我提出的观点,唯有以势压人而已。瞧不起人的似乎更应该是我,你也配来鄙视别人?在我看来你真的是很滑稽,一大早就碰到了一件乐事。

是有人白痴的將我沒講過的話, 一直說我戴他帽子.
現在無法證明我在戴他帽子了, 就開始轉移話題, 說我<無法提出抨擊你觀點>
第一篇回你就講了, distributed system 到處都在用. 是你無知而已.
更無知的是用不同level 的東西來相比. 還振振有詞.
沒開發過distributed system 的人, 也不去花時間學習, 只在這吹牛, 吹這種笑話.
還真的不知是誰滑稽.
0 请登录后投票
   发表时间:2007-06-17  
咳咳,好像dlee说过时的是"分布式对象系统",不是"分布式系统"啊。

像源于C的tuxedo,就不是面向对象的呀,我们用的时候,只是用tuxedo来传字符串名值对而已。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics