다음을 통해 공유


앱 구성 지원

이 문서에서는 Spring Cloud Azure 앱 구성 라이브러리에 대해 설명합니다. 이 라이브러리는 Azure 앱 Configuration 서비스에서 구성 및 기능 플래그를 로드합니다. 라이브러리는 환경 변수, 명령줄 구성, 로컬 구성 파일 등과 같이 Spring 환경에서 이미 생성된 추상화와 일치하는 추상화 생성을 생성 PropertySource 합니다.

Spring은 Java 애플리케이션을 만들기 위한 간소화된 모듈식 접근 방식을 제공하는 VMware에서 개발한 오픈 소스 애플리케이션 프레임워크입니다. Spring Cloud Azure는 Azure 서비스와 원활한 Spring 통합을 제공하는 오픈 소스 프로젝트입니다.

필수 조건

App Configuration 저장소 설정

다음 명령을 사용하여 Azure 앱 Configuration 저장소를 만듭니다.

az appconfig create \
    --resource-group <your-resource-group> \
    --name <name-of-your-new-store> \
    --sku Standard

이 명령은 비어 있는 새 구성 저장소를 만듭니다. 다음 가져오기 명령을 사용하여 구성을 업로드할 수 있습니다.

az appconfig kv import \
    --name <name-of-your-new-store> \
    --source file \
    --path <location-of-your-properties-file> \
    --format properties \
    --prefix /application/

구성을 로드하기 전에 확인합니다. 형식을 YAML로 변경하여 YAML 파일을 업로드할 수 있습니다. 접두사 필드는 클라이언트 라이브러리에서 로드하는 기본 접두사이므로 중요합니다.

라이브러리 사용

애플리케이션에서 기능을 사용하려면 Spring Boot 애플리케이션으로 빌드할 수 있습니다. 종속성을 추가하는 가장 편리한 방법은 Spring Boot 스타터를 com.azure.spring:spring-cloud-azure-starter-appconfiguration-config사용하는 것입니다. 다음 예제 pom.xml 파일은 Azure 앱 구성을 사용합니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>{spring-boot-version}</version>
    <relativePath />
</parent>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-dependencies</artifactId>
      <version>5.19.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-appconfiguration-config</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
    </plugins>
</build>

참고 항목

Spring Boot 2.x를 사용하는 경우 버전을 .로 설정 spring-cloud-azure-dependencies 해야 합니다 4.19.0. 이 BOM에 사용되는 버전에 대한 자세한 내용은 어떤 버전의 Spring Cloud Azure를 사용해야 하는지를 참조하세요.

다음 예제에서는 App Configuration을 사용하는 기본 Spring Boot 애플리케이션을 보여줍니다.

@SpringBootApplication
@RestController
public class Application {

