Udostępnij za pomocą


Obsługa konfiguracji aplikacji

W tym artykule opisano bibliotekę Spring Cloud Azure App Configuration. Ta biblioteka ładuje konfiguracje i flagi funkcji z usługi Azure App Configuration. Biblioteka generuje abstrakcje dopasowane do tych już wygenerowanych przez środowisko Spring, takich jak zmienne środowiskowe, konfiguracje wiersza poleceń, lokalne pliki konfiguracyjne itp.

Spring to platforma aplikacji typu open source opracowana przez oprogramowanie VMware, która zapewnia uproszczone, modułowe podejście do tworzenia aplikacji Java. Spring Cloud Azure to projekt typu open source, który zapewnia bezproblemową integrację platformy Spring z usługami platformy Azure.

Wymagania wstępne

Skonfiguruj swój magazyn App Configuration

Użyj następującego polecenia, aby utworzyć magazyn konfiguracji aplikacji Azure:

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

To polecenie tworzy nowy, pusty magazyn konfiguracji. Konfiguracje można przekazać przy użyciu następującego polecenia importu:

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

Przed załadowaniem ich potwierdź konfiguracje. Możesz przekazać pliki YAML, zmieniając format na YAML. Pole prefiksu jest ważne, ponieważ jest to domyślny prefiks ładowany przez bibliotekę klienta.

Użycie biblioteki

Aby użyć funkcji w aplikacji, możesz ją skompilować jako aplikację Spring Boot. Najwygodniejszym sposobem na dodanie zależności jest użycie startera Spring Boot com.azure.spring:spring-cloud-azure-starter-appconfiguration-config. W poniższym przykładzie plik pom.xml używa usługi Azure App Configuration.

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

W poniższym przykładzie przedstawiono podstawową aplikację Spring Boot przy użyciu usługi App Configuration:

