在 Azure 容器应用中配置 Spring Cloud Config Server 组件的设置(预览版)

Spring Cloud Config Server 提供了一个集中位置来使配置数据可用于多个应用程序。 使用以下指南了解如何配置和管理 Spring Cloud Config Server 组件。

显示

可以使用 show 命令按名称查看单个组件的详细信息。

在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

az containerapp env java-component spring-cloud-config show \
  --environment <ENVIRONMENT_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --name <JAVA_COMPONENT_NAME>

列出

可以使用 list 命令列出所有注册的 Java 组件。

在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

az containerapp env java-component list \
  --environment <ENVIRONMENT_NAME> \
  --resource-group <RESOURCE_GROUP>

Bind

使用 update 命令的 --bind 参数在 Spring Cloud Config Server 组件和你的容器应用之间创建连接。

在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

az containerapp update \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --bind <JAVA_COMPONENT_NAME>

取消绑定

若要中断容器应用与 Spring Cloud Config Server 组件之间的连接,请使用 update 命令的 --unbind 参数。

在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

az containerapp update \
  --name <CONTAINER_APP_NAME> \
  --unbind <JAVA_COMPONENT_NAME> \
  --resource-group <RESOURCE_GROUP>

配置选项

az containerapp update 命令使用 --configuration 参数控制 Spring Cloud Config Server 的配置方式。 只要多个参数被空格分隔,就可以一次性使用它们。 可以在 Spring Cloud Config Server 文档中找到更多详细信息。

下表列出了可用的不同配置值。

spring.cloud.config.server.git 配置属性上提供了以下配置设置。

名称 属性路径 说明
URI repos.{repoName}.uri 远程存储库的 URI。
用户名 repos.{repoName}.username 使用远程存储库进行身份验证的用户名。
密码 repos.{repoName}.password 使用远程存储库进行身份验证的密码。
搜索路径 repos.{repoName}.search-paths 在本地工作副本中使用的搜索路径。 默认情况下,仅搜索根目录。
强制拉取 repos.{repoName}.force-pull 用于指示存储库应强制拉取的标志。 如果此值设置为 true,则放弃任何本地更改并从远程存储库获取。
默认标签 repos.{repoName}.default-label 用于 Git 的默认标签为 main。 如果未设置 default-label,并且名为 main 的分支不存在,则 Config Server 会尝试签出名为 master 的分支。 若要禁用回退分支行为,可以将 tryMasterBranch 设置为 false
试用 master 分支 repos.{repoName}.try-master-branch 设置为 true 时,Config Server 会默认尝试签出名为 master 的分支。
跳过 SSL 验证 repos.{repoName}.skip-ssl-validation 通过将 git.skipSslValidation 属性设置为 true,可以禁用配置服务器的 Git 服务器的 SSL 证书验证。
开始时克隆 repos.{repoName}.clone-on-start 用于指示应在启动时(而不是按需)克隆存储库的标志。 通常会导致启动速度变慢,但第一个查询速度会变快。
超时 repos.{repoName}.timeout 获取 HTTP 或 SSH 连接(如果适用)的超时(以秒为单位)。 默认为 5 秒。
“刷新速率” repos.{repoName}.refresh-rate Config Server 从你的 Git 后端提取更新后的配置数据的频率。
私钥 repos.{repoName}.private-key 验证 SSH 私钥。 如果 ignore-local-ssh-settingstrue 且 Git URI 为 SSH 格式,则必须设置。
主机密钥 repos.{repoName}.host-key 有效的 SSH 主机密钥。 如果还设置了 host-key-algorithm,则必须设置。
主机密钥算法 repos.{repoName}.host-key-algorithm ssh-dssssh-rsassh-ed25519ecdsa-sha2-nistp256ecdsa-sha2-nistp384ecdsa-sha2-nistp521 的其中一个。 如果还设置了 host-key,则必须设置。
严格的主机密钥检查 repos.{repoName}.strict-host-key-checking truefalse。 如果 false,则忽略主机密钥的错误。
存储库位置 repos.{repoName} 远程存储库的 URI。
存储库名称模式 repos.{repoName}.pattern 模式格式是带通配符的 {application}/{profile} 名称的逗号分隔列表。 如果 {application}/{profile} 与任何模式都不匹配,则它会使用下面定义的默认 URI。