    @RequestMapping("/")
    public String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

이 예제의 경우 bootstrap.properties 파일에는 다음 줄이 포함됩니다.

spring.cloud.azure.appconfiguration.stores[0].connection-string=${CONFIG_STORE_CONNECTION_STRING}

CONFIG_STORE_CONNECTION_STRING는 Azure 앱 구성 저장소에 대한 연결 문자열 있는 환경 변수입니다. 다음 명령을 사용하여 연결 문자열 액세스할 수 있습니다.

az appconfig credential list --name <name-of-your-store>

참고 항목

사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. 데이터베이스, 캐시, 메시징 또는 AI 서비스와 같이 이 절차에서 설명하는 인증 흐름은 애플리케이션에 대한 신뢰 수준이 매우 높고 다른 흐름에 존재하지 않는 위험을 수반합니다. 암호 없는 연결 또는 키 없는 연결에 대한 관리 ID와 같은 더 안전한 옵션이 실행 가능하지 않은 경우에만 이 흐름을 사용합니다. 로컬 컴퓨터 작업의 경우 암호 없는 연결이나 키 없는 연결에 사용자 ID를 사용하는 것이 좋습니다.

기본적으로 구성이 설정되지 않은 경우 Spring Profile을 설정하지 않는 한 기본 레이블 (No Label)/application/ 시작하는 구성이 로드됩니다. 이 경우 기본 레이블은 Spring Profile입니다. 저장소가 비어 있으므로 구성이 로드되지 않지만 Azure 앱 구성 속성 원본은 여전히 생성됩니다.

해당 저장소의 속성을 포함하는 속성 /application/https://<name-of-your-store>.azconfig.io/ 원본이 만들어집니다. 요청에 사용된 레이블은 이름 끝에 추가됩니다. 레이블이 설정되지 않은 경우 문자 \0 는 빈 공간으로 표시됩니다.

구성 로드

라이브러리는 하나 이상의 App Configuration 저장소 로드를 지원합니다. 여러 저장소에서 키가 중복되는 경우 모든 저장소를 로드하면 우선 순위가 가장 높은 저장소 구성이 로드됩니다. 마지막 하나가 승리합니다. 이 프로세스는 다음 예제에서 설명합니다.

spring.cloud.azure.appconfiguration.stores[0].connection-string=[first-store-connection-string]
spring.cloud.azure.appconfiguration.stores[1].connection-string=[second-store-connection-string]

이 예제에서 첫 번째 저장소와 두 번째 저장소의 구성이 동일한 경우 두 번째 저장소의 구성은 우선 순위가 가장 높고 마지막 저장소가 우선합니다.

참고 항목

다른 Spring Configuration과 마찬가지로 Azure 앱 구성 설정을 사용할 수 있습니다. 자세한 내용은 Spring Boot 설명서 또는 빠른 시작: Azure 앱 Configuration을 사용하여 Java Spring 앱 만들기의 핵심 기능을 참조하세요.

구성 선택

구성은 해당 키와 레이블에 의해 로드됩니다. 기본적으로 키 /application/ 로 시작하는 구성이 로드됩니다. 기본 레이블은 .입니다 ${spring.profiles.active}. 설정되지 않은 경우 ${spring.profiles.active} 레이블이 있는 구성이 null 로드됩니다. 레이블은 null Azure Portal에서와 같이 (No Label) 표시됩니다.

다음 예제와 같이 다른 키 및 레이블 필터를 선택하여 로드되는 구성을 구성할 수 있습니다.

spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter=[my-key]
spring.cloud.azure.appconfiguration.stores[0].selects[0].label-filter=[my-label]

이 속성은 key-filter 다음 필터를 지원합니다.

키 필터 효과
* 모든 키와 일치합니다.
abc 라는 abc키와 일치합니다.
abc* abc로 시작하는 키 이름과 일치
abc,xyz 키 이름 abc 또는 xyz를 일치시킵니다. 쉼표로 구분된 값 5개로 제한됩니다.

이 속성은 label-filter 다음 필터를 지원합니다.

Label 설명
* 를 비롯한 \0모든 레이블과 일치합니다.
\0 Azure Portal에서와 같이 (No Label) 표시되는 레이블과 일치 null 합니다.
1.0.0 레이블 1.0.0과 정확하게 일치
1.0.* 1.0.*으로 시작하는 레이블과 일치합니다.
,1.0.0 레이블과 1.0.0일치합니다.null 쉼표로 구분된 값 5개로 제한됩니다.

레이블 필터와 함께 YAML을 사용하는 경우 다음 예제와 null같이 레이블 필터를 작은따옴표로 묶어야 합니다.

spring:
  cloud:
    azure:
      appconfiguration:
        stores:
        - selects:
          - label-filter: ',1.0.0'

참고 항목

필터에서는 , 결합 * 할 수 없습니다. 이 경우 추가 선택 값을 사용해야 합니다.

Spring 프로필

기본적으로 spring.profiles.active 선택한 모든 구성의 기본값 label-filter 으로 설정됩니다. 를 사용하여 label-filter이 기능을 재정의할 수 있습니다. 다음 예제와 같이 Spring Profiles label-filter 를 사용하여 ${spring.profiles.active}사용할 수 있습니다.

spring.cloud.azure.appconfiguration.stores[0].selects[0].label-filter=,${spring.profiles.active}
spring.cloud.azure.appconfiguration.stores[0].selects[1].label-filter=${spring.profiles.active}_local

첫 번째 label-filter에서는 레이블이 있는 null 모든 구성이 로드된 다음 Spring Profiles와 일치하는 모든 구성이 로드됩니다. Spring 프로필은 마지막에 null 있으므로 구성보다 우선 순위가 있습니다.

두 번째 label-filter에서는 마지막 Spring 프로필에만 문자열 _local 이 Spring Profiles의 끝에 추가됩니다.

사용 안 함 저장소

구성을 사용하면 모든 구성 spring.cloud.azure.appconfiguration.enabled저장소에 대한 로드를 사용하지 않도록 설정할 수 있습니다. 구성을 사용하면 spring.cloud.azure.appconfiguration.stores[0].enabled 개별 저장소를 사용하지 않도록 설정할 수 있습니다.

저장소를 사용하지 않도록 설정하는 것 외에도 저장소를 로드하지 않을 경우 사용하지 않도록 구성할 수 있습니다. 이 구성의 경우 .spring.cloud.azure.appconfiguration.stores[0].fail-fast 설정하여 사용하지 않도록 설정하면 fail-fast falseRuntimeException 애플리케이션 저장소가 로드되는 구성 없이 비활성화됩니다. 시작할 때 구성 저장소를 사용하지 않도록 설정하면 새로 고칠 때 변경 내용이 확인되지 않습니다. 또한 구성이 업데이트되는 경우 값을 로드하려고 시도하지 않습니다.

새로 고침 검사 중에 또는 구성을 다시 로드하는 동안 오류가 RuntimeException 발생하는 경우 새로 고침 시도가 종료되고 통과한 후에 refresh-interval 다시 시도됩니다.

인증

라이브러리는 Azure ID 라이브러리에서 지원하는 모든 형태의 ID를 지원합니다. 연결 문자열 및 관리 ID에 대한 구성을 통해 인증을 수행할 수 있습니다.

참고 항목

사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. 데이터베이스, 캐시, 메시징 또는 AI 서비스와 같이 이 절차에서 설명하는 인증 흐름은 애플리케이션에 대한 신뢰 수준이 매우 높고 다른 흐름에 존재하지 않는 위험을 수반합니다. 암호 없는 연결 또는 키 없는 연결에 대한 관리 ID와 같은 더 안전한 옵션이 실행 가능하지 않은 경우에만 이 흐름을 사용합니다. 로컬 컴퓨터 작업의 경우 암호 없는 연결이나 키 없는 연결에 사용자 ID를 사용하는 것이 좋습니다.

Connection string

연결 문자열 통한 인증은 설정하는 가장 간단한 양식입니다. 다음 명령을 사용하여 저장소의 연결 문자열 액세스할 수 있습니다.

az appconfig credential list --name <name-of-your-store>

그런 다음 속성을 연결 문자열 설정할 spring.cloud.azure.appconfiguration.stores[0].connection-string 수 있습니다. 로컬 구성 파일의 연결 문자열 환경 변수에 매핑되는 자리 표시자 값으로 설정하는 것이 좋습니다. 이 방법을 사용하면 소스 제어에 연결 문자열 추가하지 않도록 할 수 있습니다.

Spring Cloud Azure 구성

Spring Cloud Azure 구성을 사용하여 라이브러리를 구성할 수 있습니다. 다음 속성을 사용하여 라이브러리를 구성할 수 있습니다.

spring.cloud.azure.appconfiguration.stores[0].endpoint= <URI-of-your-configuration-store>

엔드포인트만 설정되면 클라이언트 라이브러리는 DefaultAzureCredential을 사용하여 인증합니다. 다음 DefaultAzureCredential 메서드를 사용하여 인증합니다.

