sc-config:进阶应用之本地文件系统配置

279 阅读4分钟

这是我参与更文挑战的第 18 天,活动详情查看: 更文挑战

《配置中心 Spring Cloud Config 详解》系列文章更新,一起在技术的路上精进!本系列文章将会介绍Spring Cloud 中提供了分布式配置中心Spring Cloud Config。应用服务中除了实现系统功能的代码,还需要连接资源和其它应用,经常有很多需要在外部配置的数据去调整应用的行为,如切换不同的数据库,设置功能开关等。随着微服务的不断增加,需要系统具备可伸缩和可扩展性,除此之外就是管理相当多的服务实例的配置数据。在应用的开发阶段由各个服务自治,但是到了生产环境之后会给运维带来很大的麻烦,特别是微服务的规模比较大,配置的更新更为麻烦。为此,系统需要建立一个统一的配置管理中心。

应用进阶

Spring Cloud Config的基础应用主要包括三大元素:

  • 配置服务器
  • 配置客户端
  • 配置仓库

实现了config client启动时,根据配置的规则,先从config Server拉取其对应的配置信息,然后才会初始化config client的上下文环境。另外还补充了配置的动态刷新和webHook应用于配置刷新。

其他的功能如模式匹配和对repo、配置仓库的加密解密、属性覆盖、SVN配置(本地)仓库、安全保护等功能。

在前面的文章,我们主要介绍了 Spring Cloud Config 如何进行客户端覆写远端的配置属性以及使用 SVN 或本地文件系统作为配置仓库。本文将会重点介绍本地文件系统以及属性覆盖的用法。

本地文件系统

如果你不使用git、SVN,Config Server还提供了本地文件系统,对应于“native”的profile。从本地的类路径或者文件加载配置文件。使用“spring.cloud.config.server.native.searchLocations”配置任何你想指向的静态路径。

spring:
  profiles:
    active: native
  cloud:
    config:
      server:
        native:
          searchLocations: file:/Users/user/Documents/config-repo

需要注意的是,资源文件的路径前需要加上file:前缀,默认classpath路径中通常没有前缀。Spring Boot 应用中还可以使用环境的占位符${user.home},另外在Windows中绝对路径需要额外的/,如 file:///${user.home}/config-reposearchLocations默认值与Spring Boot应用的类路径(如[classpath:/, classpath:/config, file:./, file:./config])。这不会将application.properties从服务器公开到所有客户端,因为服务器中存在的任何属性源在发送到客户端之前都被删除。

搜索路径可以包含{application}, {profile}{label}占位符,这样就可以在路径中分个目录,然后选择易懂的区分策略。

如果搜索路径中不使用占位符,config Server在实现时在搜索路径HTTP资源后面自动追加{label}参数,属性文件从每个搜索位置和一个与标签具有相同名称的子目录中加载(在Spring环境中标记的属性优先)。因此,没有占位符的默认行为与添加一个搜索路径以/{label}/结尾是相同的效果,如配置的搜索路径file:/tmp/configfile:/tmp/config,file:/tmp/config/{label}其实是相同的。当然,这种默认的行为可以通过设置spring.cloud.config.server.native.addLabelLocations=false来阻止。

属性覆盖

Config Server有一个属性覆盖overrides特性,允许将配置的属性强制应用到所有的应用服务,而且不能被使用普通的Spring Boot钩子的应用程序意外地改变。声明属性覆盖,是一种map的格式,在spring.cloud.config.server.overrides后面增加key-value,如下面的配置所示:

spring:
  cloud:
    config:
      server:
        overrides:
          cloud: Edgware.RELEASE

这将会使得所有的配置客户端独立于自己的配置读取cloud: Edgware.RELEASE。当然,应用程序可以以任何方式使用Config Server中的数据,这种情况下覆盖不可执行,但是如果它们是Spring Cloud Config客户端,上述配置是有效的。

小结

本文主要介绍了 Spring Cloud Config 本地文件系统以及属性覆盖的用法。有些情况下,使用本地文件系统作为配置源也是非常方便的,除此之外,当我们需要强行覆盖一些属性时,也可以通过 overrides 配置进行。