다음을 통해 공유


자습서: Gin 웹앱에서 동적 구성 사용

이 자습서에서는 Azure App Configuration을 사용하여 Gin 웹 애플리케이션에서 동적 구성 업데이트를 구현하는 방법을 보여 줍니다. 이전 빠른 시작에서 도입된 웹앱을 기반으로 합니다.

필수 조건

빠른 시작 완료: Azure App Configuration을 사용하여 Gin 웹앱 만들기

App Configuration에서 데이터 다시 로드

  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초를 사용합니다. App Configuration 저장소에 대한 요청 수를 줄여야 하는 경우 더 높은 값으로 조정합니다.

  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
    //... ...
    

요청 기반 구성 새로 고침

구성 새로 고침은 웹앱에 들어오는 요청에 의해 트리거됩니다. 앱이 유휴 상태이면 새로 고침이 발생하지 않습니다. 앱이 활성화되면 구성 새로 고침 미들웨어가 azureappconfiguration.Options에서 구성한 특정 키-값을 모니터링합니다. 미들웨어는 앱에 들어오는 요청이 있을 때마다 트리거됩니다. 그러나 미들웨어는 설정한 새로 고침 간격이 지나간 경우에만 App Configuration의 값을 확인하는 요청을 보냅니다.

  • 변경 감지를 위해 App Configuration에 보낸 요청이 실패하면 앱은 캐시된 구성을 계속 사용합니다. 앱에 새로 들어오는 요청이 있는 경우 변경 내용을 확인하기 위한 새로운 시도가 주기적으로 이루어집니다.
  • 구성 새로 고침은 앱의 들어오는 요청 처리에 대해 비동기식으로 수행됩니다. 새로 고침을 트리거한 들어오는 요청을 차단하거나 속도가 저하되지 않습니다. 새로 고침을 트리거한 요청은 업데이트된 구성 값을 얻지 못할 수도 있지만 후속 요청은 새 구성 값을 얻을 수 있습니다.
  • 미들웨어가 트리거되도록 하려면 다른 미들웨어가 앱에서 건너뛰지 않도록 요청 파이프라인에서 구성 새로 고침 미들웨어를 최대한 빨리 사용합니다.

웹 애플리케이션 실행

이제 동적 구성 새로 고침을 설정했으므로 실행 중인 구성을 확인하도록 테스트해 보겠습니다.

  1. 애플리케이션을 실행합니다.

    go run main.go
    
  2. 웹 브라우저를 열고 애플리케이션에 액세스하려면 http://localhost:8080를 방문합니다. 웹 페이지는 다음과 같습니다.

    진 웹앱 새로 고침 이전의 스크린샷

  3. App Configuration 저장소로 이동하여 키 값을 업데이트합니다 Config.Message .

    열쇠 가치 콘텐츠 형식
    Config.Message Azure App Configuration의 Hello - 이제 라이브 업데이트가 제공됩니다! 비워 둡니다.
  4. 브라우저를 몇 번 새로 고치면 30초 내에 ConfigMap이 업데이트되면서 업데이트된 콘텐츠를 볼 수 있습니다.

    진 웹앱 새로 고침 후의 스크린샷.

자원을 정리하세요

이 문서에서 만든 리소스를 계속 사용하지 않으려면 여기서 만든 리소스 그룹을 삭제하여 요금이 부과되지 않도록 합니다.

중요합니다

리소스 그룹을 삭제하면 다시 되돌릴 수 없습니다. 리소스 그룹 및 포함된 모든 리소스가 영구적으로 삭제됩니다. 잘못된 리소스 그룹 또는 리소스를 자동으로 삭제하지 않도록 합니다. 유지하려는 다른 리소스가 포함된 리소스 그룹 내에서 이 문서에 대한 리소스를 만든 경우 리소스 그룹을 삭제하는 대신 해당 창에서 각 리소스를 개별적으로 삭제합니다.

  1. Azure Portal에 로그인하고 리소스 그룹을 선택합니다.
  2. 이름으로 필터링 상자에서 리소스 그룹의 이름을 입력합니다.
  3. 결과 목록에서 리소스 그룹 이름을 선택하여 개요를 확인합니다.
  4. 리소스 그룹 삭제를 선택합니다.
  5. 리소스 그룹 삭제를 확인하는 메시지가 표시됩니다. 리소스 그룹의 이름을 입력하여 확인하고 삭제를 선택합니다.

잠시 후, 리소스 그룹 및 모든 해당 리소스가 삭제됩니다.