@SpringBootApplication
@RestController
public class Application {

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

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

W tym przykładzie plik application.properties zawiera następujący wiersz:

spring.config.import=azureAppConfiguration
spring.cloud.azure.appconfiguration.stores[0].endpoint=${CONFIG_STORE_ENDPOINT}

CONFIG_STORE_ENDPOINT jest zmienną środowiskową z adresem URL punktu końcowego prowadzącym do sklepu Azure App Configuration.

Uwaga

Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.

Domyślnie, jeśli nie ustawiono żadnych konfiguracji, konfiguracje rozpoczynające się od /application/ są ładowane z domyślną etykietą (No Label), chyba że ustawiono Profil Spring, w którym to przypadku domyślną etykietą jest twój Profil Spring.

Źródło właściwości o nazwie /application/https://<name-of-your-store>.azconfig.io/, zawierające właściwości tego magazynu, jest tworzone. Etykieta używana w żądaniu jest dołączana na końcu nazwy. Jeśli etykieta nie jest ustawiona, znak \0 jest obecny jako puste miejsce.

Ładowanie konfiguracji

Biblioteka obsługuje ładowanie jednego lub wielu magazynów usługi App Configuration. W sytuacji, gdy klucz jest zduplikowany w wielu sklepach, ostatni wygrywa.

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

W tym przykładzie, jeśli oba magazyny mają ten sam klucz konfiguracji, konfiguracja w drugim magazynie ma najwyższy priorytet.

Uwaga

Możesz użyć ustawień Azure App Configuration jak każdą inną konfigurację Spring. Aby uzyskać więcej informacji, zobacz Podstawowe funkcje w dokumentacji środowiska Spring Boot lub Szybki start: tworzenie aplikacji Java Spring przy użyciu usługi aplikacja systemu Azure Configuration.

Wybieranie konfiguracji

Biblioteka ładuje konfiguracje przy użyciu klucza i etykiety. Domyślnie są ładowane konfiguracje rozpoczynające się od klucza /application/ . Etykieta domyślna to \0, która jest wyświetlana jako (No Label) w Portalu Azure. Jeśli profil spring jest ustawiony i nie podano żadnej etykiety, domyślna etykieta to Profil Spring, czyli ${spring.profiles.active}.

Można skonfigurować, które konfiguracje są ładowane, wybierając różne filtry dla kluczy i etykiet.

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

Właściwość key-filter obsługuje następujące filtry:

Filtr klucza Efekt
* Pasuje do dowolnego klucza.
abc Pasuje do klucza o nazwie abc.
abc* Pasuje do nazw kluczy rozpoczynających się od abc.
abc,xyz Dopasowuje nazwę klucza abc lub xyz. Ograniczone do pięciu wartości rozdzielonych przecinkami.

Właściwość label-filter obsługuje następujące filtry:

Etykieta opis
* Pasuje do dowolnej etykiety, w tym \0.
\0 Dopasuj null etykiety, które są wyświetlane w (No Label) witrynie Azure Portal.
1.0.0 Etykieta 1.0.0 pasuje dokładnie.
1.0.* Dopasuje etykiety rozpoczynające się od 1.0.*.
,1.0.0 Dopasuj etykiety null i 1.0.0. Ograniczone do pięciu wartości rozdzielonych przecinkami.

Jeśli używasz kodu YAML z filtrami etykiet i chcesz załadować konfiguracje bez etykiet i więcej konfiguracji z innymi etykietami, musisz uwzględnić pusty ,element . Na przykład ,dev pasuje do \0 i dev. W takim przypadku otocz filtr etykiety pojedynczymi cudzysłowami. Ta wartość umożliwia załadowanie konfiguracji bez etykiety, a następnie konfiguracje z określonymi etykietami w tym samym filtrze:

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

Uwaga

Nie można łączyć * z filtrami , . W takim przypadku należy użyć dodatkowej wartości wyboru.

W przypadku użycia * w filtrze etykiet, gdy ładowane są wiele konfiguracji z tym samym kluczem, konfiguracje te są ładowane w kolejności alfabetycznej, a używana jest etykieta, która jest ostatnia w tej kolejności.

Profile Spring

Domyślnie spring.profiles.active jest ustawiana jako wartość domyślna label-filter dla wszystkich wybranych konfiguracji. Tę funkcję można zastąpić przy użyciu polecenia label-filter. Możesz używać profili Spring w programie label-filter przy użyciu ${spring.profiles.active}, jak pokazano w poniższym przykładzie:

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

W pierwszym label-filter biblioteka najpierw ładuje wszystkie konfiguracje z etykietą \0, a następnie wszystkie konfiguracje pasujące do Profilów Spring. Profile Spring Boot mają priorytet nad konfiguracjami \0, ponieważ znajdują się na końcu.

W drugim label-filter_local, ciąg jest dołączany na końcu profili Spring, ale tylko do ostatniego profilu Spring, jeśli jest ich więcej niż jeden.

Wyłączone sklepy

Za pomocą konfiguracji spring.cloud.azure.appconfiguration.enabled można wyłączyć ładowanie wszystkich magazynów konfiguracyjnych. W konfiguracji spring.cloud.azure.appconfiguration.stores[0].enabled możesz wyłączyć pojedynczy sklep.

Uwaga

Jeśli używasz metryk kondycji, nadal widzisz swoje sklepy na liście, ale z wartością NOT LOADED. Podczas sprawdzania załadowanych źródeł właściwości nadal są one wyświetlane, ale nie zawierają żadnych wartości. To zachowanie jest spowodowane ustawianą właściwością spring.config.import . Jeśli azureAppConfiguration nie jest ustawiony dla spring.config.import, żadne wartości nie są wyświetlane.

Uwierzytelnianie

Biblioteka obsługuje wszystkie formy tożsamości wspierane przez Azure Identity Library. Uwierzytelnianie można wykonać za pomocą konfiguracji dla parametrów połączenia i identyfikatora zarządzanego.

Uwaga

Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.

Uwierzytelnianie za pośrednictwem parametrów połączenia jest najprostszą formą konfiguracji, choć nie jest to zalecane. Dostęp do parametry połączenia sklepu można uzyskać przy użyciu następującego polecenia:

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

Następnie można ustawić właściwość spring.cloud.azure.appconfiguration.stores[0].connection-string na ciąg połączenia. W przypadku korzystania z tego podejścia zdecydowanie zalecamy ustawienie ciągu połączenia w lokalnym pliku konfiguracyjnym na wartość symbolu zastępczego, mapowaną na zmienną środowiskową. Takie podejście pozwala uniknąć dodawania parametry połączenia do kontroli źródła.

Konfiguracja Spring Cloud Azure

Możesz użyć konfiguracji Spring Cloud Azure do skonfigurowania biblioteki. Aby skonfigurować bibliotekę, możesz użyć następujących właściwości:

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

Po ustawieniu tylko punktu końcowego, biblioteka klienta używa mechanizmu DefaultAzureCredential do uwierzytelniania.

Musisz przypisać tożsamość używaną do odczytywania konfiguracji. To zadanie można utworzyć przy użyciu następującego polecenia:

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>

Uwaga

Można zdefiniować tylko jedną metodę uwierzytelniania na punkt końcowy: parametry połączenia, tożsamość przypisana przez użytkownika lub poświadczenia tokenu. Jeśli musisz mieszać i dopasowywać, możesz użyć ConfigurationClientCustomizer do zmodyfikowania ConfigurationClientBuilder w celu zastosowania różnych metod.

Uwaga

Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Przepływ uwierzytelniania opisany w tej procedurze, taki jak bazy danych, pamięci podręczne, komunikaty lub usługi sztucznej inteligencji, wymaga bardzo wysokiego stopnia zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach. Użyj tego przepływu tylko wtedy, gdy bardziej bezpieczne opcje, takie jak tożsamości zarządzane dla połączeń bez hasła lub bez kluczy, nie są opłacalne. W przypadku operacji maszyny lokalnej preferuj tożsamości użytkowników dla połączeń bez hasła lub bez klucza.

Replikacja geograficzna

Biblioteka obsługuje funkcję replikacji geograficznej w Azure App Configuration. Ta funkcja umożliwia replikowanie danych do innych lokalizacji. Ta funkcja jest przydatna w przypadku wysokiej dostępności i odzyskiwania po awarii.

Każda utworzona replika ma dedykowany punkt końcowy. Jeśli aplikacja znajduje się w wielu lokalizacjach geograficznych, możesz zaktualizować każde jej wdrożenie, aby połączyć się z repliką bliżej tej lokalizacji, co pomaga zminimalizować opóźnienie sieciowe między aplikacją a usługą App Configuration. Ponieważ każda replika ma swój oddzielny limit przydziału żądań, ta konfiguracja pomaga również w skalowalności aplikacji, gdy rośnie do usługi rozproszonej w wielu regionach.

Domyślnie biblioteka automatycznie odnajduje wszystkie repliki istniejące dla magazynu konfiguracji. Po wysłaniu żądania do dostarczonego magazynu i jego niepowodzeniu, biblioteka automatycznie ponawia żądanie do dostępnych replik.

Failover może wystąpić, jeśli biblioteka zauważy dowolny z następujących warunków:

  • Odbiera odpowiedzi z niedostępnym kodem stanu usługi (HTTP 500 lub nowszym) z punktu końcowego.
  • Występują problemy z łącznością sieciową.
  • Żądania są ograniczane (kod stanu HTTP 429).

Po powrocie dostarczonego sklepu do trybu online biblioteka automatycznie ponawia żądanie względem podanego sklepu.

Jeśli chcesz kontrolować zachowanie podczas przełączania awaryjnego, możesz ręcznie podać listę sklepów do użycia w trybie failover.

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

lub

spring.cloud.azure.appconfiguration.stores[0].connection-strings[0]=[your primary store connection string]
spring.cloud.azure.appconfiguration.stores[0].connection-strings[1]=[your replica store connection string]

Jeśli wszystkie dostarczone punkty końcowe repliki kończą się niepowodzeniem, biblioteka próbuje nawiązać połączenie z automatycznie odnalezionymi replikami magazynu podstawowego.

Replikację można wyłączyć za pomocą ustawienia spring.cloud.azure.appconfiguration.stores[0].replica-discovery-enabled=false.

Tworzenie magazynu konfiguracji z replikacją geograficzną

Aby utworzyć replikę magazynu konfiguracji, możesz użyć interfejsu wiersza polecenia platformy Azure lub witryny Azure Portal. W poniższym przykładzie użyto Azure CLI do utworzenia repliki w regionie Wschodnie USA 2.

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

Wartości klucza

aplikacja systemu Azure Configuration obsługuje wiele typów wartości kluczy, z których niektóre mają wbudowane specjalne funkcje. Azure App Configuration ma wbudowaną obsługę typu zawartości JSON, symboli zastępczych Spring i odwołań do usługi Key Vault.

Symbole zastępcze

Biblioteka obsługuje konfiguracje z zastępczymi symbolami środowiskowymi w stylu ${}. W przypadku odwoływania się do klucza Azure App Configuration z użyciem symbolu zastępczego usuń prefiksy z odwołania. Na przykład /application/config.message jest przywołyny jako ${config.message}.

Uwaga

Usuwany prefiks odpowiada wartości spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter. Prefiks, który jest przycinany, można zmienić, ustawiając wartość elementu spring.cloud.azure.appconfiguration.stores[0].trim-key-prefix[0].

JSON

Konfiguracje, które mają typ application/json zawartości, są przetwarzane jako obiekty JSON. Ta funkcja umożliwia zmapowanie jednej konfiguracji na złożony obiekt wewnątrz @ConfigurationProperties. Rozważmy na przykład klucz /application/config.colors JSON o następującej wartości:

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

Ten klucz odnosi się do następującego kodu.

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

    private Map<String, Color> colors;

}

Odwołania do Key Vault

Azure App Configuration i jego biblioteki obsługują odwoływanie się do sekretów przechowywanych w usłudze Key Vault. W usłudze App Configuration można tworzyć klucze z wartościami przypisanymi do tajemnic przechowywanych w usłudze Key Vault. Wpisy tajne pozostają bezpieczne w usłudze Key Vault, ale dostęp do nich można uzyskać w taki sam sposób, jak każda inna konfiguracja podczas ładowania aplikacji.

Aplikacja używa dostawcy klienta do pobierania odwołań do Key Vault, podobnie jak w przypadku innych kluczy przechowywanych w usłudze App Configuration. Ponieważ aplikacja klienta rozpoznaje klucze jako odwołania do Key Vault, mają one unikatowy typ zawartości, a klient nawiązuje połączenie z Key Vault, aby pobrać ich wartości dla ciebie.

Uwaga

Usługa Key Vault zezwala tylko na pobieranie tajemnic pojedynczo, więc każde odwołanie do Key Vault przechowywane w usłudze App Configuration skutkuje zapytaniem do Key Vault.

Tworzenie odwołań do usługi Key Vault

Odwołanie do usługi Key Vault można utworzyć w witrynie Azure Portal, przechodząc do eksploratora konfiguracji>Utwórz>odwołanie do Key Vault. Następnie możesz wybrać tajemnicę, do której chcesz się odwołać, z dowolnego magazynu kluczy, do którego masz dostęp. Możesz również utworzyć dowolne odwołania do usługi Key Vault na karcie Dane wejściowe . W witrynie Azure Portal wprowadź prawidłowy identyfikator URI.

Odwołanie do usługi Key Vault można również utworzyć za pomocą interfejsu wiersza polecenia platformy Azure przy użyciu następującego polecenia:

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

Dowolny sekretny identyfikator można utworzyć za pomocą Azure CLI. Identyfikatory sekretów wymagają tylko formatu {vault}/{collection}/{name}/{version?} w którym sekcja wersji jest opcjonalna.

Korzystanie z odwołań do Key Vault

Możesz użyć konfiguracji Spring Cloud Azure do skonfigurowania biblioteki. Możesz użyć tego samego poświadczenia użytego do nawiązania połączenia z usługą App Configuration w celu nawiązania połączenia z usługą Azure Key Vault.

Możesz również utworzyć SecretClientCustomizer w taki sam sposób, jak tworzysz ConfigurationClientCustomizer, aby zapewnić własną metodę uwierzytelniania.

Rozwiązywanie wpisów tajnych spoza Key Vault