  • 환경 자격 증명
  • 관리 ID 자격 증명
  • Azure 개발자 CLI 자격 증명
  • IntelliJ 자격 증명
  • Azure CLI 자격 증명
  • Azure PowerShell 자격 증명

시스템 할당 ID와 같은 ID를 할당하여 구성을 읽어야 합니다. 다음 명령을 사용하여 이 할당을 만들 수 있습니다.

az role assignment create \
    --role "App Configuration Data Reader" \
    --assignee <your-client-ID> \
    --scope /subscriptions/<your-subscription>/resourceGroups/<your-stores-resource-group>/providers/Microsoft.AppConfiguration/configurationStores/<name-of-your-configuration-store>

참고 항목

엔드포인트당 하나의 인증 방법(연결 문자열, 사용자 할당 ID 또는 토큰 자격 증명)만 정의할 수 있습니다. 혼합하고 일치해야 하는 경우 다른 방법을 사용하는 저장소를 수정하는 데 사용할 ConfigurationClientCustomizer 수 있습니다.

참고 항목

사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. 데이터베이스, 캐시, 메시징 또는 AI 서비스와 같이 이 절차에서 설명하는 인증 흐름은 애플리케이션에 대한 신뢰 수준이 매우 높고 다른 흐름에 존재하지 않는 위험을 수반합니다. 암호 없는 연결 또는 키 없는 연결에 대한 관리 ID와 같은 더 안전한 옵션이 실행 가능하지 않은 경우에만 이 흐름을 사용합니다. 로컬 컴퓨터 작업의 경우 암호 없는 연결이나 키 없는 연결에 사용자 ID를 사용하는 것이 좋습니다.

지역에서 복제

라이브러리는 Azure 앱 구성의 지역에서 복제 기능을 지원합니다. 이 기능을 사용하면 데이터를 다른 위치에 복제할 수 있습니다. 이 기능은 고가용성 및 재해 복구에 유용합니다.

만드는 각 복제본에는 전용 엔드포인트가 있습니다. 애플리케이션이 여러 지리적 위치에 있는 경우 한 위치에 더 가까운 복제본에 연결할 수 있도록 이 위치에 있는 애플리케이션의 각 배포를 업데이트합니다. 이렇게 하면 애플리케이션과 App Configuration 간의 네트워크 대기 시간을 최소화할 수 있습니다. 각 복제본에는 별도의 요청 할당량이 있으므로 이 설정은 다중 지역 분산 서비스로 확장되는 동안 애플리케이션의 확장성에도 도움이 됩니다.

라이브러리에서 다음 조건을 준수하는 경우 장애 조치(failover)가 발생할 수 있습니다.

  • 엔드포인트에서 서비스를 사용할 수 없는 상태 코드(HTTP 500 이상)가 있는 응답을 받습니다.
  • 네트워크 연결 문제가 발생합니다.
  • 요청이 제한됩니다(429 HTTP 상태 코드).

지역에서 복제를 사용하여 구성 저장소 만들기

구성 저장소의 복제본을 만들려면 Azure CLI 또는 Azure Portal을 사용할 수 있습니다. 다음 예제에서는 Azure CLI를 사용하여 미국 동부 2 지역에 복제본을 만듭니다.

az appconfig replica create --location --name --store-name [--resource-group]

구성 저장소 복제본 사용

복제본을 만든 후 애플리케이션에서 사용할 수 있습니다. 원본 저장소와 마찬가지로 Microsoft Entra ID 또는 연결 문자열 사용하여 복제본에 연결할 수 있습니다.

참고 항목

사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. 데이터베이스, 캐시, 메시징 또는 AI 서비스와 같이 이 절차에서 설명하는 인증 흐름은 애플리케이션에 대한 신뢰 수준이 매우 높고 다른 흐름에 존재하지 않는 위험을 수반합니다. 암호 없는 연결 또는 키 없는 연결에 대한 관리 ID와 같은 더 안전한 옵션이 실행 가능하지 않은 경우에만 이 흐름을 사용합니다. 로컬 컴퓨터 작업의 경우 암호 없는 연결이나 키 없는 연결에 사용자 ID를 사용하는 것이 좋습니다.

Microsoft Entra ID를 사용하여 복제본에 연결하려면 다음 예제와 같이 구성 저장소 인스턴스를 나열 endpoints 해야 합니다.

spring.cloud.azure.appconfiguration.stores[0].endpoints[0]=[your primary store endpoint]
spring.cloud.azure.appconfiguration.stores[0].endpoints[1]=[your replica store endpoint]

복제본이 있는 만큼의 엔드포인트를 나열할 수 있습니다. 라이브러리는 나열된 순서대로 엔드포인트에 연결하려고 시도합니다. 라이브러리가 복제본에 연결할 수 없는 경우 목록에서 다음 복제본을 시도합니다. 일정 기간이 지나면 라이브러리가 기본 엔드포인트에 다시 연결하려고 시도합니다.

키 값

Azure 앱 Configuration은 여러 유형의 키 값을 지원하며, 그 중 일부는 특수 기능이 기본 제공됩니다. Azure 앱 Configuration은 JSON 콘텐츠 형식, Spring 자리 표시자 및 Key Vault 참조를 기본적으로 지원합니다.

자리 표시자

라이브러리는 -style 환경 자리 표시자를 사용하여 ${}구성을 지원합니다. 자리 표시자를 사용하여 Azure 앱 구성 키를 참조하는 경우 참조에서 접두사를 제거합니다. 예를 들어 . /application/config.message ${config.message}

참고 항목

제거되는 접두사는 값과 일치합니다 spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter.

JSON

콘텐츠 형식 application/json 이 있는 구성은 JSON 개체로 처리됩니다. 이 기능을 사용하면 하나의 구성을 내부의 복잡한 개체에 매핑할 수 있습니다 @ConfigurationProperties. 예를 들어 다음 값을 가진 JSON 키를 /application/config.colors 고려합니다.

{
 "Red": {
  "value": [255, 0, 0]
 },
 "Blue": {
  "value": [0, 255, 0]
 },
 "Green": {
  "value": [0, 0, 255]
 }
}

이 키는 다음 코드에 매핑됩니다.

@ConfigurationProperties(prefix = "config")
public class MyConfigurations {

