在 Azure Spring Apps 中配置托管的 Spring Cloud Config Server

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。

本文介绍如何在 Azure Spring Apps 中配置托管的 Spring Cloud Config Server。

Spring Cloud Config Server 为分布式系统中的外部化配置提供了服务器和客户端支持。 Spring Cloud Config Server 实例提供了一个中心位置来管理所有环境中应用程序的外部属性。 有关详细信息,请参阅 Spring Cloud 配置

先决条件

限制

在后端上使用配置服务器时存在一些限制。 以下属性将自动注入到应用程序环境,以访问“Config Server”和“服务发现”。 如果你同时从配置服务器文件配置了这些属性,可能会遇到冲突和意外的行为。

  • eureka.client.service-url.defaultZone
  • eureka.client.tls.keystore
  • eureka.instance.preferIpAddress
  • eureka.instance.instance-id
  • server.port
  • spring.cloud.config.tls.keystore
  • spring.config.import
  • spring.application.name
  • spring.jmx.enabled
  • management.endpoints.jmx.exposure.include

注意

避免将这些属性放置在 Config Server 应用程序文件中。

创建配置服务器文件

Azure Spring Apps 支持使用 Azure DevOps Server、GitHub、GitLab 和 Bitbucket 来存储 Config Server 文件。 存储库准备就绪后,便可以创建配置文件并将其存储在库里。

一些可配置属性仅适用于某些类型。 以下部分介绍每种存储库类型的属性。

注意

如果你未指定,Config Server 会将 master(在 Git 上)作为默认标签。 但 GitHub 最近已将默认分支从 master 更改为 main。 为避免 Azure Spring Apps Config Server 失败,请务必在使用 GitHub 设置 Config Server 时注意默认标签,尤其是对于新创建的存储库。

使用连字符 (-) 分隔单词是目前唯一受支持的属性命名约定。 例如,可以使用 default-label,但不能使用 defaultLabel

公共存储库

使用公共存储库时,可配置属性的受限程度比专用存储库更高。

下表列出了可用于设置公共 Git 存储库的可配置属性:

properties 必选 Feature
uri 用作 Config Server 后端的 Git 存储库的 URI。 应以 http://https://git@ssh:// 开头。
default-label Git 存储库的默认标签。 应为存储库中的分支名称、标记名称或提交 ID。
search-paths 用于搜索 Git 存储库子目录的字符串数组。

使用 SSH 身份验证的专用存储库

下表列出了可用于设置使用 SSH 的专用 Git 存储库的可配置属性:

properties 必选 Feature
uri 用作 Config Server 后端的 Git 存储库的 URI。 应以 http://https://git@ssh:// 开头。
default-label Git 存储库的默认标签。 应为存储库的分支名称、标记名称或提交 ID。
search-paths 用于搜索 Git 存储库子目录的字符串数组。
private-key 用于访问 Git 存储库的 SSH 私钥。 URI 以 git@ssh:// 开头时需要。
host-key Git 存储库服务器的主机密钥。 不应包含 host-key-algorithm 所涵盖的算法前缀。
host-key-algorithm 主机密钥算法。 应为 ssh-dssssh-rsaecdsa-sha2-nistp256ecdsa-sha2-nistp384ecdsa-sha2-nistp521。 仅当存在 host-key 时,才是必需的。
strict-host-key-checking 显示在使用专用 host-key 时是否无法启动的 Config Server 指示器。 应为 true(默认值)或 false

使用基本身份验证的专用存储库

下表列出了可用于设置使用基本身份验证的专用 Git 存储库的可配置属性:

properties 必选 Feature
uri 用作 Config Server 后端的 Git 存储库的 URI。 应以 http://https://git@ssh:// 开头。
default-label Git 存储库的默认标签。 应为存储库中的分支名称、标记名称或提交 ID。
search-paths 用于搜索 Git 存储库子目录的字符串数组。
username 用于访问 Git 存储库服务器的用户名。 Git 存储库服务器支持 HTTP 基本身份验证时需要。
password 用于访问 Git 存储库服务器的密码或个人访问令牌。 Git 存储库服务器支持 HTTP 基本身份验证时需要。

注意

许多 Git 存储库服务器都支持对 HTTP 基本身份验证使用令牌,而不支持使用密码。 某些存储库允许令牌无限期保留。 但是,某些 Git 存储库服务器(包括 Azure DevOps Server)会在数小时后强制令牌过期。 导致令牌过期的存储库不应将基于令牌的身份验证用于 Azure Spring Apps。 如果你使用此类令牌,请记得在令牌过期之前更新它。

GitHub 已删除对密码身份验证的支持,因此你需要使用个人访问令牌,而不是 GitHub 的密码身份验证。 有关详细信息,请参阅 Git 操作的令牌身份验证要求

其他 Git 存储库

下表列出了可用于设置具有模式的 Git 存储库的可配置属性:

properties 必选 Feature
repos 包含具有给定名称的 Git 存储库的设置的图。
repos."uri" repos 上选择“是” 用作 Config Server 后端的 Git 存储库的 URI。 应以 http://https://git@ssh:// 开头。
repos."name" repos 上选择“是” 用于标识存储库的名称;例如 team-Ateam-B。 仅当存在 repos 时,才是必需的。
repos."pattern" 用于匹配应用程序名称的字符串数组。 对于每个模式,使用带有通配符的 {application}/{profile} 格式。
repos."default-label" Git 存储库的默认标签。 应为存储库的分支名称、标记名称或提交 IOD。
repos."search-paths" 用于搜索 Git 存储库子目录的字符串数组。
repos."username" 用于访问 Git 存储库服务器的用户名。 Git 存储库服务器支持 HTTP 基本身份验证时需要。
repos."password" 用于访问 Git 存储库服务器的密码或个人访问令牌。 Git 存储库服务器支持 HTTP 基本身份验证时需要。
repos."private-key" 用于访问 Git 存储库的 SSH 私钥。 URI 以 git@ssh:// 开头时需要。
repos."host-key" Git 存储库服务器的主机密钥。 不应包含 host-key-algorithm 所涵盖的算法前缀。
repos."host-key-algorithm" 主机密钥算法。 应为 ssh-dssssh-rsaecdsa-sha2-nistp256ecdsa-sha2-nistp384ecdsa-sha2-nistp521。 仅当存在 host-key 时,才是必需的。
repos."strict-host-key-checking" 指示在使用专用 host-key 时 Config Server 实例是否无法启动。 应为 true(默认值)或 false

下表显示了一些使用可选额外存储库配置服务的模式示例。 有关详细信息,请参阅本文的额外存储库部分和 Spring Cloud 配置模式匹配和多个存储库部分。