Biblioteka App Configuration udostępnia metodę zastępowania rozpoznawania odwołań do Key Vault. Można na przykład użyć go do lokalnego rozwiązywania tajemnic w środowisku deweloperskim. To rozwiązanie odbywa się za pośrednictwem KeyVaultSecretProvider. Parametr KeyVaultSecretProvider, jeśli jest podany, jest wywoływany dla każdego odwołania do magazynu kluczy. Jeśli getSecret zwraca wartość inną niż null, jest używana jako wartość tajna. W przeciwnym razie odwołanie do usługi Key Vault jest zwykle rozwiązywane.

public class MySecretProvider implements KeyVaultSecretProvider {

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

}

Zarządzanie funkcjami

Zarządzanie funkcjami umożliwia aplikacjom Spring Boot dynamiczne uzyskiwanie dostępu do zawartości. Zarządzanie funkcjami ma różne funkcje, takie jak następujące:

  • Flagi funkcji, które mogą włączać lub wyłączać zawartość
  • Filtry funkcji określania wartości docelowej w przypadku wyświetlania zawartości
  • Filtry dostosowanych funkcji
  • Bramy funkcji umożliwiające dynamiczne włączanie punktów końcowych

Flagi funkcji można włączyć za pomocą następującej konfiguracji:

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

Włączone flagi funkcji są ładowane do systemu konfiguracji Spring z prefiksem feature-management. Możesz również zarejestrować flagi funkcji w lokalnym pliku konfiguracji. Aby uzyskać więcej informacji, zobacz sekcję Deklaracja funkcji flagi.

Najprostszym sposobem korzystania z zarządzania funkcjami jest użycie bibliotek spring-cloud-azure-feature-management i spring-cloud-azure-feature-management-web. Różnica między tymi dwiema bibliotekami polega na tym, że spring-cloud-azure-feature-management-web korzysta z zależności od bibliotek spring-web i spring-webmvc w celu dodania większej liczby funkcji, takich jak kontrolery funkcji.

Domyślnie wszystkie flagi funkcji o etykiecie \0, widocznej jako (No Label), są ładowane. Można skonfigurować flagi funkcji, które są ładowane, ustawiając filtr etykiety, jak pokazano w poniższym przykładzie.

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

Podstawowe informacje dotyczące zarządzania funkcjami

Przełączniki funkcji

Flagi funkcji składają się z wielu części, w tym nazwy i listy filtrów funkcji, które są używane do włączania funkcji. Flagi funkcji mogą mieć stan logiczny włączone lub wyłączone albo mogą mieć listę filtrów funkcji. Flagi funkcji oceniają filtry funkcji, aż jeden z nich zwróci wartość true. Jeśli żaden filtr funkcji nie zwraca truewartości , flaga funkcji zwraca wartość false.

Filtry funkcji

Filtry funkcji definiują scenariusz włączania funkcji. Filtry funkcji są oceniane synchronicznie.

Biblioteka zarządzania funkcjami zawiera cztery wstępnie zdefiniowane filtry: AlwaysOnFilter, PercentageFilter, TimeWindowFilter i TargetingFilter.

Możesz tworzyć filtry funkcji niestandardowych. Na przykład możesz użyć filtru funkcji, aby zapewnić niestandardowe środowisko dla klientów korzystających z przeglądarki Microsoft Edge. Możesz dostosować funkcje w tym filtrze funkcji, na przykład, aby wyświetlić określony nagłówek dla odbiorców przeglądarki Microsoft Edge.

Deklaracja przełącznika funkcji

Biblioteka zarządzania funkcjami obsługuje usługę Azure App Configuration wraz z application.yml lub application.properties jako źródła flag funkcji. Oto przykład formatu używanego do konfigurowania flag funkcji w pliku application.yml :

feature-management:
  feature_flags:
  - id: feature-t
    enabled: false
  - id: feature-u
    conditions:
      client_filters:
      - name: Random
  - id: feature-v
    conditions:
      client_filters:
      - name: TimeWindowFilter
        parameters:
          Start: "Wed, 01 May 2019 13:59:59 GMT"
          End: "Mon, 01 July 2019 00:00:00 GMT"

  - id: feature-w
    evaluate: false
    conditions:
      client_filters:
      - name: AlwaysOnFilter

Ten przykład zawiera następujące flagi funkcji:

  • feature-t jest ustawiony na false. To ustawienie zawsze zwraca wartość flagi funkcji.
  • feature-u jest używany z filtrami funkcji. Te filtry są definiowane dla właściwości enabled-for. W takim przypadku feature-u ma jeden filtr funkcji o nazwie Random, który nie wymaga żadnej konfiguracji, więc wymagana jest tylko właściwość name.
  • feature-v określa filtr funkcji o nazwie TimeWindowFilter. Do tego filtru funkcji można przekazać parametry do wykorzystania jako konfigurację. W tym przykładzie parametr TimeWindowFilter przekazuje czasy rozpoczęcia i zakończenia, w których funkcja jest aktywna.
  • feature-w jest używany dla elementu AlwaysOnFilter, który zawsze daje wartość true. Pole evaluate służy do zatrzymywania oceny filtrów funkcji i powoduje, że filtr funkcji zawsze zwraca wartość false.

Ocenianie flag funkcji

Biblioteka spring-cloud-azure-feature-management umożliwia FeatureManager określenie, czy flaga funkcji jest włączona. FeatureManager Zapewnia asynchroniczny sposób sprawdzania stanu flagi.

spring-cloud-azure-feature-management-web, wraz z FeatureManager, zawiera FeatureManagerSnapshot, który buforuje stan wcześniej ocenianych flag funkcji w @RequestScope, aby zagwarantować, że wszystkie żądania zwracają tę samą wartość. Ponadto biblioteka internetowa udostępnia @FeatureGateelement , który może blokować lub przekierowywać żądania internetowe do różnych punktów końcowych.