    private Map<String, Color> colors;

}

Key Vault 참조

Azure 앱 구성 및 해당 라이브러리는 Key Vault에 저장된 비밀 참조를 지원합니다. App Configuration에서 Key Vault에 저장된 비밀에 매핑되는 값을 사용하여 키를 만들 수 있습니다. 비밀은 Key Vault에 안전하게 저장되지만 로드된 후 다른 구성과 동일한 방식으로 액세스할 수 있습니다.

애플리케이션은 App Configuration에 저장된 다른 키와 마찬가지로 클라이언트 공급자를 사용하여 Key Vault 참조를 검색합니다. 클라이언트는 키를 Key Vault 참조로 인식하므로 고유한 콘텐츠 형식을 가지며 클라이언트는 Key Vault에 연결하여 해당 값을 검색합니다.

참고 항목

Key Vault는 비밀을 한 번에 하나씩만 검색할 수 있도록 허용하므로 App Configuration에 저장된 각 Key Vault 참조는 Key Vault에 대한 끌어오기 결과를 생성합니다.

Key Vault 참조 만들기

구성 탐색기>Create Key Vault 참조로 이동하여 Azure Portal에서 Key Vault 참조를 만들>수 있습니다. 그런 다음 액세스할 수 있는 Key Vault에서 참조할 비밀을 선택할 수 있습니다. 입력 탭에서 임의의 Key Vault 참조를 만들 수도 있습니다. Azure Portal에서 유효한 URI를 입력합니다.

다음 명령을 사용하여 Azure CLI를 통해 Key Vault 참조를 만들 수도 있습니다.

az appconfig kv set-keyvault \
    --name <name-of-your-store> \
    --key <key-name> \
    --secret-identifier <URI-to-your-secret>

Azure CLI를 통해 비밀 식별자를 만들 수 있습니다. 비밀 식별자에는 버전 섹션이 선택 사항인 형식 {vault}/{collection}/{name}/{version?} 만 필요합니다.

Key Vault 참조 사용

Spring Cloud Azure 구성을 사용하여 라이브러리를 구성할 수 있습니다. App Configuration에 연결하는 데 사용되는 것과 동일한 자격 증명을 사용하여 Azure Key Vault에 연결할 수 있습니다.

Key Vault가 아닌 비밀 해결

App Configuration 라이브러리는 연결된 Key Vault가 없는 비밀을 로컬로 확인하는 방법을 제공합니다. 이 해결 방법은 .를 통해 수행됩니다 KeyVaultSecretProvider. KeyVaultSecretProvider Key Vault 참조에 TokenCredential 대해 제공되지 않은 경우 호출됩니다. Key Vault 참조의 URI가 제공되고 반환된 값이 비밀 값이 됩니다.

Warning

재정의는 KeyVaultSecretProvider 시스템 할당 관리 ID의 자동 사용을 재정의합니다. 둘 다 사용하려면 확인이 필요한 URI를 사용하고 KeyVaultCredentialProvider 반환 null 해야 합니다.

public class MySecretProvider implements KeyVaultSecretProvider {

    @Override
    public String getSecret(String uri) {
        ...
    }

}

기능 관리

기능 관리는 Spring Boot 애플리케이션이 콘텐츠에 동적으로 액세스하는 방법을 제공합니다. 기능 관리에는 다음과 같은 다양한 함수가 있습니다.

  • 콘텐츠를 사용하거나 사용하지 않도록 설정할 수 있는 기능 플래그
  • 콘텐츠가 표시되면 대상 지정을 위한 기능 필터
  • 사용자 지정된 기능 필터
  • 엔드포인트를 동적으로 사용하도록 설정하기 위한 기능 게이트

다음 구성을 통해 기능 플래그를 사용하도록 설정할 수 있습니다.

spring.cloud.azure.appconfiguration.stores[0].feature-flags.enabled= true

사용 가능한 기능 플래그는 접두사를 feature-management사용하여 Spring 구성 시스템에 로드됩니다. 로컬 구성 파일에 기능 플래그를 등록할 수도 있습니다. 자세한 내용은 기능 플래그 선언 섹션을 참조하세요.

기능 관리를 사용하는 가장 쉬운 방법은 및 spring-cloud-azure-feature-management-web 라이브러리를 spring-cloud-azure-feature-management 사용하는 것입니다. 두 라이브러리의 차이점은 기능 게이트와 같은 기능을 더 추가하기 위해 라이브러리와 spring-webmvc 라이브러리에 spring-web 대한 종속성을 취한다는 spring-cloud-azure-feature-management-web 것입니다.

키/레이블 필터를 사용하여 기능 플래그를 사용하도록 설정할 수 있습니다. 기본적으로 레이블(예: <a0null/a0>)이 할당됩니다. 다음 예제와 같이 레이블 필터를 설정하여 로드되는 기능 플래그를 구성할 수 있습니다.

spring.cloud.azure.appconfiguration.stores[0].feature-flags.selects[0].key-filter=A*
spring.cloud.azure.appconfiguration.stores[0].feature-flags.selects[0].label-filter= dev

기능 관리 기본 사항

기능 플래그

기능 플래그는 기능 설정에 사용되는 기능 필터 목록과 이름이라는 두 부분으로 구성됩니다. 기능 플래그는 부울 상태의 켜기/끄기를 포함하거나 기능 필터 목록을 포함할 수 있습니다. 기능 플래그는 하나가 반환될 때까지 기능 필터를 평가합니다 true. 기능 필터가 반환 true되지 않으면 기능 플래그가 반환됩니다 false.

기능 필터

기능 필터는 기능을 사용하도록 설정해야 하는 경우에 대한 시나리오를 정의합니다. 기능 필터는 동기적으로 평가됩니다.

기능 관리 라이브러리에는 AlwaysOnFilter, PercentageFilter, TimeWindowFilter 및 TargetingFilter의 네 가지 미리 정의된 필터가 함께 제공됩니다.

사용자 지정 기능 필터를 만들 수 있습니다. 예를 들어 기능 필터를 사용하여 Microsoft Edge 브라우저를 사용하는 고객에게 사용자 지정 환경을 제공할 수 있습니다. 예를 들어 이 기능 필터의 기능을 사용자 지정하여 Microsoft Edge 브라우저 대상 그룹에 대한 특정 헤더를 표시할 수 있습니다.

기능 플래그 선언

기능 관리 라이브러리는 기능 플래그의 원본으로 application.yml 또는 bootstrap.yml 함께 Azure 앱 구성을 지원합니다. application.yml 파일에서 기능 플래그를 설정하는 데 사용되는 형식의 예는 다음과 같습니다.

feature-management:
  feature-t: false
  feature-u:
    enabled-for:
    - name: Random
  feature-v:
    enabled-for:
    - name: TimeWindowFilter
      parameters:
        Start: "Wed, 01 May 2019 13:59:59 GMT"
        End: "Mon, 01 July 2019 00:00:00 GMT"
  feature-w:
    evaluate: false
    enabled-for:
    - name: AlwaysOnFilter

이 예제에는 다음과 같은 기능 플래그가 있습니다.

