在 Azure 容器应用中为 Config Server for Spring 组件配置设置

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

显示

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

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

az containerapp env java-component config-server-for-spring 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参数在 Config Server for Spring 组件和你的容器应用之间创建连接。

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

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

取消绑定

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

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

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

配置选项

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

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

Git 后端配置

名称 描述
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
远程存储库的 URI。
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
使用远程存储库进行身份验证的用户名。
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
使用远程存储库进行身份验证的密码。
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
在本地工作副本中使用的搜索路径。 默认情况下,仅搜索根目录。
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
用于指示存储库应强制拉取的标志。 如果为 true,则放弃任何本地更改并从远程存储库获取。
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
用于 Git 的默认标签为 main。 如果未设置 spring.cloud.config.server.git.default-label,并且名为 main 的分支不存在,则默认情况下,配置服务器还将尝试签出名为 master 的分支。 如果要禁用回退分支行为,可以将 spring.cloud.config.server.git.tryMasterBranch 设置为 false。
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
默认情况下,配置服务器将尝试签出名为 master 的分支。
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
通过将 git.skipSslValidation 属性设置为 true,可以禁用配置服务器的对 Git 服务器的 SSL 证书的验证。
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
用于指示应在启动时(而不是按需)克隆存储库的标志。 通常会导致启动速度变慢,但第一个查询速度会变快。
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
获取 HTTP 或 SSH 连接(如果适用)的超时(以秒为单位)。 默认为 5 秒。
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
Config Server 将从你的 Git 后端提取更新后的配置数据的频率。
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
验证 SSH 私钥。 如果 ignore-local-ssh-settings 为 true 并且 Git URI 为 SSH 格式,则必须设置。
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
有效的 SSH 主机密钥。 如果还设置了 host-key-algorithm,则必须设置。
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
ssh-dss、ssh-rsa、ssh-ed25519、ecdsa-sha2-nistp256、ecdsa-sha2-nistp384 或 ecdsa-sha2-nistp521 之一。 如果还设置了主机键,则必须设置。
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true 或 false。 如果为 false,则忽略主机密钥的错误。
spring.cloud.config.server.git.repos.{repoName} 远程存储库的 URI。
spring.cloud.config.server.git.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 以禁用服务器端解密。

刷新

使用属性的服务需要在更改发生之前知道它。 Config Server for Spring 的默认通知方法涉及手动触发刷新事件,例如通过调用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. 更新 Config Server for Spring Java 组件,以使用具有加密属性的 git 存储库并设置加密密钥。

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

    az containerapp env java-component config-server-for-spring 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. 更新 Config Server for Spring Java 组件以使用具有加密属性的 git 存储库并禁用服务器端解密。

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

    az containerapp env java-component config-server-for-spring 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
    

后续步骤