写点什么

REST 及其版本控制

  • 2010-06-17
  • 本文字数:2048 字

    阅读完需:约 7 分钟

Ganesh Prasad 最近思考的问题是与 REST 相关的最棘手的问题之一:基于 REST 架构的服务版本控制。Ganesh 通过一个示例说明:

假设有一个资源,它的标识是这样的,“/customers/1234”。人们通过 PUT 修改这个资源的状态。[但是]REST 如何处理 PUT 对应的业务逻辑的变更呢?

因为无法通过修改操作名(如,指定 PUTv2)的方式标识服务的业务逻辑发生的变化,一种可能的做法是修改 PUT 使用的 URL,与此同时维护原有的资源标识,Ganesh 描述到:

如 PUT /customers/v2/1234,这不同于客户端的原有标识 /customers/1234。

该方法类似于 Peter Williams 在几年前谈到,而且其他人甚至在更早就谈到的反模式。Peter 在 2008 年如是说:

我非常痛恨这种方法,其隐含的意思是一个版本的 API 与另一版本的 API 表征不同的资源。它迫使客户端作出进退两难的选择,不是同时支持多版本的 API,就是打破 REST 的核心限制之一。例如,一个 V1 版 API 的客户保存了 URL 引用(该 URL 中包括版本标识),一段时间后客户端更新到新版的 API。 此时,客户端支持该 API 的多个版本,因为所有之前保存的 URI 全部指向旧版本的 API,或者必须要将这些 URI 转接到新版 API。URI 转接打破了 REST 的将多媒体当作应用程序状态引擎(HATEOAS)的限制,而支持多版本的 API 是维护工作中的噩梦。

Peter 建议使用定制媒体类型与(最终必将发生的非向后兼容性变更的)内容协商的结合进行版本控制。

该方法的确会导致新建媒体类型,但是媒体类型是低成本的,所以我们可以,而且应该,需要多少媒体类型就创建多少。如果能正确使用,内容协商可用于解决 REST/HTTP 服务接口的版本控制问题。

但是,回到 Ganesh 以及最初的修改 URL 的方法,他也不同意这种方法。

首先,如果认为只有两处(动词以及资源)可以存放业务逻辑的不同版本,那就是一个错误。第三处是所提交的数据中……但此例仅仅引发了我对版本控制根本的探究。

进而他提出了 REST 与 SOA 所需的版本控制的问题,它问道,首先版本控制是什么,其次为什么需要它?

我认为服务版本控制是一种机制,它使我们能够以消费者可见的方式同时维护两组或多组业务逻辑的版本。

首先他问道,为什么要对消费者可见,如果服务能够区别不同的消费者类型,那么它就能在内部为不同的调用者(客户端 / 消费者)应用不同的业务逻辑?接着它又进一步提出问题:我们为什么要同时维护不同版本的业务逻辑呢?

一个有趣(又迂回)的答案是,业务逻辑通常需要对消费者可见,所以新版的业务逻辑也需要以消费者可见的方式与其旧版本进行区别。这往往被描述成是对旧消费者的支持,比如,消费者在某方面依赖于旧版本的业务逻辑的服务消费者。

支持旧客户的目的是确保现有的契约和 SLA 不会因为服务的(悄然)更新而被破坏。这就引出了 Ganesh 的又一问题,版本控制的问题的解决办法可否不通过使用显式的版本,而在对具体实施细节进行抽象时找到呢?也许服务契约太细节了以至于在变更发生时显得脆弱。(类似于过去 SOA 背后的一个重要原则,松耦合与紧耦合的思想)

Ganesh 接着通过一个例子描述了如何使用这种方法解决版本控制的问题。在该例中,一个虚构的开发人员在已有服务消费者的情况下悄悄地完成了对服务的业务逻辑的变更。

第一个问题是,新的业务逻辑能否应用于所有的消费者,或者我们是否需要跟踪“旧”消费者并继续为他们保留旧的业务逻辑?如果我们能够为所有消费者升级到新的业务逻辑,那是当然没有任何问题的。接口继续保持不变,客户端应用程序将数据 POST 到相同的 URI,请求接着被转发到新建资源的地址……所应用的业务逻辑是全新的,但是客户端不会从接口中感知到变化……

但是,当然也有可能根本无法做到这样,这时就需要维护业务逻辑的多个版本。Ganesh 接着描述了这种情况发生的几个可能的原因:

  • 客户端应用程序应该提交的数据有变化,这种变更不可避免地要让消费者知情,而且不得不使用新契约进行交互。
  • 另一商业原因是区分两类客户,也许是要奖励长期的客户,为他们提供更好的服务,不过该变化不会从客户端提交的数据中察觉出来。
  • 客户端应用程序可能“了解”旧版本的服务行为并依赖于这些行为,这种情况下,需要使用新的版本已避免 d 对遗留客户造成破坏。