Sprawdzanie flagi funkcji

FeatureManager jest @Bean, który może być @Autowired lub wstrzykiwany do obiektów typu @Component. FeatureManager ma metodę isEnabled , która po przekazaniu nazwy flagi funkcji zwraca jej stan.

@Autowired
FeatureManager featureManager;

...

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

Uwaga

FeatureManager ma również asynchroniczną wersję isEnabled o nazwie isEnabledAsync.

Bez konfiguracji zarządzania funkcjami lub gdy flaga funkcji nie istnieje, isEnabled zawsze zwraca wartość false. Jeśli istniejąca flaga funkcji jest skonfigurowana z nieznanym filtrem funkcji, zostanie zgłoszony wyjątek FilterNotFoundException. Możesz zmienić to zachowanie, aby zwrócić false, konfigurując fail-fast na false. W poniższej tabeli opisano fail-fast:

Nazwa/nazwisko opis Wymagane Wartość domyślna
spring.cloud.azure.feature.management.fail-fast W przypadku wystąpienia wyjątku zgłaszany jest wyjątek RuntimeException . Jeśli ta właściwość jest ustawiona na falsewartość , isEnabled zwraca zamiast tego wartość false . Nie. true

Jedyną różnicą między elementami FeatureManagerSnapshot i FeatureManager jest buforowanie wyników w obiekcie @RequestScope.

Przełącznik funkcji

Za pomocą biblioteki zarządzania funkcjami w sieci Web można wymagać włączenia danej funkcji w celu wykonania punktu końcowego. To wymaganie można skonfigurować przy użyciu @FeatureGate adnotacji, jak pokazano w poniższym przykładzie:

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

Dostęp do punktu końcowego featureT można uzyskać tylko wtedy, gdy opcja "feature-t" jest włączona.

Zablokowana obsługa akcji

Gdy punkt końcowy jest zablokowany, ponieważ określona funkcja jest wyłączona, DisabledFeaturesHandler jest wywoływana. Domyślnie zwracany jest błąd HTTP 404. Możesz zastąpić to zachowanie, implementując DisabledFeaturesHandler, co pokazano w następującym przykładzie:

@Component
public class MyDisabledFeaturesHandler implements DisabledFeaturesHandler {

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

}
Rutowanie

Niektóre trasy mogą uwidaczniać możliwości aplikacji, które są ograniczone przez funkcje. Jeśli funkcja jest wyłączona, możesz przekierować te trasy do innego punktu końcowego, jak pokazano w poniższym przykładzie:

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

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

Filtry funkcji wbudowanych

Istnieje kilka filtrów funkcji, które są dostarczane z pakietem spring-cloud-azure-feature-management . Te filtry funkcji są dodawane automatycznie.

Zawsze włączony filtr

Ten filtr zawsze zwraca wartość true. Aby zapoznać się z przykładem użycia, zobacz sekcję deklaracji flagi funkcjonalności.

Filtr procentowy

Za każdym razem, gdy jest sprawdzane, ocena PercentageFilter może zwrócić inny wynik. Tę niespójność można obejść przy użyciu FeatureManagementSnapshotelementu , który buforuje wynik flagi funkcji na żądanie.

feature-management:
  feature_flags:
  - name: feature-v
    conditions:
      client_filters:
      - name: PercentageFilter
        parameters:
          Value: 50

Filtr Okna Czasowego

Ten filtr zapewnia możliwość włączenia funkcji na podstawie przedziału czasu. Jeśli określisz tylko End, funkcja jest aktywna do tego czasu. Jeśli określisz tylko Startwartość, funkcja jest uznawana za włączoną we wszystkich punktach po tym czasie. Jeśli określisz oba te elementy, funkcja jest uznawana za prawidłową między dwoma razy.

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

Ten filtr obsługuje również powtarzające się filtry okien czasowych. Obsługuje zarówno cykle dzienne, jak i tygodniowe oraz czas wygaśnięcia.

feature-management:
  feature_flags:
  - name: feature-v
    conditions:
      client_filters:
      - name: TimeWindowFilter
        parameters:
          Start: "Mon, 01 July 2019 00:00:00 GMT"
          End: "Mon, 01 July 2019 12:00:00 GMT"
          Recurrence:
            Pattern:
              Type: Weekly
              Interval: 1
              FirstDayOfWeek: Sunday
              DaysOfWeek:
              - Monday
              - Wednesday

Ten wzorzec cyklu odbywa się co tydzień w poniedziałek i środę od 00:00:00 GMT do 12:00:00 GMT i nie wygasa.

feature-management:
  feature_flags:
  - name: feature-v
    conditions:
      client_filters:
      - name: TimeWindowFilter
        parameters:
          Start: "Mon, 01 July 2019 00:00:00 GMT"
          End: "Mon, 01 July 2019 12:00:00 GMT"
          Recurrence:
            Pattern:
              Type: Daily
              Interval: 2
            Range:
              Type: EndDate
              EndDate: "Fri, 15 Aug 2025 07:00:00 GMT"

Ten wzorzec cyklu odbywa się codziennie od 00:00:00 GMT do 12:00:00 GMT do daty zakończenia.

Filtr ukierunkowania

