Бөлісу құралы:


Быстрый старт: Добавление флагов функций в веб-приложение Go Gin

В этом кратком руководстве вы создадите флаг компонента в конфигурации приложений Azure и используйте его для динамического управления доступностью новой веб-страницы в веб-приложении Go Gin без перезапуска или повторного развертывания.

Поддержка управления функциями расширяет функцию динамической конфигурации в Конфигурация приложений. В этом примере показано, как интегрировать флаги функций в веб-приложение Go Gin с обновлениями в режиме реального времени и отрисовкой условной страницы.

Предпосылки

Создание флага компонента

Добавьте флаг компонента с именем Beta в хранилище Конфигурация приложений и оставьте метку и описание со значениями по умолчанию. Дополнительные сведения о добавлении флагов компонентов в хранилище с помощью портал Azure или интерфейса командной строки см. в разделе "Создание флага функции".

Снимок экрана: создание флага компонента.

Создание веб-приложения Go

  1. Создайте каталог для проекта Go и перейдите в него:

    mkdir gin-feature-flag-quickstart
    cd gin-feature-flag-quickstart
    
  2. Инициализация нового модуля Go:

    go mod init gin-feature-flag-quickstart
    
  3. Установите необходимые пакеты Go для конфигурации приложений Azure, веб-платформы Gin и управления функциями:

    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
    

    Добавьте следующие HTML-файлы шаблонов из репозитория GitHub и поместите их в templates каталог:

    • index.html — шаблон домашней страницы
    • beta.html — шаблон бета-страницы

Использование флага компонента

  1. Создайте файл с именем appconfig.go со следующим содержимым. Вы можете подключиться к хранилищу конфигурации приложений с помощью идентификатора Microsoft Entra (рекомендуется) или строки подключения.

    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: в имениключа и разработки меток. Код также изменяет время обновления на 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)
        }
    }
    

Запуск веб-приложения

  1. Задайте переменную среды для проверки подлинности и запустите приложение.

    go mod tidy
    go run .
    
  2. Откройте окно браузера и перейдите в раздел http://localhost:8080. Браузер должен отображать страницу, похожую на изображение ниже.

    Снимок экрана веб-приложения Gin перед включением переключателя функции.

  3. Войдите на портал Azure. Выберите все ресурсы и выберите хранилище Конфигурация приложений, созданное ранее.

  4. Выберите диспетчер компонентов и найдите флаг бета-функции . Включите флаг, выбрав флажок в разделе "Включено".

  5. Обновите браузер несколько раз. При прохождении интервала обновления страница отображает обновленное содержимое:

    Снимок экрана веб-приложения Gin после включения фича-флага.

  6. Обратите внимание, что элемент меню "Бета-версия " теперь отображается на панели навигации. Щелкните его, чтобы получить доступ к бета-странице:

    Снимок экрана: страница бета-версии веб-приложения gin.

Очистите ресурсы

Если вы не планируете в дальнейшем использовать ресурсы, созданные при работе с этой статьей, удалите созданную группу ресурсов, чтобы избежать расходов.

Это важно

Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все ресурсы в ней будут удалены безвозвратно. Убедитесь, что вы не удаляете случайно неправильную группу ресурсов или ресурсы. Если вы создали ресурсы для этой статьи внутри группы ресурсов, которая содержит другие ресурсы, которые вы хотите сохранить, удалите каждый ресурс индивидуально из его собственной панели, вместо того чтобы удалять группу ресурсов.

  1. Войдите на портал Azure и выберитеГруппы ресурсов.
  2. В поле Фильтр по имени введите название вашей группы ресурсов.
  3. В списке результатов выберите имя группы ресурсов, чтобы просмотреть общие сведения.
  4. Выберите команду Удалить группу ресурсов.
  5. Вам предлагается подтвердить удаление группы ресурсов. Введите имя вашей группы ресурсов для подтверждения и выберите Удалить.

Через несколько мгновений группа ресурсов и все ее ресурсы будут удалены.

Дальнейшие шаги

В этом кратком руководстве вы создали флаг компонента в конфигурации приложений Azure и использовали его в веб-приложении Go Gin. Библиотека "Управление функциями" предоставляет возможности флага функций, которые легко интегрируются с конфигурацией приложений Azure. Дополнительные возможности см. в следующем документе.

Хотя флаг компонента позволяет активировать или деактивировать функции в приложении, вы можете настроить флаг функции на основе логики приложения. Фильтры функций позволяют условно включить флаг компонента. Дополнительные сведения см. в следующем руководстве.

Конфигурация приложений Azure предлагает встроенные фильтры функций, позволяющие активировать флаг функции только в течение определенного периода или для определенной целевой аудитории вашего приложения. Дополнительные сведения см. в следующем руководстве.