写点什么

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

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

关注

评论

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

App Cleaner & Uninstaller:mac专业的系统清理优化工具

Rose

App Cleaner 系统清理工具 苹果mac系统优化 App Cleaner 破解

【2023华为云CodeArts Build 实战训练营】云端实战-玩转编译构建

云计算 华为云 华为开发者大会2023

Nautilus Chain上首个DEX PoseiSwap即将开启IDO,潜力几何?

西柚子

简单好用的便利贴工具:Sticky 激活版

真大的脸盆

Mac Mac 软件 便利贴工具 便利贴软件

宝兰德应用服务器软件与华为云GaussDB完成兼容互认证

YG科技

硬核!力扣官方首发了这套1568页LeetCode算法刷题笔记(彩页版)

Java你猿哥

面试 算法 LeetCode ssm

Microsoft Remote Desktop下载,微软远程连接工具

Rose

microsoft remote desktop 微软远程桌面连接工具 mac远程链接

开源赋能 普惠未来|OpenHarmony诚邀您参与2023开放原子全球开源峰会

开放原子开源基金会

开源 OpenHarmony 开放原子

从BeyondCampus最佳实践,洞察高校零信任发展趋势

权说安全

Xcode for Mac(开发工具)v14.3.1正式版

Rose

Xcode Mac版 Xcode中文版 Xcode破解版

synchronized和Lock有什么区别?

javacn.site

如何从零实现一个简单的Spring Bean容器

Java你猿哥

Java spring ssm Spring Bean Java web

技术驱动,数据赋能,华为云GaussDB给世界一个更优选择

YG科技

深度解析Seata AT 模式中性能优化与隔离保障的平衡之道

Java你猿哥

Java 数据 ssm 脏读

行业DBA走进华为,共建数据库生态

YG科技

[EuroSys2023 Best Poster] 面向动态图的极低时延GNN推理采样服务

阿里云大数据AI技术

人工智能 机器学习 推理 企业号 6 月 PK 榜 DGS

你还在用 BeanUtils?试试 MapStruct,优雅的对象转换解决方案!

Java你猿哥

Java ssm map

Go 语言流行 ORM 框架 GORM 使用介绍

江湖十年

后端 ORM框架 ORM Go 语言 gorm

Java上进了,JDK21 要来了,并发编程再也不是噩梦了

Java你猿哥

Java jdk ssm

如何在企业中培养平台工程文化?

SEAL安全

平台工程 平台工程文化

强渡大渡河!华为云GaussDB支撑华为MetaERP系统全面替换

YG科技

火山引擎DataLeap的Catalog系统搜索实践(三):Learning to rank与后续工作

字节跳动数据平台

数据湖 数据化 数据平台 大数据分析 DataLeap

华为云GaussDB以技术创新引领金融行业分布式转型

YG科技

开源赋能 普惠未来|腾讯寄语2023开放原子全球开源峰会

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子

写给程序员的可逆计算理论辨析补遗

canonical

低代码 可逆计算 范畴论

国产自研数据库是更新换代首选

YG科技

怎么看阿里拆中台这件事

agnostic

中台架构

mac高质量图像浏览处理软件 GraphicConverter 12 v12.0.3(6140)中文直装版

Rose

GraphicConverter 12中文 GraphicConverter破解 mac图像浏览器 GraphicConverter下载

Focus Matrix for Mac(智能任务管理器) v1.6.1激活版

Rose

Focus Matrix Focus Matrix破解 focus matrix mac激活版 智能任务管理器

爱了,Spring Cloud Alibaba内部微服务架构笔记真的太牛了

Java你猿哥

Java 微服务 微服务架构 Spring Cloud ssm

设计模式之不一样的责任链模式

越长大越悲伤

Java 设计模式

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