常见配置

  • 日志记录相关配置

    • logging.level.*
    • logging.group.*
    • 应禁止使用 logging.* 命名空间下的任何其他配置,例如,应禁止使用 logging.file 写入日志文件。
  • spring.cloud.config.server.overrides

    • 要无条件地发送到所有客户端的属性源的额外映射。
  • spring.cloud.config.override-none

    • 可以通过在远程存储库中设置 spring.cloud.config.override-none=true 标志(默认值为 false)来更改客户端中所有替代的优先级,使它们更像是默认值,让应用程序在环境变量或系统属性中提供自己的值。
  • spring.cloud.config.allow-override

    • 如果启用配置先行启动,则可以允许客户端应用程序通过在来自 Config Server 的应用程序配置中放置两个属性来替代 Config Server 中的配置。
  • spring.cloud.config.server.health.

    • 可以将运行状况指示器配置为检查更多应用程序以及自定义配置文件和自定义标签
  • spring.cloud.config.server.accept-empty

    • 如果找不到应用程序,则可以将 spring.cloud.config.server.accept-empty 设置为 false 来让服务器返回 HTTP 404 状态。 此标志默认设置为 true
  • 加密和解密(对称)

    • encrypt.key
      • 使用对称密钥很方便,因为它是一个待配置的属性值。
    • spring.cloud.config.server.encrypt.enabled
      • 可以将此项设置为 false 以禁用服务器端解密。

刷新

使用属性的服务需要在更改发生之前知道它。 Spring Cloud Config Server 的默认通知方法涉及手动触发刷新事件,例如通过调用 https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh 刷新,但如果有许多应用实例,这就可能不可行。

可以改为让配置客户端根据刷新间隔来轮询更改,从而自动刷新 Config Server 中的值。 使用以下步骤自动刷新 Config Server 中的值。

  1. 注册计划任务以按给定的间隔刷新上下文,如以下示例所示。

    @Configuration
    @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class})
    @EnableScheduling
    public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer {
        @Value("${spring.cloud.config.refresh-interval:60}")
        private long refreshInterval;
        @Value("${spring.cloud.config.auto-refresh:false}")
        private boolean autoRefresh;
        private final RefreshEndpoint refreshEndpoint;
        public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) {
            this.refreshEndpoint = refreshEndpoint;
        }
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            if (autoRefresh) {
                // set minimal refresh interval to 5 seconds
                refreshInterval = Math.max(refreshInterval, 5);
                scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh,  Duration.ofSeconds(refreshInterval));
            }
        }
    }
    
  2. 在 application.yml 文件中启用 autorefresh 并设置适当的刷新间隔。 在以下示例中,客户端每隔 60 秒钟轮询一次配置更改,这是可为刷新间隔设置的最小值。

    默认情况下,autorefresh 设置为 falserefresh-interval 设置为 60 秒。

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. 在代码中添加 @RefreshScope。 在以下示例中,变量 connectTimeout 每隔 60 秒钟自动刷新一次。

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

使用对称密钥进行加密和解密

服务器端解密

默认启用服务器端加密。 使用以下步骤在应用程序中启用解密。

  1. 在你的 git 存储库中的 .properties 文件中添加加密属性。

    例如,你的文件应类似于以下示例:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. 更新 Spring Cloud Config Server Java 组件,以使用具有加密属性的 git 存储库并设置加密密钥。

    在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

    az containerapp env java-component spring-cloud-config update \
      --environment <ENVIRONMENT_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --name <JAVA_COMPONENT_NAME> \
      --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
    

客户端解密

可以按照以下步骤使用属性的客户端解密:

  1. 在你的 git 存储库中的 *.properties* 文件中添加加密属性。

  2. 更新 Spring Cloud Config Server Java 组件以使用具有加密属性的 git 存储库并禁用服务器端解密。

    在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

    az containerapp env java-component spring-cloud-config update \
      --environment <ENVIRONMENT_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --name <JAVA_COMPONENT_NAME> \
      --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=false
    
  3. 在你的客户端应用中,将解密密钥 ENCRYPT_KEY=randomKey 添加为环境变量。

    或者,如果在 classpath 上包含了 spring-cloud-starter-bootstrap,或将 spring.cloud.bootstrap.enabled=true 设置为系统属性,则在 bootstrap.properties 中设置 encrypt.key

    在运行以下命令之前,请将 <> 括起来的占位符替换为你的值。

    az containerapp update \
      --name <APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
        --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey