如何使用 spring 数据剩余管理 REST API 版本控制?
How to manage REST API versioning with spring data rest?
- 在 Spring Rest Data 中支持 API 版本控制的方法是什么?
- 是否可以用 repository-resources or do I have to use RepositoryRestController 代替?
的官方网站上找不到任何关于 API 版本控制的信息
我找到了 Joshua Long presentations about REST APIs with Spring
API 版本可以通过以下两种方式之一实现:
- 通过 API URI:https://api.foo.com/v1
- 通过媒体类型:application/vnd.company.urapp-v3+json
第一种方法描述了一些问题here
这是一个有趣的话题。 spring-data-rest 的文档没有提到 best-practices 的版本控制。
据我所知 spring-data-rest 如果不实现自定义控制器,就不可能实现媒体类型版本控制。
当然,当前功能允许基于 URI 的版本控制:
- 始终在您的实体中包含一个版本 - 在包中或 class 名称中 - 例如
com.company.v1.MyEntity
或 com.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
- 在 Spring Rest Data 中支持 API 版本控制的方法是什么?
- 是否可以用 repository-resources or do I have to use RepositoryRestController 代替?
我找到了 Joshua Long presentations about REST APIs with Spring
API 版本可以通过以下两种方式之一实现:
- 通过 API URI:https://api.foo.com/v1
- 通过媒体类型:application/vnd.company.urapp-v3+json
第一种方法描述了一些问题here
这是一个有趣的话题。 spring-data-rest 的文档没有提到 best-practices 的版本控制。
据我所知 spring-data-rest 如果不实现自定义控制器,就不可能实现媒体类型版本控制。
当然,当前功能允许基于 URI 的版本控制:
- 始终在您的实体中包含一个版本 - 在包中或 class 名称中 - 例如
com.company.v1.MyEntity
或com.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