共用方式為


快速入門:將功能旗標新增至 Go Gin Web 應用程式

在本快速入門中,您將在 Azure 應用程式設定中建立功能旗標,並使用它來動態控制 Go Gin Web 應用程式中新網頁的可用性,而不需要重新啟動或重新部署它。

功能管理支援會擴充應用程式設定中的動態設定功能。 此範例示範如何透過即時更新和條件式頁面轉譯將功能旗標整合到 Go Gin Web 應用程式中。

先決條件

建立功能旗標

將名為 Beta 的功能旗標新增至應用程式組態存放區,並將 標籤描述 保留預設值。 如需如何使用 Azure 入口網站或 CLI 將功能旗標新增至存放區的詳細資訊,請移至 建立功能旗標

建立功能旗標的螢幕擷取畫面。

建立 Go Web 應用程式

  1. 為您的 Go 專案建立一個新目錄並導航到其中:

    mkdir gin-feature-flag-quickstart
    cd gin-feature-flag-quickstart
    
  2. 初始化一個新的Go模組:

    go mod init gin-feature-flag-quickstart
    
  3. 安裝 Azure 應用程式設定、Gin Web 架構和功能管理所需的 Go 套件:

    go get github.com/gin-gonic/gin
    go get github.com/microsoft/Featuremanagement-Go/featuremanagement
    go get github.com/microsoft/Featuremanagement-Go/featuremanagement/providers/azappconfig
    
  4. 為您的HTML範本建立範本目錄,並新增所需的HTML檔案:

    mkdir templates
    

    GitHub 存放庫 新增下列 HTML 範本檔案,並將其放在目錄中 templates

使用功能旗標

  1. 建立具有下列內容的檔案 appconfig.go 。 您可以使用 Microsoft Entra ID (建議) 或連接字串連線到應用程式組態存放區。

    package main
    
    import (
        "context"
        "log"
        "os"
    
        "github.com/Azure/AppConfiguration-GoProvider/azureappconfiguration"
        "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    )
    
    func loadAzureAppConfiguration(ctx context.Context) (*azureappconfiguration.AzureAppConfiguration, error) {
        // Get the endpoint from environment variable
        endpoint := os.Getenv("AZURE_APPCONFIG_ENDPOINT")
        if endpoint == "" {
            log.Fatal("AZURE_APPCONFIG_ENDPOINT environment variable is not set")
        }
    
        // Create a credential using DefaultAzureCredential
        credential, err := azidentity.NewDefaultAzureCredential(nil)
        if err != nil {
            log.Fatalf("Failed to create credential: %v", err)
        }
    
        // Set up authentication options with endpoint and credential
        authOptions := azureappconfiguration.AuthenticationOptions{
            Endpoint:   endpoint,
            Credential: credential,
        }
    
        // Configure feature flag options
        options := &azureappconfiguration.Options{
            FeatureFlagOptions: azureappconfiguration.FeatureFlagOptions{
                Enabled: true,
                RefreshOptions: azureappconfiguration.RefreshOptions{
                    Enabled: true,
                },
            },
        }
    
        // Load configuration from Azure App Configuration
        appConfig, err := azureappconfiguration.Load(ctx, authOptions, options)
        if err != nil {
            log.Fatalf("Failed to load configuration: %v", err)
        }
    
        return appConfig, nil
    }
    

    小提示

    FeatureFlagOptions 中未指定選取器時,其會載入應用程式組態存放區中沒有標籤所有功能旗標。 功能旗標的預設重新整理的間隔是 30 秒。 您可以透過 RefreshOptions 參數自訂此行為。 例如,下列程式碼片段只會載入「機碼名稱」中以 TestApp: 開頭,且標籤為 dev 的功能旗標。 程式碼也會將重新整理的間隔時間變更為 5 分鐘。 請注意,此重新整理的間隔時間與一般的索引鍵值不同。

    azureappconfiguration.FeatureFlagOptions{
        Enabled: true,
        Selectors: []azureappconfiguration.Selector{
            {
                KeyFilter:   "TestApp:*",
                LabelFilter: "dev",
            },
        },
        RefreshOptions: azureappconfiguration.RefreshOptions{
            Enabled: true,
            Interval: 5 * time.Minute,
        },
    }
    
  2. 使用下列內容建立名為 main.go 的檔案:

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
    
        "github.com/Azure/AppConfiguration-GoProvider/azureappconfiguration"
        "github.com/gin-gonic/gin"
        "github.com/microsoft/Featuremanagement-Go/featuremanagement"
        "github.com/microsoft/Featuremanagement-Go/featuremanagement/providers/azappconfig"
    )
    
    type WebApp struct {
        featureManager *featuremanagement.FeatureManager
        appConfig      *azureappconfiguration.AzureAppConfiguration
    }
    
    func (app *WebApp) refreshMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
            go func() {
                ctx := context.Background()
                if err := app.appConfig.Refresh(ctx); err != nil {
                    log.Printf("Error refreshing configuration: %v", err)
                }
            }()
            c.Next()
        }
    }
    
    func (app *WebApp) featureMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
            // Check if Beta feature is enabled
            betaEnabled, err := app.featureManager.IsEnabled("Beta")
            if err != nil {
                log.Printf("Error checking Beta feature: %v", err)
                betaEnabled = false
            }
    
            // Store feature flag status for use in templates
            c.Set("betaEnabled", betaEnabled)
            c.Next()
        }
    }
    
    func (app *WebApp) setupRoutes(r *gin.Engine) {
        r.Use(app.refreshMiddleware())
        r.Use(app.featureMiddleware())
    
        // Load HTML templates
        r.LoadHTMLGlob("templates/*.html")
    
        // Routes
        r.GET("/", app.homeHandler)
        r.GET("/beta", app.betaHandler)
    }
    
    // Home page handler
    func (app *WebApp) homeHandler(c *gin.Context) {
        betaEnabled := c.GetBool("betaEnabled")
    
        c.HTML(http.StatusOK, "index.html", gin.H{
            "title":       "Feature Management Example App",
            "betaEnabled": betaEnabled,
        })
    }
    
    // Beta page handler
    func (app *WebApp) betaHandler(c *gin.Context) {
        betaEnabled := c.GetBool("betaEnabled")
    
        if !betaEnabled {
            return
        }
    
        c.HTML(http.StatusOK, "beta.html", gin.H{
            "title": "Beta Page",
        })
    }
    
    func main() {
        ctx := context.Background()
    
        // Load Azure App Configuration
        appConfig, err := loadAzureAppConfiguration(ctx)
        if err != nil {
            log.Fatalf("Error loading Azure App Configuration: %v", err)
        }
    
        // Create feature flag provider
        featureFlagProvider, err := azappconfig.NewFeatureFlagProvider(appConfig)
        if err != nil {
            log.Fatalf("Error creating feature flag provider: %v", err)
        }
    
        // Create feature manager
        featureManager, err := featuremanagement.NewFeatureManager(featureFlagProvider, nil)
        if err != nil {
            log.Fatalf("Error creating feature manager: %v", err)
        }
    
        // Create web app
        app := &WebApp{
            featureManager: featureManager,
            appConfig:      appConfig,
        }
    
        // Set up Gin with default middleware (Logger and Recovery)
        r := gin.Default()
    
        // Set up routes
        app.setupRoutes(r)
    
        // Start server
        fmt.Println("Starting server on http://localhost:8080")
        fmt.Println("Open http://localhost:8080 in your browser")
        fmt.Println("Toggle the 'Beta' feature flag in Azure portal to see changes")
        fmt.Println()
    
        if err := r.Run(":8080"); err != nil {
            log.Fatalf("Failed to start server: %v", err)
        }
    }
    

