写点什么

观点:REST 在 SOA 中适合哪个位置?

2008 年 11 月 03 日

自 REST 面世以来,它就一直被无数口水所包围。各色人等纷纷现身说法,为各自的阵营摇旗呐喊。但不管怎样,REST 终究还是站稳了脚跟。而且在各种争论之中,人们慢慢地得到了一个较为清晰的看法。

最近,Jean-Jacques Dubray 就 REST 在 SOA 中适合什么位置发表了自己的看法,JJ 本人也是 InfoQ 的编辑之一。他认为,并非所有的 REST 特性都适合 SOA,并列出了他认为应该使用的那些:

  • URI:唯一的(而不是统一的)资源标识符
  • 针对基于角色访问的内容协商
  • GET,幂等性且无副作用(不要 PUT、POST 或 DELETE)
  • 恰当地使用缓存(不要为实例进行状态轮询)

在该贴的回复中,Subbu Allamaraju 对没有提到“统一接口”表示惊讶。对此,JJ 回应说,他确实提到了“统一接口”,但只是其中的“GET”方法。他还进一步表示,对于 互联系统来说,“每个资源一个端点(one-endpoint-per-resource)”模型是一个有缺陷的模型。

他评论说:

……“面向资源”这个概念有价值吗?有,简直是无价之宝。每个人都应该了解 REST。是的,有许多面向资源的模式也可以在互联系统中被使用。 HTTP 作为中间件有价值吗?没有,它是构建互联系统的灾难。它非常适合“浏览器到服务器”的交互。毫无疑问,对于“服务器到服务器”的交互,它则完全是个祸害。 并且一个原因就是,它造成了对一个端点(或每个资源多个端点)的需要。遗憾的是,它不仅仅是 URI,换句话说,在代码中的某处要有一个东西来“侦听”那个 特殊的 URI。

此外,JJ 认为,资源的概念虽然是 SOA 的核心,但是服务同样重要,并且两者是互补的。单单只提及一方并不足以构建互联系统。而且,他还在文中对 “云计算是 RESTful”的观点进行了批驳了,并表现出对“面向资源编程模型(Resource Oriented Programming Model)”的不以为然。

他写道:

……每个信息系统都有两个维度:数据和流程。流程控制数据的状态,数据当然能并且必须在流程的边界外可被访问。至今为止,大多数 的编程模型(MVC、ASP/JSP……)都完全假设,流程这个维度是没用的,因为它可以通过 CRUD 实现。REST 也做了相同的假设。Roy 针对 Web 做这样的假设没错,但针对云计算或企业 SOA 再做这样的假设就不对了(否则,它就看起来象 Web 了)。

这一观点在 Arnon Rotem-Gal-Oz 那儿得到了回应。 他认为,尽管就单个服务而言,REST 非常适合,但是涉及多个服务之间的协调时,REST 就不太擅长了。其间,他建议结合事件驱动架构(EDA)引入业务 事件,或使用一些外部实体来对服务进行编排(choreograph)或编配(orchestrate),如 BPM。他说道:

在我的组织中,我们有大量的流程给事件处理提供帮助,其效果要比 REST over HTTP 好得多。

针对何时使用哪种架构风格,Arnon Rotem-Gal-Oz 总结说:

架构风格(及架构模式)是你能用来解决挑战的工具。锤子可以被很好地用到很多场合,但是,最好是确保工具箱中不是只有锤子。

2008 年 11 月 03 日 01:441044
用户头像

发布了 255 篇内容, 共 47.3 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

身为程序员还记得C语言经典算法(附带答案)吗?

ShenDu_Linux

c c++ 算法 编程语言

智慧公安二维码定位报警系统开发

t13823115967

架构师训练营第十周作业

文智

极客大学架构师训练营

Kubernetes初体验--用Kubernetes部署一个Web服务

网管

go Kubernetes k8s Web 服务

40 张图带你搞懂 TCP 和 UDP

cxuan

计算机网络 计算机基础 计算机

第四代Express框架koa简介

程序那些事

nodejs 异步编程 koa Express 程序那些事

如何高效的使用并行流

Silently9527

java8 java 并发

Canal 组件简介与 vivo 帐号实践

vivo互联网技术

数据库 分布式 数据存储

shell脚本的使用该熟练起来了,你说呢?(篇一)

良知犹存

Linux shell脚本编写

解密智联招聘的大前端架构Ada

智联大前端

Serverless 前端架构 开发工具 前端工程化 微前端

揭秘11.11监控排障利器 京东高稳定日志服务深度解析

京东科技开发者

云计算 DevOps 日志监控

Mysql数据备份与恢复

张攀钦

MySQL

源码 | 浅谈Webpack原理,以及loader和plugin实现。

梁龙先森

前端 前端工程化 webpack 前端进阶

第十周学习总结

饭桶

不懂源码?来看看阿里P8亲自手码的Spring源码解析整套笔记,高薪offer唾手可得!

比伯

Java 编程 架构 面试 计算机

架构师训练营第 1 期第 10 周作业

du tiezheng

极客大学架构师训练营

2020双11,Dubbo3.0 在考拉的超大规模实践

阿里巴巴云原生

阿里云 开源 云原生 dubbo

我是如何使计算时间提速25.6倍的

Lart

Python 代码优化 Numpy 代码加速

接口测试如何在json中引用mock变量

测试人生路

json 接口测试 Mock

Linux 笔记(三): 软件安装

Leo

Linux 学习 前端进阶训练营

Mac下Docker Desktop配置阿里云镜像加速器

jiangling500

Docker 阿里云镜像加速器

薇娅携手中国航天基金会与我们的太空 带你“益起探月,共舞九天“

Geek_459987

什么是物联网?常见IoT 物联网协议最全讲解

华章IT

物联网 IoT

云算力矿机系统开发,区块链挖矿平台搭建

薇電13242772558

区块链 云算力

架构师训练营第 1 期第 10 周总结

du tiezheng

极客大学架构师训练营

深度剖析,为何C语言在开发领域的地位如此稳固

Philips

Python go .net rust C语言

Python进阶——如何正确使用yield?

Kaito

Python

智慧公安大数据可视化分析系统搭建

t13823115967

第十周课后练习

饭桶

CAP理论

DL

C++语言中std::array的神奇用法总结,你需要知道!

华为云开发者社区

容器 数组 函数

低代码的认知误区与落地实践

低代码的认知误区与落地实践

观点:REST在SOA中适合哪个位置?-InfoQ