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

教程:在 Gin Web 应用中使用动态配置

本教程介绍如何使用 Azure 应用配置在 Gin Web 应用程序中实现动态配置更新。 它基于上一快速入门中引入的 Web 应用。

先决条件

完成快速入门: 使用 Azure 应用配置创建 Gin Web 应用

从应用配置重载数据

  1. 打开 appconfig.go文件。 在 loadAzureAppConfiguration 函数内部,更新 options 以启用刷新。 每当 Go 提供程序检测到任何所选键值更改时,Go 提供程序都会重新加载整个配置。 有关监视配置更改的详细信息,请参阅 配置刷新的最佳做法

    options := &azureappconfiguration.Options{
        Selectors: []azureappconfiguration.Selector{
            {
                KeyFilter: "Config.*",
            },
        },
        TrimKeyPrefixes: []string{"Config."},
        RefreshOptions: azureappconfiguration.KeyValueRefreshOptions{
            Enabled:  true,
        },
    }
    

    小窍门

    可以设置 Interval 属性 RefreshOptions 以指定配置刷新之间的最短时间。 在此示例中,使用默认值 30 秒。 如果需要减少对应用配置存储的请求数量,请调整为更高的值。

  2. 更新您的main.go文件以注册用于配置更新的回调函数:

    // Existing code
    // ... ...
    var config Config
    if err := provider.Unmarshal(&config, nil); err != nil {
        log.Fatalf("Failed to unmarshal configuration: %v", err)
    }
    
    // Register refresh callback
    provider.OnRefreshSuccess(func() {
        // Re-unmarshal the configuration
        err := provider.Unmarshal(&config, nil)
        if err != nil {
            log.Printf("Failed to unmarshal updated configuration: %s", err)
            return
        }
    })
    
  3. 添加配置刷新中间件。 使用以下代码更新 main.go

    func configRefreshMiddleware(provider *azureappconfiguration.AzureAppConfiguration) gin.HandlerFunc {
        return func(c *gin.Context) {
            // Start refresh in a goroutine to avoid blocking the request
            go func() {
                ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
                defer cancel()
    
                if err := provider.Refresh(ctx); err != nil {
                    log.Printf("Error refreshing configuration: %s", err)
                }
            }()
    
            c.Next()
        }
    }
    
  4. 使用配置刷新中间件:

    // Existing code
    // ... ...
    router := gin.Default()
    
    // Use the configuration refresh middleware
    router.Use(configRefreshMiddleware(provider))
    
    // The rest of existing code
    //... ...
    

请求驱动的配置刷新

配置刷新由对 Web 应用的传入请求触发。 如果应用处于空闲状态,则不会发生刷新。 当应用处于活动状态时,配置刷新中间件会监视你在其中 azureappconfiguration.Options配置的所选键值。 每次向应用传入请求时,都会触发中间件。 但是,仅当设置的刷新间隔通过时,中间件才会发送请求以检查应用配置中的值。

  • 如果向应用程序配置的更改检测请求失败,则应用将继续使用缓存的配置。 只要您的应用有新的传入请求,将会定期尝试检查是否有更改。
  • 配置刷新与应用传入请求的处理异步进行。 它不会阻止或减缓触发刷新的传入请求。 触发刷新的请求可能不会得到更新的配置值,但是后面的请求会得到新的配置值。
  • 为确保触发中间件,请尽早在请求管道中使用配置刷新中间件,这样其他中间件就不会在应用中跳过它。

运行 Web 应用程序

设置动态配置刷新后,让我们对其进行测试以查看效果。

  1. 运行该应用程序。

    go run main.go
    
  2. 打开 Web 浏览器并导航到 http://localhost:8080 访问应用程序。 Web 页面如下所示:

    之前的 Gin Web 应用刷新的屏幕截图。

  3. 导航到您的应用配置存储并更新 Config.Message 密钥的值。

    密钥 价值 内容类型
    Config.Message Azure 应用配置中的问候语 - 现可实时更新! 留空
  4. 刷新浏览器几次后,ConfigMap 会在 30 秒内更新,然后你会看到更新的内容。

    gin Web 应用刷新后的屏幕截图。

清理资源

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

重要

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

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

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