Ganesh 认为,第三种情况是人为的,它意味着通过消费者和服务实现之间的显式依赖关系破坏了服务的松耦合性。

相反,第一种和第二种情况都有相应的解决方案。如果由客户端提交的数据要发生改变,那么这本身就是一种区别新消费者与旧消费者的方式,从而可以为他们提供不同的业务逻辑。换言之,我们仅需告诉新消费者他们需要对 POST 的数据作出的修改。旧消费者什么都不用做。此外,如果我们能够在某种程度上得知消费者是旧消费者,那么,即使它既提交的数据没有明显的区别,我们也能透明地应用不同的业务逻辑。

他这样总结自己的观点……

服务的版本不是接口细节,而往往是在接口中泄漏的实现细节。

服务的版本控制问题是许多领域里的常见话题,不仅仅是REST。然而,Ganesh 坚信REST 为该问题提供了更好,更自然的解决方法。


查看英文原文: REST and versioning

2010-06-17 04:484734
用户头像

发布了 184 篇内容, 共 88.4 次阅读, 收获喜欢 8 次。

关注

评论

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

7张图详解域名系统DNS

wljslmz

DNS 域名解析 网络技术 6月月更

C#入门系列(六) -- 分支语句

陈言必行

C# 6月月更

大型物联网平台如何来保障亿级设备安全连接上云?

华为云开发者联盟

物联网 华为云 iotda 大型物联网平台

NFT+DeFi链游系统开发技术

薇電13242772558

NFT

当运行npm install 命令的时候带上ignore-scripts,会发生什么?

华为云开发者联盟

前段

本周三晚19:00Hello HarmonyOS进阶课程第6课—短视频应用开发

HarmonyOS开发者

HarmonyOS

如何在 WordPress 中创建联系表格?

海拥(haiyong.site)

WordPress 6月月更

mass幸运哈希彩竞猜游戏娱乐平台开发技术详解

开发微hkkf5566

趣步运动挖矿系统开发模式分析

开发微hkkf5566

大容量、高性能,国家级实验室分布式并行文件存储实践

焱融科技

人工智能 大数据 AI 基础设施 存储

【智人智语】剑维软件大中华区油气和智能制造业务部总经理刘晓光:我谨代表剑维软件预祝第六届世界智能大会圆满成功

InfoQ 天津

【私有云】多云管理平台和私有云是什么关系?能通俗解释一下吗?

行云管家

云计算 私有云 云管平台

InfoQ 极客传媒 15 周年庆征文|业务中台与B-PaaS的前世今生

小诚信驿站

架构 如何落地业务建模 领域建模 热门活动 InfoQ极客传媒15周年庆

信息时代,您需要这样的知识管理工具

小炮

本周二晚19:00战码先锋直播丨轻松入门,成为媒体子系统贡献者

OpenHarmony开发者

Open Harmony

5 年前他的一个设计思路,让 TDengine 时间压缩提升近 50 倍

TDengine

数据库 tdengine 时序数据库

【Spring 学习笔记(五)】Spring Bean 作用域和生命周期

倔强的牛角

spring Java EE 6月月更

选择广州软件定制开发的10个理由

低代码小观

软件开发 管理软件 企业管理软件 项目管理软件 软件定制

Hive参数与性能企业级调优

五分钟学大数据

6月月更

2022年5月国产数据库大事记

墨天轮

数据库 opengauss TiDB 国产数据库 polarDB

Apache DolphinScheduler&TiDB联合Meetup | 聚焦开源生态发展下的应用开发能力

白鲸开源

Apache 大数据 开源 DolphinScheduler workflow

用Golang重写rsync(1):缘起MAC

老豆还编程

c golang

四家正规新疆等保测评公司名称、地址详细公布

行云管家

网络安全 等保 新疆 等保测评

程序员自我修炼:《匠艺整洁之道》读书总结

博文视点Broadview

安势信息技术市场总监王峰,OpenChain线上研讨会首秀!

安势信息

Linux 开源 DevSecOps SCA SCA工具

一键部署Java构件到Nexus,同事见了都说好

Jianmu

后端 持续集成 私服 自动化运维 Java构件

双重调研测试后,OPPO IoT 类产品开始接入 TDengine

TDengine

数据库 tdengine 时序数据库

【云主机】2022年云主机管理软件排行榜

行云管家

云主机 云服务器 云管

故障定位与用户行为分析双向驱动,互联网保险的IT 运维“双保险”

博睿数据

博睿数据 IT运维

常见滑动窗口实现(Java语言实现)

工程师日月

6月月更

EMQ&思岚科技:物联网+AI支援抗疫,“无接触”机器人保障上海方舱稳定运转

EMQ映云科技

物联网 IoT mqtt emq 6月月更

REST 及其版本控制_SOA_Mark Little_InfoQ精选文章