Ten filtr zapewnia możliwość włączenia funkcji dla odbiorców docelowych. Aby uzyskać szczegółowe wyjaśnienie targetowania, zobacz sekcję targetowania. Parametry filtru obejmują obiekt odbiorców, który opisuje użytkowników, grupy i domyślny procent bazy użytkowników, który powinien mieć dostęp do funkcji. Dla każdego obiektu grupy, który jest wymieniony w docelowej grupie odbiorców, wymagany jest procent, który definiuje procent członków tej grupy, którzy mają dostęp do funkcji. Użytkownik ma włączoną funkcję w następujących przypadkach:

  • Użytkownik jest określony bezpośrednio w sekcji użytkowników.
  • Użytkownik znajduje się w ujętym procentowym zakresie w którymkolwiek z wdrożeń grupy.
  • Użytkownik należy do domyślnego procentu wdrożenia.
feature-management:
  feature_flags:
  - name: target
    conditions:
      client_filters:
      - name: targetingFilter
        parameters:
          users:
          - Jeff
          - Alicia
          groups:
          - name: Ring0
            rollout-percentage: 100
          - name: Ring1
            rolloutPercentage: 100
          default-rollout-percentage: 50

Filtry funkcji niestandardowych

Tworzenie niestandardowego filtru funkcji umożliwia włączanie funkcji na podstawie zdefiniowanych kryteriów. Aby utworzyć niestandardowy filtr funkcji, należy zaimplementować FeatureFilter interfejs. FeatureFilter ma jedną metodę evaluate. Gdy funkcja określa, że można ją włączyć za pomocą filtra funkcji, metoda evaluate jest wywoływana. Jeśli evaluate zwraca true wartość, oznacza to, że należy włączyć tę funkcję. Jeśli zwraca false, kontynuuje ocenianie filtrów funkcji do momentu, aż jeden zwróci true. Jeśli wszystkie filtry zwracają false, funkcja jest wyłączona.

Filtry funkcji są definiowane w postaci Spring Beans, dlatego są zdefiniowane jako @Component lub zdefiniowane w elemencie @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;
    }

}

Filtry funkcji sparametryzowanych

Niektóre filtry funkcji wymagają parametrów, aby określić, czy funkcja powinna być włączona. Na przykład filtr funkcji przeglądarki może włączyć funkcję dla określonego zestawu przeglądarek. Możesz chcieć włączyć funkcję dla przeglądarek Microsoft Edge i Chrome, ale nie Firefox. Aby skonfigurować tę sytuację, można zaprojektować filtr funkcji, aby oczekiwać parametrów. Te parametry zostaną określone w konfiguracji funkcji i w kodzie i będą dostępne za pośrednictwem parametru FeatureFilterEvaluationContextevaluate. FeatureFilterEvaluationContext ma właściwość parameters, która jest Map<String, Object>.

Targetowanie

Określanie wartości docelowej to strategia zarządzania funkcjami, która umożliwia deweloperom stopniowe wdrażanie nowych funkcji w bazie użytkowników. Strategia jest oparta na koncepcji określania celu grupy użytkowników znanej jako docelowa grupa odbiorców. Odbiorcy składają się z określonych użytkowników, grup i wyznaczonego procentu całej bazy użytkowników. Grupy, które są uwzględnione w grupie odbiorców, można podzielić dalej na wartości procentowe ich całkowitej liczby członków.

W poniższych krokach przedstawiono przykład progresywnego wdrożenia nowej funkcji "Beta":

  1. Indywidualni użytkownicy Jeff i Alicia otrzymują dostęp do wersji beta.
  2. Inny użytkownik, Mark, prosi o dołączenie i jest uwzględniony.
  3. Dwadzieścia procent grupy znanej jako "Ring1" użytkowników jest uwzględnionych w wersji beta.
  4. Liczba użytkowników "Ring1" uwzględnionych w wersji beta wzrosła do 100 procent.
  5. Pięć procent bazy użytkowników jest uwzględnionych w wersji beta.
  6. Procent wdrożenia jest zwiększony do 100 procent, a funkcja została całkowicie wdrożona.

Ta strategia wdrażania funkcji jest wbudowana w bibliotekę za pomocą dołączonego TargetingFilter filtru funkcji.

Targetowanie w aplikacji

Przykładowa aplikacja internetowa, która korzysta z filtru celowania, jest dostępna w projekcie przykładowym.

Aby rozpocząć korzystanie z TargetingFilter w aplikacji, należy dodać go jako @Bean podobnie jak każdy inny filtr funkcji. TargetingFilter opiera się na innym @Bean, aby zostać dodanym do aplikacji TargetingContextAccessor. Element TargetingContextAccessor umożliwia zdefiniowanie bieżącego TargetingContext do ustalenia bieżącego identyfikatora użytkownika i grup, jak pokazano w poniższym przykładzie:

public class MyTargetingContextAccessor implements TargetingContextAccessor {

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

}

Opcje oceny targetowania

Dostępne są opcje dostosowywania tego, jak ocena celowania jest wykonywana w danym TargetingFilter. Podczas tworzenia można ustawić opcjonalny parametr , TargetingEvaluationOptionsTargetingFilter .

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

Odświeżanie konfiguracji

Włączenie funkcji odświeżania konfiguracji umożliwia pobieranie najnowszych wartości z Twojego sklepu lub sklepów App Configuration bez konieczności restartu aplikacji.

Aby włączyć odświeżanie, należy włączyć monitorowanie wraz z wyzwalaczami monitorowania. Wyzwalacz monitorowania to klucz z opcjonalną etykietą, którą system monitoruje pod kątem zmian wartości w celu wyzwolenia aktualizacji. Wartość wyzwalacza monitorowania może być dowolną wartością, o ile zmienia się, gdy jest potrzebne odświeżanie.