執行 Web 應用程式

  1. 設定驗證的環境變數 並執行應用程式。

    go mod tidy
    go run .
    
  2. 開啟瀏覽器視窗,然後移至 http://localhost:8080。 您的瀏覽器應該會顯示如下圖所示的頁面。

    在啟用功能旗標之前的 Gin 網頁應用程式截圖。

  3. 登入 Azure 入口網站。 選取 [所有資源],然後選取您之前建立的應用程式設定存放區。

  4. 選取 [功能管理員 ],然後找出 Beta 功能旗標。 選取 [啟用] 下的核取方塊,以啟用旗標。

  5. 重新整理瀏覽器數次。 當重新整理間隔時間範圍過去時,頁面會顯示更新的內容:

    啟用功能旗標後 Gin 網頁應用程式的截圖。

  6. 請注意,Beta 選單項目現在出現在導覽列中。 單擊它即可訪問測試版頁面:

    杜松子酒網絡應用程序測試版頁面的屏幕截圖。

清理資源

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

這很重要

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

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

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

後續步驟

在本快速入門中,您在 Azure 應用程式設定中建立功能旗標,並在 Go Gin Web 應用程式中使用它。 功能管理 Go 程式庫提供與 Azure 應用程式設定無縫整合的功能旗標功能。如需更多功能,請繼續閱讀下列檔。

雖然功能旗標可讓您啟用或停用應用程式中的功能,但您可能想要根據應用程式的邏輯自訂功能旗標。 功能篩選可讓您按條件啟用功能旗標。 如需詳細資訊,請繼續下列教學課程。

Azure 應用程式設定提供內建功能篩選器,讓您只能在特定期間或對應用程式的特定目標對象啟用功能旗標。 如需詳細資訊,請繼續下列教學課程。