如何使用 spring 数据剩余管理 REST API 版本控制?

How to manage REST API versioning with spring data rest?

我在 Spring Rest Data

的官方网站上找不到任何关于 API 版本控制的信息

我找到了 Joshua Long presentations about REST APIs with Spring

API 版本可以通过以下两种方式之一实现:

第一种方法描述了一些问题here

这是一个有趣的话题。 spring-data-rest 的文档没有提到 best-practices 的版本控制。

据我所知 spring-data-rest 如果不实现自定义控制器,就不可能实现媒体类型版本控制。

当然,当前功能允许基于 URI 的版本控制:

  • 始终在您的实体中包含一个版本 - 在包中或 class 名称中 - 例如com.company.v1.MyEntitycom.company.MyEntityV1
  • 在存储库中使用 @RepositoryRestResource 在 URI

    中包含版本

    @RepositoryRestResource(path = "/v1/shops")

因此,当您对 API 进行重大更改时,您始终可以创建新的实体版本,并使用新的存储库在 API 上公开新版本。

编辑: 我们在团队中讨论了这个话题,我想分享一些关于 REST API 版本控制的有趣新想法。

我想我们都同意上面概述的想法并不优雅。它引入了大量代码重复,当您关闭旧版本时,您必须将其从代码库中删除——这可能比您想象的要难。同时,您必须在代码库中维护两个版本。你总是想避免这种情况。

那么有哪些选择。您可以做我们在微服务世界中经常做的事情——将复杂性推向基础设施。在微服务基础架构中创建和 运行 新 运行 次相当容易,因此我们可以选择 运行 同一服务的两个不同版本 。旧版本提供旧API版本,新版本支持我们的新版本。 API 网关可以接管路由 例如基于 HTTP headers(接受或 Content-Type)或 URI 中包含的版本信息。如果您想摆脱旧版本,只需关闭 运行 次 运行 旧版本即可。我认为这是一个优雅的解决方案,可以让您的代码库保持干净。

有可能您的基础架构已经支持 运行同一服务的不同版本以支持 blue-green deployment scenarios。这意味着您已经拥有一些可以构建的路由功能。

此外,我认为如果您支持 blue-green 部署方案(您应该支持),您必须保持数据库模式版本在版本之间兼容(例如,您的旧版本服务需要能够 运行 在新架构版本上)。如果你必须保持这种兼容性水平,那么在大多数时候避免 REST API 版本控制可能并不难。所以你不会被迫经常这样做——也许只有当你做出根本性的改变时(无论如何你都不会在同一个代码库中做)。

借助 RepositoryRestResource,您可以使用投影 (org.springframework.data.rest.core.config.Projection)。

import org.springframework.data.rest.core.config.Projection

@Projection(name = "v1", types = [Customer])
interface CustomerV1 {

    @Value("#{target.id}")
    String getId()

    String getTelephone()

    String getName()
}

@Projection(name = "v2", types = [Customer])
interface CustomerV2 {

    String getTelephone()

    String getName()
}

然后,每个客户端都可以使用查询参数调用自己的版本?projection=vx

示例:curl http://localhost:8080/customer/1?projection=v1