写点什么

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:484583
用户头像

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

关注

评论

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

米哈游蔡浩宇新游戏:角色语音、情绪、动作实时生成;Argmax 端侧说话人分离框架:10M 大小 1 秒识别 4 分钟音频丨日报

声网

写好代码之对象的创建

x-arts

设计模式 写好代码 代码治理

Hologres实时湖仓能力入门实践

阿里云大数据AI技术

大数据 数据仓库 OLAP hologres

数智化转型不是“买硬件”,DeepSeek一体机别乱上

Alter

ElevenLabs 33 亿美元估值的秘密:技术驱动+用户导向的「小熊软糖」团队丨Voice Agent 学习笔记

声网

企业想知道,DeepSeek如何从外力变内力?

脑极体

AI

智能化采购:中烟创新如何利用编审系统提升文件编制与审核效率?

中烟创新

真正的AI新风口,竟是它?

Immerse

MongoDB 可观测性最佳实践

观测云

mongodb

MySQL查询建表规范

秃头小帅oi

使用 INFINI Gateway 保护 Elasticsearch 集群之修改查询不合理参数(二)

极限实验室

elasticsearch Gateway

反向海淘代购独立站的“神器”——集运功能到底怎么用?一篇给你讲明白!

代码忍者

1688拍立淘图片搜索接口全攻略

tbapi

1688API 1688图片搜索接口 1688拍立淘接口

腾讯云HAI | 1分钟,1元成本带你快速搭建你的专属DeepSeek,还有多场景体验操作指导

六月的雨在InfoQ

腾讯云 DeepSeek HAI应用服务器 Chatbox

C#进阶-ASP.NET网站会话固定漏洞的解决

Damon小智

C# asp.net 网络安全 漏洞 会话固定

1688拍立淘图片搜索接口全攻略

tbapi

1688API 1688图片搜索接口 1688拍立淘接口 1688图片识别接口 1688图搜API

锻造船用发动机动力系统,铸强船舶“心脏”

DevOps和数字孪生

YashanDB用户表空间管理

YashanDB

yashandb

产教融合、科教融汇激发世界级成果,西安交通大学鲲鹏昇腾科教创新孵化中心揭牌

极客天地

社区动态 | KWDB 体验官火热招募中

KaiwuDB

招募 数据库、 KaiwuDB

SvelteKit 最新中文文档教程(4)—— 表单 actions

冴羽

前端 前端开发 前端框架 Svelte SvelteKit

智能扫描助力节碳超13万吨,合合信息旗下扫描全能王“指尖减碳”写就绿色诗篇

合合技术团队

人工智能 算法 OCR 扫描全能王 #大数据

如何通过 Apache SeaTunnel 实现 MySQL 到 OceanBase的数据迁移同步

Apache SeaTunnel

芯盾时代身份管理解决方案

芯盾时代

iam 统一身份认证 统一身份管理

1周上线,2个月交付!有巢数智如何用 NocoBase 颠覆建筑行业数智化效率

NocoBase

开源 低代码 插件 数智化 建筑业

依赖倒置 DIP、依赖注入 DI、控制反转 IoC 和工厂模式

不在线第一只蜗牛

依赖

.NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

秃头小帅oi

Markdown 模板变量的使用

NocoBase

开源 markdown 低代码 零代码 无代码

邀请函丨就在下周,相约新乡!AI驱动数字化创新设计促进新质生产力发展交流会

Altair RapidMiner

AI 数字化转型 制造业 仿真 CAE

Flink CDC+Hologres高性能数据同步优化实践

阿里云大数据AI技术

大数据 flink 数据仓库 OLAP hologres

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