你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:通过在 Java Spring 应用中使用推送刷新来使用动态配置

应用程序配置 Java Spring 客户端库支持按需更新配置,不需让应用程序重启。 应用程序可以配置为使用以下两种方法中的一种或两种来检测应用配置更改。

  • 轮询模型:轮询模型是使用轮询检测配置更改的默认行为。 设置的缓存值到期后,对 AppConfigurationRefreshrefreshConfigurations 的下一次调用将向服务器发送请求,以检查配置是否已更改,并根据需要拉取已更新的配置。

  • 推送模型:这将使用应用配置事件检测配置更改。 应用程序配置设置为使用事件网格发送键值更改事件后,应用程序就可以通过 Webhook,使用这些事件来优化保持配置更新所需的请求总数。

本教程演示如何在代码中使用推送刷新实现动态配置更新。 它建立在快速入门中介绍的应用之上。 请先完成使用应用程序配置创建 Java Spring 应用,然后再继续。

你可以使用任何代码编辑器执行本教程中的步骤。 Visual Studio Code 是 Windows、macOS 和 Linux 平台上提供的一个卓越选项。

在本教程中,你将了解如何执行以下操作:

  • 设置订阅以将配置更改事件从“应用程序配置”发送到“Webhook”
  • 将 Spring Boot 应用程序部署到应用服务
  • 设置 Java Spring 应用,以根据应用程序配置中的更改更新其配置。
  • 在应用程序中使用最新配置。

先决条件

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

设置推送刷新

  1. 打开 pom.xml 并使用以下依赖项更新文件。
<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-appconfiguration-config-web</artifactId>
</dependency>

<!-- Adds the Ability to Push Refresh -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>5.18.0</version>
        <type>pom</type>
        <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 设置 Maven 应用服务部署,以便可以通过 Maven 将应用程序部署到 Azure 应用服务。

    mvn com.microsoft.azure:azure-webapp-maven-plugin:2.5.0:config
    
  2. 导航到你的应用的 resources 目录并打开 bootstrap.properties 然后配置 Azure 应用程序配置推送刷新。 如果该文件不存在,请创建。 将以下行添加到该文件。

    可以使用 DefaultAzureCredential 向应用程序配置存储区进行身份验证。 按照说明为凭据分配应用程序配置数据读取者角色。 在运行应用程序之前,请务必留出足够的时间来传播权限。 创建名为 AppConfigCredential.java 的新文件,并添加以下行

    spring.cloud.azure.appconfiguration.stores[0].endpoint= ${APP_CONFIGURATION_ENDPOINT}
    spring.cloud.azure.appconfiguration.stores[0].monitoring.enabled= true
    spring.cloud.azure.appconfiguration.stores[0].monitoring.refresh-interval= 30d
    spring.cloud.azure.appconfiguration.stores[0].monitoring.triggers[0].key= sentinel
    spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.primary-token.name= myToken
    spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.primary-token.secret= myTokenSecret
    
    management.endpoints.web.exposure.include= appconfiguration-refresh
    

    此外,除非你想使用托管标识,否则需要将以下代码添加到项目中:

    import org.springframework.stereotype.Component;
    
    import com.azure.data.appconfiguration.ConfigurationClientBuilder;
    import com.azure.identity.DefaultAzureCredentialBuilder;
    import com.azure.spring.cloud.appconfiguration.config.ConfigurationClientCustomizer;
    
    @Component
    public class AppConfigCredential implements ConfigurationClientCustomizer {
    
        @Override
        public void customize(ConfigurationClientBuilder builder, String endpoint) {
            builder.credential(new DefaultAzureCredentialBuilder().build());
        }
    }
    

    请添加“启动配置”配置,方法是在 resources/META-INF 目录下创建 spring.factories 文件,并添加以下行,使用你的应用程序名称和包更新 com.example.MyApplication

    org.springframework.cloud.bootstrap.BootstrapConfiguration=\
    com.example.MyApplication
    

在将缓存值标记为“脏”之前会增加一个随机延迟,以减少潜在的限制。 缓存值被标记为“脏”之前的默认最长延迟时间为 30 秒。

注意

主令牌名应作为密钥存储在应用程序配置中,然后主令牌机密应作为“应用程序配置密钥保管库参考”来进行存储,以增加安全性。

在应用服务中生成并运行应用

