共用方式為


教學課程:在 Gin Web 應用程式中使用動態設定

本教學課程示範如何使用 Azure 應用程式組態在 Gin Web 應用程式中實作動態設定更新。 其以上一個快速入門中介紹的 Web 應用程式為基礎。

先決條件

完成快速入門: 使用 Azure 應用程式組態建立 Gin Web 應用程式

從應用程式設定重新載入資料

  1. 開啟檔案 appconfig.go。 在函式 loadAzureAppConfiguration 內,更新 options 以啟用重新整理。 每當 Go 提供者偵測到任何選取的索引鍵/值變更時,就會重載整個組態。 如需監視組態變更的詳細資訊,請參閱 設定重新整理的最佳做法

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

    小提示

    您可以設定 IntervalRefreshOptions 屬性,以指定組態重新整理之間的最短時間。 在此範例中,您必須使用 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
        }
    })
    
    // The rest of existing code
    //... ...
    
  3. 新增設定重新整理中間件。 以下列程式碼來更新 main.go

    // Existing code
    // ... ...
    type App struct {
        Name      string
        Port      int
    }
    
    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()
        }
    }
    
    // The rest of existing code
    //... ...
    
  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 mod tidy
     go run .
    
  2. 開啟網頁瀏覽器並流覽至 http://localhost:8080 以存取您的應用程式。 網頁如下所示:

    先前 gin web 應用程式重新整理的螢幕截圖。

  3. 流覽至您的應用程式組態存放區,並更新金鑰的值 Config.Message

    鑰匙 價值觀 內容類型
    Config.Message 來自 Azure App Configuration 的問候 - 現在新增即時更新功能! 保留空白
  4. 刷新瀏覽器幾次之後,當 ConfigMap 在 30 秒內更新時,您就會看到最新的內容。

    gin Web 應用程式重新整理後的螢幕快照。

清理資源

如果您不想繼續使用本文中建立的資源,請刪除在此處建立的資源群組,以避免產生費用。

這很重要

刪除資源群組是無法回復的動作。 資源群組和其中的所有資源都將被永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您是在包含其他您想保留資源的資源群組中建立本文的資源,則應該從各自的面板中逐一刪除每個資源,而不用刪除整個資源群組。

  1. 登入 Azure 入口網站,然後選取 [資源群組]
  2. 在 [依名稱篩選] 方塊中,輸入您資源群組的名稱。
  3. 在結果清單中,選取資源群組名稱以查看概觀。
  4. 選擇 ,刪除資源群組
  5. 系統將會要求您確認是否刪除資源群組。 輸入您資源群組的名稱以進行確認,然後選取 [刪除]

不久後,系統便會刪除該資源群組及其所有的資源。