Uwaga

Każda operacja, która zmienia ETag wyzwalacza monitoringu, powoduje odświeżenie, na przykład zmiana typu zawartości.

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

Aby zainicjować odświeżenie konfiguracji, zmień wartość klucza w swoim magazynie konfiguracji. Następnie zaktualizuj jeden z kluczy zegarka do nowej wartości. Ta zmiana wyzwala tworzenie dziennika. Na przykład zmiana wartości /application/config.message powoduje następujący komunikat dziennika:

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

Po wygenerowaniu dziennika aplikacja odświeża wszystkie @Bean elementy w zakresie odświeżania.

Uwaga

Domyślnie adnotowane ziarna są włączane do tego zakresu.

Odświeżanie oparte na wciąganiu

Biblioteki Spring konfiguracji aplikacji obsługują możliwość okresowego sprawdzania interwału odświeżania pod kątem zmian wprowadzonych w wyzwalaczach monitorowania. Domyślnie interwał odświeżania jest ustawiony na 30 sekund. Po zakończeniu interwału odświeżania po podjęciu próby odświeżenia wszystkie wyzwalacze są zaewidencjonowane w danym magazynie pod kątem zmian. Każda zmiana klucza powoduje odświeżenie. Ponieważ biblioteki integrują się z systemem odświeżania Spring, każde odświeżenie ładuje na nowo wszystkie konfiguracje ze wszystkich repozytoriów. Interwał odświeżania można ustawić na dowolny interwał dłuższy niż 1 sekundę. Obsługiwane jednostki interwału odświeżania to s, m, h oraz d odpowiednio w sekundach, minutach, godzinach i dniach. Poniższy przykład ustawia interwał odświeżania na 5 minut:

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

Zautomatyzowane

Gdy używasz spring-cloud-azure-appconfiguration-config-web biblioteki, aplikacja automatycznie sprawdza odświeżanie za każdym razem, gdy wystąpi żądanie serwletu, w szczególności ServletRequestHandledEvent. Najczęstszym sposobem przesyłania tego zdarzenia są żądania do punktów końcowych w systemie/aplikacji @RestController.

Podręcznik

W aplikacjach korzystających tylko z spring-cloud-azure-appconfiguration-config, takich jak aplikacje konsolowe, można ręcznie wyzwolić odświeżenie, wywołując metodę AppConfigurationRefresh należącą do refreshConfiguration. AppConfigurationRefresh @Bean to element, który można zaimplementować w dowolnym @Component.

Ponadto, ponieważ biblioteka korzysta z systemu konfiguracji platformy Spring, wyzwalanie odświeżania powoduje odświeżenie wszystkich konfiguracji, a nie tylko ponowne ładowanie tych z magazynu usługi Azure App Configuration.

Uwaga

Ta metoda nie jest już zalecana, ale jest obecnie obsługiwana.

Możesz skonfigurować bibliotekę spring-cloud-azure-appconfiguration-config-web do odbierania powiadomień push z magazynu Azure App Configuration w celu odświeżenia wartości konfiguracji. Tę konfigurację można skonfigurować za pomocą elementu Web Hook usługi Azure Event Grid, który można skonfigurować do wysyłania powiadomień o zmianach do określonych kluczy. Dodając bibliotekę Spring Actuator jako zależność, można uwidocznić punkty końcowe odświeżania w App Configuration. Istnieją dwa różne punkty końcowe: appconfiguration-refresh i appconfiguration-refresh-bus. Te punkty końcowe działają podobnie do ich odpowiedników refresh i refresh-bus, gdzie punkty końcowe konfiguracji aplikacji wygasają interwał odświeżania zamiast wymuszać odświeżanie po otrzymaniu. Nadal można używać elementów refresh i refresh-bus, ale nie można połączyć ich bezpośrednio z usługą Azure Event Grid przy użyciu elementu Web Hook, ponieważ wymagają one odpowiedzi w konfiguracji.

Właściwość appconfiguration-refresh ustawia wygaśnięcie interwału odświeżania, więc pozostały czas interwału odświeżania nie jest oczekiwany przed następną kontrolą odświeżania. Właściwość appconfiguration-refresh-bus wysyła powiadomienie do połączonej usługi przesyłania komunikatów, takiej jak Azure Service Bus, aby powiadomić wszystkie instancje aplikacji o potrzebie odświeżenia. W obu przypadkach nie wygasa ona całkowicie w interwale odświeżania, ale jest wyłączona przez niewielką ilość roztrzasku. Ten jitter sprawia, że każda instancja aplikacji nie odświeża się w tym samym czasie.

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

Oprócz uwidaczniania punktów końcowych odświeżania biblioteka wymaga parametru zapytania na potrzeby zabezpieczeń. Domyślnie nie istnieje żadna nazwa ani wartość tokenu, ale należy ustawić tę wartość, aby używać punktów końcowych, jak pokazano w poniższym przykładzie:

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]

Konfigurowanie punktów zaczepienia sieci Web

Aby skonfigurować webhook, otwórz Azure App Configuration i przejdź do sekcji Zdarzenia z menu nawigacji. Następnie wybierz pozycję Subskrypcja zdarzeń. Ustaw nazwę zdarzenia i wybierz typ punktu końcowego jako Web Hook. Wybranie elementu Web Hook powoduje wyświetlenie opcji Punkt końcowy . Wybierz pozycję Wybierz punkt końcowy. Punkt końcowy powinien wyglądać podobnie do następującego przykładu: https://www.myaplication.com/actuator/appconfiguration-refresh?myTokenName=mySecret.