  • feature-tfalse로 설정됩니다. 이 설정은 항상 기능 플래그의 값을 반환합니다.
  • feature-u 는 기능 필터와 함께 사용됩니다. 이러한 필터는 속성 아래에 enabled-for 정의됩니다. 이 경우 feature-u 구성이 필요하지 않은 기능 필터가 하나 있으므로 Random이름 속성만 필요합니다.
  • feature-vTimeWindowFilter라는 기능 필터를 지정합니다. 이 기능 필터는 구성으로 사용할 매개 변수를 전달할 수 있습니다. 이 예제 TimeWindowFilter에서는 기능이 활성 상태인 시작 및 종료 시간을 전달합니다.
  • feature-w는 항상 AlwaysOnFilter로 계산되는 에 사용됩니다.trueevaluate 필드는 기능 필터의 평가를 중지하는 데 사용되며 기능 필터는 항상 반환됩니다 false.

기능 플래그 평가

라이브러리는 spring-cloud-azure-feature-management 기능 플래그를 사용할 수 있는지 여부를 확인하기 위해 제공합니다 FeatureManager . FeatureManager 는 플래그의 상태를 확인하는 비동기 방법을 제공합니다.

spring-cloud-azure-feature-management-web는 제공FeatureManager과 함께 모든 요청이 동일한 값을 반환하도록 하기 위해 이전에 평가된 기능 플래그 @RequestScope 의 상태를 캐시하는 포함을 포함합니다FeatureManagerSnapshot. 또한 웹 라이브러리는 웹 요청을 차단하거나 다른 엔드포인트로 리디렉션할 수 있는 기능을 제공합니다 @FeatureGate.

기능 플래그 확인

FeatureManager@Bean 형식 개체에 삽입하거나 삽입할 @Autowired 수 있는 @Component 개체입니다. FeatureManager 에는 기능 플래그의 이름을 전달할 때 해당 상태를 반환하는 메서드 isEnabled 가 있습니다.

@Autowired
FeatureManager featureManager;

if (featureManager.isEnabled("feature-t")) {
    // Do Something
}

참고 항목

FeatureManger 에는 비동기 버전의 isEnabled 호출 isEnabledAsync도 있습니다.

기능 관리를 구성하지 않았거나 기능 플래그가 없는 isEnabled 경우 항상 반환합니다 false. 기존 기능 플래그가 알 수 없는 기능 필터로 구성된 경우 throw FilterNotFoundException 됩니다. 로 구성 fail-fast 하여 반환 false 하도록 이 동작을 false변경할 수 있습니다. 다음 표에서는 다음을 설명합니다.fail-fast

속성 설명 필수 항목 기본값
spring.cloud.azure.feature.management.fail-fast 예외가 발생하면 throw RuntimeException 됩니다. 이 속성이 설정 falseisEnabled 되면 대신 반환됩니다false. 아니요 true

의 결과 캐싱과 FeatureManager 그 사이의 FeatureManagerSnapshot 유일한 차이점은 다음과 입니다@RequestScope.

기능 게이트

기능 관리 웹 라이브러리를 사용하면 엔드포인트를 실행하기 위해 지정된 기능을 사용하도록 설정해야 할 수 있습니다. 다음 예제와 같이 주석을 @FeatureGate 사용하여 이 요구 사항을 설정할 수 있습니다.

@GetMapping("/featureT")
@FeatureGate(feature = "feature-t")
@ResponseBody
public String featureT() {
    ...
}

"feature-t"가 featureT 사용하도록 설정된 경우에만 엔드포인트에 액세스할 수 있습니다.

비활성화된 작업 처리

지정하는 기능이 비활성화 DisabledFeaturesHandler 되어 엔드포인트가 차단되면 호출됩니다. 기본적으로 HTTP 404가 반환됩니다. 다음 예제와 같이 구현하여 DisabledFeaturesHandler이 동작을 재정의할 수 있습니다.

@Component
public class MyDisabledFeaturesHandler implements DisabledFeaturesHandler {

    @Override
    public HttpServletResponse handleDisabledFeatures(HttpServletRequest request, HttpServletResponse response) {
        ...
        return response;
    }

}
라우팅

특정 경로는 기능에 의해 제어되는 애플리케이션 기능을 노출할 수 있습니다. 기능을 사용하지 않도록 설정한 경우 다음 예제와 같이 이러한 경로를 다른 엔드포인트로 리디렉션할 수 있습니다.

@GetMapping("/featureT")
@FeatureGate(feature = "feature-t" fallback= "/oldEndpoint")
@ResponseBody
public String featureT() {
    ...
}

@GetMapping("/oldEndpoint")
@ResponseBody
public String oldEndpoint() {
    ...
}

기본 제공 기능 필터

패키지와 함께 제공되는 몇 가지 기능 필터가 spring-cloud-azure-feature-management 있습니다. 이러한 기능 필터는 자동으로 추가되지 않지만 @Configuration.

AlwaysOnFilter

이 필터는 항상 .true 사용 예제는 기능 플래그 선언 섹션을 참조하세요.

PercentageFilter

사용자가 요청을 할 때마다 평가 PercentageFilter 는 다른 결과를 반환할 수 있습니다. 사용자당 기능 플래그의 결과를 캐시하는 이 불일치를 우회 FeatureManagementSnapshot할 수 있습니다. 이 기능은 사용자가 요청을 다시 전송해야 하는 경우에도 일관된 환경을 보장합니다.

feature-management:
  feature-v:
    enabled-for:
    - name: PercentageFilter
      parameters:
        Value: 50

TimeWindowFilter

이 필터는 기간을 기반으로 기능을 사용하도록 설정하는 기능을 제공합니다. 만 End지정하면 해당 시간까지 기능이 고려됩니다. 지정만 Start하면 해당 시간 이후의 모든 지점에서 기능이 고려됩니다. 둘 다 지정하는 경우 이 기능은 두 번 간에 유효한 것으로 간주됩니다.

feature-management:
  feature-v:
    enabled-for:
    - name: TimeWindowFilter
      parameters:
        Start: "Wed, 01 May 2019 13:59:59 GMT",
        End: "Mon, 01 July 2019 00:00:00 GMT"

TargetingFilter

이 필터는 대상 그룹 고객을 위한 기능을 사용하도록 설정하는 기능을 제공합니다. 대상 지정에 대한 자세한 설명은 대상 지정 섹션 섹션참조하세요. 필터 매개 변수에는 사용자, 그룹 및 기능에 대한 액세스 권한이 있어야 하는 사용자 기반의 기본 백분율을 설명하는 대상 그룹 개체가 포함됩니다. 대상 그룹에 나열된 각 그룹 개체에 대해 기능에 액세스할 수 있는 해당 그룹 구성원의 백분율을 정의하는 백분율이 필요합니다. 사용자는 다음 경우에 이 기능을 사용할 수 있습니다.

