使用 Spring Cloud Config 进行属性版本控制

Posted

技术标签:

【中文标题】使用 Spring Cloud Config 进行属性版本控制【英文标题】:Properties versioning with Spring Cloud Config 【发布时间】:2016-10-06 21:08:45 【问题描述】:

我可能在这里遗漏了一些东西,但是什么是属性版本控制的好解决方案?

例如,在属性值发生变化的蓝绿部署场景中(旧应用版本消耗旧值,新版本需要新值),如何确保应用的两个版本能够成功共存(考虑可能的重启和回滚)?

一种选择是为需要应用新值的属性创建新的属性名称。当然,这不是一个好的选择,因为我们需要在代码库中跟踪该属性的所有用法并相应地更新其引用。从概念上看也不好。

另一种选择是每个版本都有一个分支。虽然这在这种情况下可以很好地工作,但我设想了一个分支/标签地狱,因为我们将配置存储库扩展到多个应用程序,并且它们各自的分支演变为不同的方向。

分支地狱的解决方案是为每个应用程序单独配置一个配置仓库。但是,我相信这在某种意义上违背了配置服务器的目的,因为它增加了开销。

还有其他方法吗?

【问题讨论】:

【参考方案1】:

Spring Cloud Config 的 Environment 资源由三个变量参数化:

    application 映射到客户端的 spring.application.name profile 映射到客户端上的 spring.active.profiles label 这是一个服务器端功能,标记了 versioned 集 配置文件。

由于在蓝绿部署的情况下,您在同一个配置文件中使用同一个应用程序,最好的选择是使用 Versioned 配置文件通过使用 git Tags

基本思想是为不同版本的配置文件创建标签,并告诉您的应用程序使用与特定标签相关的配置,在您的bootstrap.properties 中使用spring.cloud.config.label

例如,您可以使用v1.0v2.0 标记两个不同的提交:

对于旧实例使用spring.cloud.config.label=v1.0,对于新实例使用spring.cloud.config.label=v2.0

当我们扩展到多个应用程序及其各自的配置存储库时 分支向不同的方向发展。

为了避免这个问题,我建议只在application-profile.properties 配置文件中保存通用和跨应用程序属性。更好的方法是每个应用程序都有自己的配置文件,例如recommender.properties 用于推荐服务,search.properties 用于搜索服务。然后,您可以通过定义适当的spring.application.name 来为它们中的每一个使用配置文件特定的和版本化的属性。通过这种方式,您可以在配置文件中实现某种程度的单一职责原则

【讨论】:

上述解决方案特定于基于 Git 的系统。文件系统/本机属性中的属性如何? 我知道这个答案已经过时了,但它仍然不能满足我的需求,我觉得有一个重要的地方被遗漏了。我们公司尝试使用单个存储库来实现配置服务器,以存储我们中间件生态系统的属性。如果我们遵循这种使用标签的方法,那么每次我们为其中一个应用程序编辑属性时,我们每个月都会得到数百个标签。还有一个事实是,没有两个应用程序可以具有相同的版本,否则标签会发生冲突。无缘无故限制库的用例是没有意义的。 @brenosilva 您是否同时找到了一个聪明的解决方案?我目前面临同样的问题,想站在你的肩膀上:)

以上是关于使用 Spring Cloud Config 进行属性版本控制的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Config 配置中心 自动加解密功能

如何使用Spring Cloud Config进行分布式配置,知道一个算你牛

Spring Cloud Config-Git后端

Spring Cloud Config-Git后端

使用Spring Cloud Config进行分布式配置:自动重新加载配置

重命名 spring-cloud-config 原生配置文件