Руководство: Использование динамической конфигурации в веб-приложении Gin

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

Предпосылки

Завершите краткое руководство: Создайте веб-приложение Gin с помощью конфигурации приложений Azure

Перезагрузить данные из конфигурации приложения

  1. Откройте файл appconfig.go. Внутри функции loadAzureAppConfiguration обновите options, чтобы включить обновление. Поставщик 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
        }
    })
    
    // 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
    //... ...
    

Обновление конфигурации на основе запросов

Обновление конфигурации активируется входящими запросами к веб-приложению. Обновление не произойдет, если ваше приложение бездействует. Когда ваше приложение активно, промежуточное ПО обновления конфигурации отслеживает выбранные ключевые значения, настроенные в azureappconfiguration.Options. ПО промежуточного слоя активируется при каждом входящем запросе к приложению. Однако по промежуточному слоям будут отправляться только запросы для проверки значения в конфигурации приложений при передаче заданного интервала обновления.

  • Если запрос на настройку приложений для обнаружения изменений завершается сбоем, приложение продолжит использовать кэшированную конфигурацию. Новые попытки проверить наличие изменений будут периодически выполняться при наличии новых входящих запросов к приложению.
  • Обновление конфигурации происходит асинхронно по отношению к обработке входящих запросов вашего приложения. Он не будет блокировать или замедлять входящий запрос, который инициировал обновление. Запрос, который инициировал обновление, может не получить обновленные значения конфигурации, но последующие запросы получат новые значения конфигурации.
  • Чтобы убедиться, что ПО промежуточного слоя запускается, используйте ПО промежуточного слоя обновления конфигурации как можно раньше в конвейере запросов, чтобы другое ПО промежуточного слоя не было пропущено в приложении.

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

Теперь, когда вы настроили динамическое обновление конфигурации, давайте протестируем его, чтобы увидеть его в действии.

  1. Запустите приложение.

     go mod tidy
     go run .
    
  2. Откройте веб-браузер и перейдите на http://localhost:8080, чтобы получить доступ к вашему приложению. Веб-страница выглядит следующим образом:

    Снимок экрана веб-приложения gin до обновления.

  3. Перейдите в хранилище конфигурации приложений и обновите значение Config.Message ключа.

    Ключ Ценность Тип контента
    Config.Message Привет от Azure App Configuration — теперь с обновлениями в реальном времени! Оставьте пустым
  4. После нескольких обновлений браузера вы увидите актуальное содержимое по истечении 30 секунд после обновления ConfigMap.

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

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

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

Это важно

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

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

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