  • 사용자는 사용자의 섹션에서 직접 지정됩니다.
  • 사용자는 그룹 롤아웃의 포함된 백분율에 있습니다.
  • 사용자는 기본 롤아웃 백분율에 속합니다.
feature-management: 
  target:
    enabled-for:
    - name: targetingFilter
      parameters:
        users:
        - Jeff
        - Alicia
        groups:
        - name: Ring0
          rollout-percentage: 100
        - name: Ring1
          rolloutPercentage: 100
        default-rollout-percentage: 50

사용자 지정 기능 필터

사용자 지정 기능 필터를 만들면 정의한 조건에 따라 기능을 사용하도록 설정할 수 있습니다. 사용자 지정 기능 필터를 만들려면 인터페이스를 FeatureFilter 구현해야 합니다. FeatureFilter 에는 단일 메서드 evaluate가 있습니다. 기능 필터를 사용하여 기능을 사용하도록 지정하면 메서드가 evaluate 호출됩니다. 반환true되는 경우 evaluate 기능을 사용하도록 설정해야 한다는 의미입니다. 반환 false되는 경우 기능 필터가 반환 true될 때까지 기능 필터를 계속 평가합니다. 모든 필터가 반환 false되면 기능이 꺼집니다.

기능 필터는 Spring Beans로 정의되므로 에 정의 @Component 되거나 정의됩니다 @Configuration.

@Component("Random")
public class Random implements FeatureFilter {

    @Override
    public boolean evaluate(FeatureFilterEvaluationContext context) {
        double chance = Double.valueOf((String) context.getParameters().get("chance"));
        return Math.random() > chance / 100;
    }

}

매개 변수가 있는 기능 필터

일부 기능 필터는 기능을 켜야 하는지 여부를 결정하는 매개 변수가 필요합니다. 예를 들어, 브라우저 기능 필터는 특정 브라우저 집합에 대한 기능을 켤 수 있습니다. Firefox가 아닌 Microsoft Edge 및 Chrome 브라우저에 기능을 사용하도록 설정할 수 있습니다. 이 상황을 설정하려면 매개 변수를 예상하도록 기능 필터를 디자인할 수 있습니다. 이러한 매개 변수는 기능 구성 및 코드에서 지정되며 , 의 evaluate매개 변수를 FeatureFilterEvaluationContext 통해 액세스할 수 있습니다. FeatureFilterEvaluationContext 속성이 있습니다. 이 속성 parameters은 .입니다 HashMap<String, Object>.

대상 지정

대상 지정은 개발자가 사용자 기반에 새로운 기능을 점진적으로 롤아웃할 수 있도록 하는 기능 관리 전략입니다. 이 전략은 대상 그룹으로 알려진 일련의 사용자를 대상으로 지정한다는 개념을 바탕으로 빌드되었습니다. 대상 그룹은 특정 사용자, 그룹 및 전체 사용자 기반의 지정된 백분율로 구성됩니다. 대상 그룹에 포함된 그룹은 전체 멤버의 비율로 더 세분화될 수 있습니다.

다음 단계에서는 새로운 '베타' 기능에 대한 점진적 출시의 예를 보여 줍니다.

  1. 개별 사용자인 Jeff와 Alicia에게 베타에 대한 액세스 권한이 부여됩니다.
  2. 다른 사용자인 Mark가 옵트인을 요청하여 포함되었습니다.
  3. "Ring1" 사용자로 알려진 그룹의 20%가 베타에 포함되어 있습니다.
  4. 베타 버전에 포함된 "Ring1" 사용자 수는 최대 100%까지 증가합니다.
  5. 사용자 기반의 5%가 베타 버전에 포함됩니다.
  6. 출시 비율이 100%까지 올라가고 기능이 완전히 출시됩니다.

기능을 롤아웃하기 위한 이 전략은 포함된 TargetingFilter 기능 필터를 통해 라이브러리에 기본 제공됩니다.

애플리케이션의 대상 지정

대상 지정 기능 필터를 사용하는 예제 웹 애플리케이션은 예제 프로젝트에서 사용할 수 있습니다.

애플리케이션에서 사용을 TargetingFilter 시작하려면 다른 기능 필터와 @Bean 같이 추가해야 합니다. TargetingFilter 는 애플리케이션에 추가될 다른 @Bean 애플리케이션 TargetingContextAccessor에 의존합니다. 다음 TargetingContextAccessor 예제와 같이 현재 사용자 ID 및 그룹을 정의하는 데 사용할 현재 TargetingContext 를 정의할 수 있습니다.

public class MyTargetingContextAccessor implements TargetingContextAccessor {

    @Override
    public void getContextAsync(TargetingContext context) {
        context.setUserId("Jeff");
        ArrayList<String> groups = new ArrayList<String>();
        groups.add("Ring0");
        context.setGroups(groups);
    }

}

평가 옵션 대상 지정

지정된 TargetingFilter경우 대상 지정 평가가 수행되는 방식을 사용자 지정하는 옵션을 사용할 수 있습니다. 만드는 동안 선택적 매개 변수 TargetingEvaluationOptionsTargetingFilter 설정할 수 있습니다.