事件网格 Webhook 需要在创建时进行验证。 可以按照本指南进行验证,也可以通过启动已配置了 Azure 应用程序配置 Spring Web 库(此过程会为你注册应用程序)的应用程序来验证。 要使用事件订阅,请按照以下两部分中的步骤操作。

  1. 设置环境变量。

    将名为 APP_CONFIGURATION_ENDPOINT 的环境变量设置为 Azure 门户中存储区的“概述”下的应用程序配置存储区的终结点。

    如果使用 Windows 命令提示符,则请运行以下命令并重启命令提示符,这样更改才会生效:

    setx APP_CONFIGURATION_ENDPOINT "endpoint-of-your-app-configuration-store"
    

    如果使用 PowerShell,请运行以下命令:

    $Env:APP_CONFIGURATION_ENDPOINT = "endpoint-of-your-app-configuration-store"
    

    如果使用 macOS 或 Linux,则请运行以下命令:

    export APP_CONFIGURATION_ENDPOINT='<endpoint-of-your-app-configuration-store>'
    

    重启命令提示符以使更改生效。 输出环境变量的值以验证其设置是否正确。


  2. 更新 azure-webapp-maven-pluginconfiguration 添加下的 pom.xml

    <appSettings>
      <AppConfigurationConnectionString>${AppConfigurationConnectionString}</AppConfigurationConnectionString>
    </appSettings>
    
  3. 运行以下命令以生成控制台应用:

     mvn package
    
  4. 生成成功完成后,请运行以下命令以在本地运行应用:

    mvn azure-webapp:deploy
    

设置事件订阅

  1. 在 Azure 门户中打开“应用配置”资源,然后在 Events 窗格中选择 + Event Subscription

    事件窗格中有一个用于创建新订阅的选项。

  2. 输入 Event SubscriptionSystem Topic 的名称。 默认情况下,设置了事件类型“键值修改”和“键值删除”,原因可更改,方法是使用“筛选器”选项卡,选择发送“推送事件”的确切原因。

    事件需要名称、主题和筛选器。

  3. 选择 Endpoint Type 作为 Web Hook,选择 Select an endpoint

    “选择终结点”会创建一个用于输入终结点 URI 的新边栏选项卡。

  4. 终结点是应用程序 URI +“/actuator/appconfiguration-refresh?{your-token-name}={your-token-secret}”。 例如: https://my-azure-webapp.azurewebsites.net/actuator/appconfiguration-refresh?myToken=myTokenSecret

  5. 选择 Create 以创建事件订阅。 选择 Create 后,将会向应用程序发送 Webhook 注册请求。 此请求由 Azure 应用程序配置客户端库接收、验证并返回有效响应。

  6. Events 窗格中选择 Event Subscriptions 以验证订阅是否已成功创建。

    Webhook 显示在页面底部的表中。

注意

订阅配置更改时,可以使用一个或多个筛选器来减少发送到应用程序的事件数。 这些可以配置为事件网格订阅筛选器。 例如,订阅筛选器可用于仅订阅以特定字符串开头的键的更改的事件。

注意

如果应用程序有多个实例在运行,则可以使用需要设置 Azure 服务总线的 appconfiguration-refresh-bus 终结点,其用于向应用的所有实例发送消息以刷新其配置。 如有多个应用实例正在运行,并且希望确保所有实例都使用最新配置进行更新,那么这非常有用。 除非将 spring-cloud-bus 配置为依赖项,否则此终结点不可用。 有关详细信息,请参阅 Azure 服务总线 Spring Cloud Bus 文档。 只需要设置服务总线连接,Azure 应用程序配置库将处理消息的发送和接收。

验证并测试应用程序

  1. 应用程序运行以后,请使用 curl 测试该应用程序,例如 :

    curl -X GET https://my-azure-webapp.azurewebsites.net
    
  2. 打开 Azure 门户并导航到与应用程序关联的应用程序配置资源。 在“操作”下选择“配置资源管理器”并更新以下密钥值 :

    密钥
    application/config.message Hello - Updated
  3. 刷新浏览器页面,查看显示的新消息。

清理资源

如果不想继续使用本文中创建的资源,请删除此处创建的资源组以避免产生费用。

重要

删除资源组的操作不可逆。 将永久删除资源组以及其中的所有资源。 请确保不要意外删除错误的资源组或资源。 如果在包含要保留的其他资源的资源组中创建了本文的资源,请从相应的窗格中单独删除每个资源,而不是删除该资源组。

  1. 登录到 Azure 门户,然后选择“资源组”。
  2. 在“按名称筛选”框中,输入资源组的名称
  3. 在结果列表中,选择资源组名称以查看概述。
  4. 选择“删除资源组”。
  5. 系统会要求确认是否删除资源组。 重新键入资源组的名称进行确认,然后选择“删除”。

片刻之后,将会删除该资源组及其所有资源。

后续步骤

在本教程中,你已启用 Java 应用,以通过应用程序配置动态刷新配置设置。 有关更多问题,请参阅参考文档,其中包含有关 Spring Cloud Azure 应用程序配置库如何工作的所有详细信息。 若要了解如何使用 Azure 托管标识来简化对应用程序配置的访问,请继续学习下一篇教程。