Potwierdzenie wyboru wysyła powiadomienie konfiguracyjne do danego identyfikatora URI i oczekuje odpowiedzi. Jeśli nie zostanie zwrócona żadna odpowiedź, instalacja zakończy się niepowodzeniem. Konfiguracja azure-spring-cloud-appconfiguration-web biblioteki dla punktów końcowych zwraca poprawną odpowiedź, jeśli magazyn konfiguracji aplikacji Azure jest skonfigurowany dla aplikacji. To potwierdzenie można wysłać na inne sposoby. Aby uzyskać więcej informacji na temat dostarczania elementu webhook, zobacz Webhook event delivery (Dostarczanie zdarzeń elementu webhook).

Uwaga

Ta walidacja odbywa się tylko po utworzeniu lub modyfikacji punktu końcowego.

Zdecydowanie zalecamy skonfigurowanie filtrów, ponieważ w przeciwnym razie odświeżanie jest wyzwalane po każdym utworzeniu i modyfikacji klucza.

Wymuszone odświeżanie klienta

Możesz skonfigurować bibliotekę tak, aby wymusić odświeżenie wszystkich konfiguracji w interwale odświeżania. Poniższa tabela przedstawia właściwość refresh-interval.

Nazwa/nazwisko opis Wymagane Wartość domyślna
spring.cloud.azure.appconfiguration.refresh-interval Standardowy czas między odświeżeniami. Jest Duration. Nie. null

Odświeżanie za pomocą spring.cloud.azure.appconfiguration.refresh-interval polecenia nie sprawdza żadnych skonfigurowanych kluczy zegarka. Ta właściwość służy do zapewnienia aktualności wpisów tajnych usługi Key Vault, ponieważ usługa Azure App Configuration nie może określić, kiedy są one aktualizowane.

Ponieważ usługa Azure Key Vault przechowuje parę kluczy publicznych i prywatnych certyfikatu jako tajne, aplikacja może pobrać dowolny certyfikat jako odwołanie do Key Vault w usłudze App Configuration. Ponieważ certyfikaty muszą być okresowo obracane, aplikacje klienckie muszą być aktualizowane tak samo często, co można zrobić za pomocą interwału odświeżania klienta.

Odświeżanie przełącznika funkcji

Jeśli flagi funkcji i monitorowanie są włączone, domyślnie interwał odświeżania flag funkcji jest ustawiony na 30 sekund. Po zakończeniu interwału odświeżania system sprawdza wszystkie flagi cech w danym magazynie, aby wykryć zmiany. Każda zmiana klucza powoduje odświeżenie. Ponieważ biblioteki integrują się z systemem odświeżania Spring, każde odświeżenie ładuje na nowo wszystkie konfiguracje ze wszystkich repozytoriów. Interwał odświeżania można ustawić na dowolny interwał dłuższy niż 1 sekundę. Obsługiwane jednostki interwału odświeżania to s, m, h oraz d odpowiednio w sekundach, minutach, godzinach i dniach. Poniższy przykład ustawia interwał odświeżania na 5 minut:

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

Wskaźnik kondycji

Biblioteka klienta zawiera wskaźnik kondycji, który sprawdza, czy połączenie z magazynem lub magazynami usługi Azure App Configuration jest zdrowe. Jeśli jest włączona dla każdego magazynu, daje jedną z następujących wartości stanu:

  • UP — ostatnie połączenie zakończyło się pomyślnie.
  • DOWN — ostatnie połączenie zakończyło się błędem innym niż 200. Ten stan może być spowodowany problemami od poświadczeń wygasających do problemu z usługą. Biblioteka klienta automatycznie próbuje ponownie połączyć się ze sklepem przy następnym okresie odświeżania.
  • NIE ZAŁADOWANO — magazyn konfiguracji jest wymieniony w lokalnym pliku konfiguracji, ale magazyn konfiguracji nie został załadowany z pliku podczas uruchamiania. Magazyn konfiguracji został wyłączony w pliku konfiguracyjnym lub konfiguracja lub konfiguracje nie załadowały się podczas uruchamiania, podczas gdy fail-fast konfiguracja magazynu została ustawiona na false.

Wskaźnik kondycji można włączyć, ustawiając wartość management.health.azure-app-configuration.enabled=true.

Dostosowywanie klienta

Biblioteka App Configuration używa zestawu Azure SDK dla języka Java do łączenia się z Azure App Configuration i Azure Key Vault. Dwa interfejsy ConfigurationClientCustomizer i SecretClientCustomizer, są udostępniane do modyfikowania klientów. Każdy interfejs ma metodę customize , która przyjmuje odpowiedniego konstruktora wraz z wartością String identyfikatora URI, dla którego jest konfigurowany klient, jak pokazano w następujących definicjach interfejsu:

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

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

Te interfejsy umożliwiają dostosowanie klienta HTTP i jego konfiguracji. Poniższy przykład zastępuje domyślną wartość HttpClient inną, która używa proxy dla całego ruchu kierowanego do usług App Configuration i Key Vault.

Uwaga

Wartości ConfigurationClientBuilder i SecretClientBuilder są już skonfigurowane do użycia po przekazaniu do customize. Wszelkie zmiany w klientach, w tym poświadczenia i polityka ponawiania prób, zastępują domyślne ustawienia już istniejące.

Tę konfigurację można również wykonać przy użyciu konfiguracji platformy Azure Spring Cloud.

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();
    }

}