    @Bean
    public TargetingFilter targetingFilter(MyTargetingContextAccessor contextAccessor) {
        return new TargetingFilter(contextAccessor, new TargetingEvaluationOptions().setIgnoreCase(true));
    }

구성 새로 고침

구성에 대해 구성 새로 고침을 사용하도록 설정하면 애플리케이션을 다시 시작하지 않고도 App Configuration 저장소 또는 저장소에서 최신 값을 끌어올 수 있습니다.

새로 고침을 사용하도록 설정하려면 모니터링 트리거와 함께 모니터링을 사용하도록 설정해야 합니다. 모니터링 트리거는 업데이트를 트리거하기 위해 값 변경 내용을 확인하는 선택적 레이블이 있는 키입니다. 새로 고침이 필요할 때 변경되는 한 모니터링 트리거의 값은 모든 값이 될 수 있습니다.

참고 항목

모니터링 트리거의 ETag를 변경하는 작업은 콘텐츠 형식 변경과 같은 새로 고침을 발생합니다.

spring:
  cloud:
    azure:
      appconfiguration:
        stores:
        - monitoring:
          enabled: true
          triggers:
          - key: [my-watched-key]
            label: [my-watched-label]

구성 새로 고침을 트리거하려면 구성 저장소에서 키 값을 변경합니다. 그런 다음 조사식 키 중 하나를 새 값으로 업데이트합니다. 이 변경은 로그 생성을 트리거합니다. 예를 들어 값을 /application/config.message 변경하면 다음 로그 메시지가 트리거됩니다.

INFO 17496 --- [TaskScheduler-1] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [config.message]

애플리케이션이 로그를 생성한 후 새로 고침 범위에 있는 모든 @Bean로그를 새로 고칩니다.

참고 항목

기본적으로 @ConfigurationProperties 주석이 추가된 콩은 이 범위에 포함됩니다.

끌어오기 기반 새로 고침

App Configuration Spring 라이브러리는 모니터링 트리거에 대한 변경 내용에 대한 새로 고침 간격을 주기적으로 확인하는 기능을 지원합니다. 기본적으로 새로 고침 간격은 30초로 설정됩니다. 새로 고침 간격이 지나면 지정된 저장소에서 모든 트리거가 변경되었는지 확인합니다. 키를 변경하면 새로 고침이 트리거됩니다. 라이브러리가 Spring 새로 고침 시스템과 통합되므로 새로 고침은 모든 저장소의 모든 구성을 다시 로드합니다. 새로 고침 간격을 1초보다 긴 간격으로 설정할 수 있습니다. 새로 고침 간격에 대해 지원되는 단위는 s각각 초 d mh, 분, 시간 및 일 단위입니다. 다음 예제에서는 새로 고침 간격을 5분으로 설정합니다.

spring.cloud.azure.appconfiguration.stores[0].monitoring.refresh-interval= 5m

자동

라이브러리를 spring-cloud-azure-appconfiguration-config-web 사용하는 경우 애플리케이션은 특히 서블릿 요청이 발생할 때마다 새로 고침을 자동으로 확인합니다 ServletRequestHandledEvent. 이 이벤트를 보내는 가장 일반적인 방법은 .의 엔드포인트에 대한 요청입니다 @RestController.

설명서

콘솔 애플리케이션과 같이만 spring-cloud-azure-appconfiguration-config사용하는 애플리케이션에서는 's refreshConfiguration 메서드를 호출AppConfigurationRefresh하여 수동으로 새로 고침을 트리거할 수 있습니다. AppConfigurationRefresh@Bean 모든 @Component에 삽입할 수 있는 것입니다.

또한 라이브러리는 Spring의 구성 시스템을 사용하기 때문에 새로 고침을 트리거하면 Azure 앱 Configuration 저장소에서 다시 로드하는 것뿐만 아니라 모든 구성이 새로 고쳐집니다.

푸시 기반 새로 고침

Azure 앱 Configuration 저장소에서 푸시 알림을 수신하도록 라이브러리를 설정 spring-cloud-azure-appconfiguration-config-web 하여 구성 값을 새로 고칠 수 있습니다. 지정된 키에 변경 내용 알림을 보내도록 구성할 수 있는 Azure Event Grid 웹 후크를 통해 이 구성을 설정할 수 있습니다. Spring Actuator 라이브러리를 종속성으로 추가하면 App Configuration의 새로 고침 엔드포인트를 노출할 수 있습니다. 두 개의 서로 다른 엔드포인트가 있습니다. appconfiguration-refresh appconfiguration-refresh-bus 이러한 엔드포인트는 해당 refresh 엔드포인트와 유사하게 작동하며 refresh-bus, 앱 구성 엔드포인트는 수신 시 새로 고침을 강제하는 대신 새로 고침 간격이 만료됩니다. 계속 사용할 refresh refresh-bus수 있지만 설정 시 응답이 필요하기 때문에 웹 후크를 사용하여 Azure Event Grid에 직접 연결할 수는 없습니다.

속성은 appconfiguration-refresh 새로 고침 간격이 만료되므로 나머지 새로 고침 간격은 다음 새로 고침 검사 전에 대기하지 않습니다. 이 속성은 appconfiguration-refresh-bus Azure Service Bus와 같은 연결된 메시징 서비스에 알림을 보내 애플리케이션의 모든 인스턴스에 새로 고침을 알립니다. 두 경우 모두 새로 고침 간격에 완전히 만료되지는 않지만 약간의 지터 크기로 해제됩니다. 이 지터는 애플리케이션의 모든 인스턴스가 동시에 새로 고침을 시도하지 않도록 합니다.

management.endpoints.web.exposure.include= appconfiguration-refresh, appconfiguration-refresh-bus

새로 고침 엔드포인트를 노출하는 것 외에도 보안을 위해 필요한 쿼리 매개 변수가 추가되었습니다. 토큰 이름 또는 값은 기본적으로 설정되지 않지만 다음 예제와 같이 엔드포인트를 사용하려면 토큰 이름 또는 값을 설정해야 합니다.

spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.primary-token.name=[primary-token-name]
spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.primary-token.secret=[primary-token-secret]
spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.secondary-token.name=[secondary-token-name]
spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.secondary-token.secret=[secondary-token-secret]

웹 후크 설정

웹 후크를 설정하려면 Azure 앱 구성 저장소를 열고 탐색 메뉴에서 이벤트를 엽니다. 그런 다음, 이벤트 구독을 선택합니다. 이벤트의 이름을 설정하고 웹 후크로 엔드포인트 유형을 선택합니다. 웹 후크를 선택하면 엔드포인트 옵션이 표시됩니다. 엔드포인트 선택을 선택합니다. 엔드포인트는 다음 예제 https://www.myaplication.com/actuator/appconfiguration-refresh?myTokenName=mySecret와 같아야 합니다.

선택 영역 이 지정된 URI에 설치 알림을 보내고 응답이 예상되는지 확인합니다. 응답이 반환되지 않으면 설치가 실패합니다. 엔드포인트에 대한 라이브러리 설정은 azure-spring-cloud-appconfiguration-web Azure 앱 구성 저장소가 애플리케이션에 대해 구성된 경우 올바른 응답을 반환합니다. 이 확인은 다른 방법으로 보낼 수 있습니다. 웹후크 배달에 대한 자세한 내용은 웹후크 이벤트 배달을 참조하세요.

참고 항목

이 유효성 검사는 엔드포인트를 만들거나 수정할 때만 발생합니다.

그렇지 않으면 키를 만들고 수정할 때마다 새로 고침이 트리거되므로 필터를 설정하는 것이 좋습니다.

강제 클라이언트 새로 고침

새로 고침 간격으로 모든 구성을 강제로 새로 고치도록 라이브러리를 구성할 수 있습니다. 다음 표에서는 속성에 대해 refresh-interval 설명합니다.

속성 설명 필수 항목 기본값
spring.cloud.azure.appconfiguration.refresh-interval 새로 고침 사이의 표준 시간입니다. 입니다.Duration 아니요 null

새로 고침은 spring.cloud.azure.appconfiguration.refresh-interval 구성된 조사식 키를 확인하지 않습니다. 이 속성은 Azure 앱 Configuration에서 업데이트 시기를 알 수 없으므로 Key Vault 비밀을 최신 상태로 유지하는 데 사용됩니다.

Azure Key Vault는 인증서의 공개 및 프라이빗 키 쌍을 비밀로 저장하므로 애플리케이션은 App Configuration에서 모든 인증서를 Key Vault 참조 로 검색할 수 있습니다. 인증서를 주기적으로 회전해야 하므로 클라이언트 애플리케이션은 클라이언트 새로 고침 간격을 사용하여 수행할 수 있는 빈도만큼 업데이트해야 합니다.

기능 플래그 새로 고침

기능 플래그와 모니터링을 모두 사용하도록 설정한 경우 기본적으로 기능 플래그에 대한 새로 고침 간격은 30초로 설정됩니다. 새로 고침 간격이 지나면 지정된 저장소에서 모든 기능 플래그가 변경되었는지 확인합니다. 키를 변경하면 새로 고침이 트리거됩니다. 라이브러리가 Spring 새로 고침 시스템과 통합되므로 새로 고침은 모든 저장소의 모든 구성을 다시 로드합니다. 새로 고침 간격을 1초보다 긴 간격으로 설정할 수 있습니다. 새로 고침 간격에 대해 지원되는 단위는 s각각 초 d mh, 분, 시간 및 일 단위입니다. 다음 예제에서는 새로 고침 간격을 5분으로 설정합니다.

spring.cloud.azure.appconfiguration.stores[0].monitoring.feature-flag-refresh-interval= 5m

상태 표시기

클라이언트 라이브러리에는 Azure 앱 Configuration 저장소 또는 저장소에 대한 연결이 정상인지 여부를 확인하는 상태 표시기가 함께 제공됩니다. 각 저장소에 대해 사용하도록 설정하면 다음 상태 값 중 하나가 제공됩니다.