模式 说明
test-config-server-app-0/* 模式和存储库 URI 会匹配名为 test-config-server-app-0(无论具有什么配置文件)的 Spring Boot 应用程序。
test-config-server-app-1/dev 模式和存储库 URI 会匹配名为 test-config-server-app-1(具有开发配置文件)的 Spring Boot 应用程序。
test-config-server-app-2/prod 模式和存储库 URI 会匹配名为 test-config-server-app-2(具有 prod 配置文件)的 Spring Boot 应用程序。

Azure 门户的屏幕截图,其中显示了 Config Server 页,并突出显示了“其他存储库”表格的“模式”列。

针对 Config Server 配置 Git 存储库

将配置文件保存到存储库中后,请使用以下步骤将 Azure Spring Apps 连接到该存储库:

  1. 登录到 Azure 门户

  2. 转到 Azure Spring Apps 的“概述”页。

  3. 在导航窗格中选择“Spring Cloud Config Server”

  4. 在“默认存储库”部分,将“URI”设置为 https://github.com/Azure-Samples/piggymetrics-config

  5. 选择“验证”。

    Azure 门户的屏幕截图,其中显示了 Config Server 页。

  6. 完成验证后,选择“应用”以保存更改。

    Azure 门户的屏幕截图,其中显示了 Config Server 页,并突出显示了“应用”按钮。

更新配置可能需要几分钟。 配置完成后,会收到通知。

将存储库信息直接输入到 Azure 门户

可以输入默认存储库的存储库信息,也可以输入额外存储库的存储库信息。

默认存储库

本部分介绍如何输入公共或专用存储库的存储库信息。 对于专用存储库,可以使用基本身份验证或 SSH。

使用以下步骤输入公共存储库的存储库信息:

  1. 在“默认存储库”部分的“Uri”框中粘贴存储库 URI
  2. 为“标签”设置输入“配置”
  3. 确保“身份验证”设置为“公共”
  4. 选择“应用”。

使用以下步骤,通过基本密码/基于令牌的身份验证输入专用存储库的存储库信息:

  1. 在“默认存储库”部分的“Uri”框中粘贴存储库 URI

  2. 在“身份验证”下,选择“编辑身份验证”

  3. 在“编辑身份验证”窗格中的“身份验证类型”下拉列表中,选择“HTTP 基本”

  4. 输入用户名和密码/令牌以授予对 Azure Spring Apps 的访问权限。

  5. 选择“确定”,然后选择“应用”完成配置服务器实例的设置 。

    Azure 门户的屏幕截图,其中显示了基本身份验证的身份验证设置的默认存储库部分。

    注意

    许多 Git 存储库服务器都支持对 HTTP 基本身份验证使用令牌,而不支持使用密码。 某些存储库允许令牌无限期保留。 但是,某些 Git 存储库服务器(包括 Azure DevOps Server)会在数小时后强制令牌过期。 导致令牌过期的存储库不应将基于令牌的身份验证用于 Azure Spring Apps。 如果你使用此类令牌,请记得在令牌过期之前更新它。

    GitHub 已删除对密码身份验证的支持,因此你需要使用个人访问令牌,而不是 GitHub 的密码身份验证。 有关详细信息,请参阅 Git 操作的令牌身份验证要求

使用以下步骤,通过 SSH 输入专用存储库的存储库信息:

  1. 在“默认存储库”部分的“Uri”框中粘贴存储库 URI

  2. 在“身份验证”下,选择“编辑身份验证”

  3. 在“编辑身份验证”窗格中的“身份验证类型”下拉列表中,选择“SSH”

  4. 输入私钥。 (可选)指定主机密钥和主机密钥算法。

  5. 在 Config Server 存储库中包含公钥。

  6. 选择“确定”,然后选择“应用”完成配置服务器实例的设置 。

    Azure 门户的屏幕截图,其中显示了 SSH 身份验证的身份验证设置的默认存储库部分。

额外存储库

如果要使用可选的额外存储库配置服务,请使用以下步骤:

  1. 指定与默认存储库相同的“Uri”和“身份验证”设置。 请务必为模式包括“名称”设置
  2. 选择“应用”,将存储库附加到实例

通过导入 YAML 文件配置 Git 存储库

如果已使用存储库设置编写了 YAML 文件,则可以将该文件直接从本地计算机导入到 Azure Spring Apps。 以下示例显示使用基本身份验证的专用存储库的简单 YAML 文件:

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/azure-spring-apps-samples-pr/config-server-repository.git
          username: <username>
          password: <password/token>

使用以下步骤导入 YAML 文件:

  1. 选择“导入设置”,然后从项目目录中选择 YAML 文件。 选择“导入” 。

    Azure 门户的屏幕截图,其中显示了 Config Server“导入设置”窗格。

    “通知”窗格将显示 async 操作。 Config Server 应在 1-2 分钟后报告成功。 YAML 文件中的信息显示在 Azure 门户中。

  2. 选择“应用”以完成导入。

针对 Config Server 配置 Azure Repos

Azure Spring Apps 可以访问公开、由 SSH 保护或使用 HTTP 基本身份验证保护的 Git 存储库。 HTTP 基本身份验证是使用 Azure Repos 创建和管理存储库最简单的选项。

获取存储库 URL 和凭据

使用以下步骤获取存储库 URL 和凭据:

  1. 在项目的 Azure Repos 门户中,选择“克隆”

  2. 从文本框中复制克隆 URL。 此 URI 通常采用以下格式:

    https://<organization name>@dev.azure.com/<organization name>/<project name>/_git/<repository name>
    

    删除 https:// 后和 dev.azure.com 之前的所有内容,包括 @ 符号。 生成的 URL 应采用以下格式:

    https://dev.azure.com/<organization name>/<project name>/_git/<repository name>
    

    保存此 URL 供以后使用。

  3. 选择“生成 Git 凭据”以显示用户名和密码。 保存此用户名和密码,以便在接下来的部分中使用。

针对 Config Server 配置 Git 存储库

使用以下步骤配置存储库:

  1. 登录到 Azure 门户

  2. 转到 Azure Spring Apps 的“概述”页。

  3. 选择要配置的服务。

  4. 在服务页的左窗格中的“设置”下,选择“Spring Cloud Config Server”选项卡

  5. 使用以下步骤配置创建的存储库:

    • 添加之前保存的存储库 URI。
    • 选择“身份验证”下的设置,打开“编辑身份验证”窗格。
    • 对于“身份验证类型”,请选择“HTTP 基本”。
    • 对于“用户名”,请指定之前保存的用户名
    • 对于“密码”,请指定之前保存的密码
    • 选择“确定”,然后等待操作完成。

    Azure 门户的屏幕截图,其中显示了默认存储库配置设置,并突出显示了“身份验证类型”。

删除配置

在“Spring Cloud Config Server”选项卡上选择“重置”以擦除现有设置。 如果你希望将 Config Server 实例连接到另一个源(例如,从 GitHub 移到 Azure DevOps Server 时),请删除 Config Server 设置。

刷新 Config Server

更改属性时,必须通知使用这些属性的服务,然后才能进行更改。 Spring Cloud Config Server 的默认解决方案是手动触发刷新事件。如果有许多应用实例,这可能不可行。 有关详细信息,请参阅集中式配置

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

使用以下步骤自动刷新 Config Server 中的值:

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

    @ConditionalOnBean({RefreshEndpoint.class})
    @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 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(), refreshInterval * 1000);
            }
        }
    }
    
  2. 在 application.yml 文件中启用自动刷新并设置适当的刷新间隔。 在以下示例中,客户端每隔 60 秒钟轮询一次配置更改,这是可为刷新间隔设置的最小值。

    在默认情况下,自动刷新设置为“false”,刷新时间间隔设置为“60 seconds”。

    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;
    }
    

有关详细信息,请参阅 config-client-polling 示例。

Azure Spring Apps