  • UP - 마지막 연결이 성공했습니다.
  • DOWN - 마지막 연결로 인해 200이 아닌 오류 코드가 발생했습니다. 이 상태는 자격 증명 만료에서 서비스 문제에 이르기까지 다양한 문제로 인해 발생할 수 있습니다. 클라이언트 라이브러리는 자동으로 다시 시도하여 다음 새로 고침 간격으로 저장소에 연결합니다.
  • 로드되지 않음 - 구성 저장소가 로컬 구성 파일에 나열되지만 구성 저장소가 시작 시 파일에서 로드되지 않았습니다. 구성 저장소는 구성 파일에서 사용하지 않도록 설정되었거나 저장소에 대한 구성이 설정된 false동안 fail-fast 시작 시 구성 또는 구성을 로드하지 못했습니다.

를 설정하여 상태 표시기를 사용하도록 설정할 management.health.azure-app-configuration.enabled=true수 있습니다.

클라이언트 사용자 지정

App Configuration 라이브러리는 Java용 Azure SDK를 사용하여 Azure 앱 Configuration 및 Azure Key Vault에 연결합니다. 클라이언트를 ConfigurationClientCustomizer 수정하기 위해 두 개의 인터페이스와 SecretClientCustomizer두 개의 인터페이스가 제공됩니다. 각 인터페이스에는 customize 다음 인터페이스 정의와 같이 클라이언트가 구성되는 URI 값과 String 함께 해당 작성기를 사용하는 메서드가 있습니다.

public interface ConfigurationClientCustomizer {
    public void setup(ConfigurationClientBuilder builder, String endpoint);
}

public interface SecretClientCustomizer {
    public void setup(SecretClientBuilder builder, String endpoint);
}

이러한 인터페이스를 사용하면 HTTP 클라이언트 및 해당 구성을 사용자 지정할 수 있습니다. 다음 예제에서는 기본값 HttpClient 을 App Configuration 및 Key Vault로 전송되는 모든 트래픽에 프록시를 사용하는 다른 트래픽으로 바꿉니다.

참고 항목

SecretClientBuilderConfigurationClientBuilder 전달될 때 이미 사용하도록 설정되어 있습니다customize. 자격 증명 및 재시도 정책을 포함하여 클라이언트에 대한 모든 변경 내용이 이미 적용된 클라이언트를 재정의합니다.

Spring Cloud Azure 구성을 사용하여 이 구성을 수행할 수도 있습니다.

public class CustomClient implements ConfigurationClientCustomizer, SecretClientCustomizer {

    @Override
    public void customize(ConfigurationClientBuilder builder, String endpoint) {
        builder.httpClient(buildHttpClient());
    }

    @Override
    public void customize(SecretClientBuilder builder, String endpoint) {
        builder.httpClient(buildHttpClient());
    }

    private HttpClient buildHttpClient() {
        String hostname = System.getProperty("https.proxyHosts");
        String portString = System.getProperty("https.proxyPort");
        int port = Integer.valueOf(portString);

        ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP,
                new InetSocketAddress(hostname, port));
        return new NettyAsyncHttpClientBuilder()
                .proxy(proxyOptions)
                .build();
    }

}