Obsługa konfiguracji aplikacji

W tym artykule opisano bibliotekę konfiguracji platformy Spring Cloud aplikacja systemu Azure. Ta biblioteka ładuje konfiguracje i flagi funkcji z usługi konfiguracji aplikacja systemu Azure. Biblioteka generuje abstrakcje, aby pasowały PropertySource do abstrakcji wygenerowanych już przez środowisko Spring, takie jak zmienne środowiskowe, konfiguracje wiersza polecenia, lokalne pliki konfiguracji itd.

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

Konfigurowanie magazynu usługi App Configuration

Użyj następującego polecenia, aby utworzyć magazyn konfiguracji aplikacja systemu 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. Pliki YAML można przekazać, 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 dodania zależności jest użycie szablonu startowego com.azure.spring:spring-cloud-azure-starter-appconfiguration-configSpring Boot. W poniższym przykładzie plik pom.xml używa aplikacja systemu Azure 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>5.12.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>

Uwaga

Jeśli używasz środowiska Spring Boot 2.x, pamiętaj, aby ustawić spring-cloud-azure-dependencies wersję na 4.18.0. Aby uzyskać więcej informacji na temat wersji używanej dla tego modelu BOM, zobacz Która wersja platformy Spring Cloud platformy Azure powinna być używana.

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 bootstrap.properties zawiera następujący wiersz:

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

CONFIG_STORE_CONNECTION_STRINGjest zmienną środowiskową z parametry połączenia do magazynu konfiguracji aplikacja systemu Azure. Dostęp do parametry połączenia można uzyskać przy użyciu następującego polecenia:

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

Domyślnie, jeśli nie ustawiono żadnych konfiguracji, konfiguracje rozpoczynające się od /application/ są ładowane z domyślną etykietą, chyba że ustawiono profil (No Label) Spring, w tym przypadku domyślna etykieta to Profil Spring. Ponieważ magazyn jest pusty, nie są ładowane żadne konfiguracje, ale źródło właściwości konfiguracji aplikacja systemu Azure jest nadal generowane.

Źródło właściwości o nazwie /application/https://<name-of-your-store>.azconfig.io/ jest tworzone zawierające właściwości tego magazynu. 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 magazynach, ładowanie wszystkich magazynów powoduje załadowanie konfiguracji magazynów o najwyższym priorytcie. Ostatni wygrywa. Ten proces przedstawiono w poniższym przykładzie:

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

W tym przykładzie, jeśli zarówno pierwszy, jak i drugi magazyn mają taką samą konfigurację, konfiguracja w drugim magazynie ma najwyższy priorytet, a ostatni wygrywa.

Uwaga

Możesz użyć aplikacja systemu Azure ustawień konfiguracji, takich jak dowolna inna konfiguracja platformy 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

Konfiguracje są ładowane przez ich klucz i etykietę. Domyślnie są ładowane konfiguracje rozpoczynające się od klucza /application/ . Domyślna etykieta to ${spring.profiles.active}. Jeśli ${spring.profiles.active} nie zostanie ustawiona, konfiguracje z etykietą null zostaną załadowane. Etykieta null jest wyświetlana w (No Label) witrynie Azure Portal.

Konfiguracje ładowane można skonfigurować, wybierając różne filtry kluczy i etykiet, jak pokazano w poniższym przykładzie:

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 Pasuje do nazw abc kluczy 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 Dopasuj etykietę 1.0.0 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 musisz zacząć od null, filtr etykiety musi być otoczony pojedynczymi cudzysłowami, jak pokazano w poniższym przykładzie:

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.

Profile spring

Domyślnie spring.profiles.active jest ustawiana jako domyślna label-filter dla wszystkich wybranych konfiguracji. Tę funkcję można zastąpić przy użyciu polecenia label-filter. Profile spring można używać w programie label-filter przy użyciu metody ${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-filterpliku wszystkie konfiguracje z etykietą null są ładowane, a następnie wszystkie konfiguracje pasujące do profilów spring. Profile spring mają priorytet null nad konfiguracjami, ponieważ są one na końcu.

W drugim label-filterciągu ciąg _local jest dołączany na końcu profilów Spring, ale tylko do ostatniego profilu Spring.

Wyłączone magazyny

Za pomocą konfiguracji spring.cloud.azure.appconfiguration.enabledmożna wyłączyć ładowanie dla wszystkich magazynów konfiguracji. spring.cloud.azure.appconfiguration.stores[0].enabled Dzięki konfiguracji można wyłączyć pojedynczy magazyn.

Oprócz wyłączania magazynów można skonfigurować magazyny do wyłączenia, jeśli nie zostaną załadowane. W przypadku tej konfiguracji użyj polecenia spring.cloud.azure.appconfiguration.stores[0].fail-fast. Gdy fail-fast jest wyłączona przez ustawienie go na falsewartość , RuntimeException powoduje wyłączenie magazynu aplikacji bez ładowanych konfiguracji. Jeśli magazyn konfiguracji jest wyłączony podczas uruchamiania, nie jest sprawdzany pod kątem zmian po odświeżeniu. Ponadto nie ma próby załadowania wartości z niej, jeśli konfiguracje zostaną zaktualizowane.

Jeśli podczas sprawdzania odświeżania lub podczas próby ponownego załadowania konfiguracji wystąpi błąd RuntimeException , próba odświeżenia zakończy się i zostanie ponowiona po zakończeniu refresh-interval próby.

Uwierzytelnianie

Biblioteka obsługuje wszystkie formy tożsamości obsługiwane przez bibliotekę tożsamości platformy Azure. Uwierzytelnianie można wykonać za pomocą konfiguracji dla parametry połączenia i tożsamości zarządzanej.

Connection string

Uwierzytelnianie za pomocą parametry połączenia jest najprostszą formą konfiguracji. 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ć spring.cloud.azure.appconfiguration.stores[0].connection-string właściwość na parametry połączenia. Zdecydowanie zalecamy ustawienie parametry połączenia w lokalnym pliku konfiguracji na wartość symbolu zastępczego mapowania na zmienną środowiskową. Takie podejście pozwala uniknąć dodawania parametry połączenia do kontroli źródła.

Konfiguracja platformy Azure spring Cloud

Konfigurację platformy Azure platformy Spring Cloud można użyć 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 wartości DefaultAzureCredential do uwierzytelniania. Metoda DefaultAzureCredential używa następujących metod do uwierzytelniania:

  • Poświadczenia środowiska
  • Poświadczenia tożsamości zarządzanej
  • Poświadczenia interfejsu wiersza polecenia dla deweloperów platformy Azure
  • Poświadczenia intelliJ
  • Poświadczenia interfejsu wiersza polecenia platformy Azure
  • Poświadczenia programu Azure PowerShell

Aby odczytywać konfiguracje, musisz przypisać tożsamość, taką jak tożsamość przypisana przez system. To przypisanie 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 metody do modyfikowania magazynów, które używają innej metody.

Replikacja geograficzna

Biblioteka obsługuje funkcję replikacji geograficznej aplikacja systemu Azure 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 geolokalizacji, możesz zaktualizować każde wdrożenie aplikacji w lokalizacji, aby połączyć się z repliką bliżej tej lokalizacji, co pomaga zminimalizować opóźnienie sieci 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.

Przejście w tryb failover może wystąpić, jeśli biblioteka obserwuje 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).

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 interfejsu wiersza polecenia platformy Azure do utworzenia repliki w regionie Wschodnie stany USA 2:

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

Korzystanie z repliki magazynu konfiguracji

Po utworzeniu repliki możesz jej użyć w aplikacji. Podobnie jak magazyn pochodzenia, możesz nawiązać połączenie z repliką przy użyciu identyfikatora Microsoft Entra ID lub parametry połączenia.

Aby nawiązać połączenie z repliką przy użyciu identyfikatora Entra firmy Microsoft, musisz wyświetlić listę endpoints wystąpień magazynu konfiguracji, jak pokazano w poniższym przykładzie:

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

Możesz wyświetlić dowolną liczbę punktów końcowych, ile masz replik. Biblioteka próbuje nawiązać połączenie z punktami końcowymi w kolejności, w której są wymienione. Jeśli biblioteka nie może nawiązać połączenia z repliką, podejmie próbę następnego z listy. Po upływie czasu biblioteka próbuje ponownie nawiązać połączenie z preferowanymi punktami końcowymi.

Wartości klucza

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

Symbole zastępcze

Biblioteka obsługuje konfiguracje z symbolami ${}zastępczymi środowiska stylu. W przypadku odwoływania się do klucza konfiguracji aplikacja systemu Azure z symbolem zastępczym 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.

JSON

Konfiguracje, które mają typ application/json zawartości, są przetwarzane jako obiekty JSON. Ta funkcja umożliwia mapowania jednej konfiguracji na złożony obiekt wewnątrz @ConfigurationPropertiesobiektu . 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 mapuje na następujący kod:

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

    private Map<String, Color> colors;

}

Odwołania do usługi Key Vault

aplikacja systemu Azure Configuration i jego biblioteki obsługują odwoływanie się do wpisów tajnych przechowywanych w usłudze Key Vault. W usłudze App Configuration można tworzyć klucze z wartościami mapowymi na wpisy tajne przechowywane w usłudze Key Vault. Wpisy tajne są bezpiecznie przechowywane w usłudze Key Vault, ale mogą być dostępne w taki sam sposób jak każda inna konfiguracja po załadowaniu.

Aplikacja używa dostawcy klienta do pobierania odwołań usługi Key Vault, podobnie jak w przypadku innych kluczy przechowywanych w usłudze App Configuration. Ponieważ klient rozpoznaje klucze jako odwołania do usługi Key Vault, ma unikatowy typ zawartości, a klient nawiązuje połączenie z usługą Key Vault w celu pobrania ich wartości.

Uwaga

Usługa Key Vault zezwala tylko na pobieranie wpisów tajnych pojedynczo, więc każde odwołanie do usługi Key Vault przechowywane w usłudze App Configuration powoduje ściąganie w usłudze 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 Tworzenie>dokumentacji usługi Key Vault. Następnie możesz wybrać wpis tajny do odwołania 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 identyfikator wpisu tajnego można utworzyć za pomocą interfejsu wiersza polecenia platformy Azure. Identyfikatory wpisów tajnych wymagają tylko formatu {vault}/{collection}/{name}/{version?} , w którym sekcja wersji jest opcjonalna.

Korzystanie z odwołań usługi Key Vault

Konfigurację platformy Azure platformy Spring Cloud można użyć 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.

Rozwiązywanie problemów z wpisami tajnymi usługi Key Vault

Biblioteka App Configuration udostępnia metodę lokalnego rozpoznawania wpisów tajnych, które nie mają skojarzonego z nimi magazynu kluczy. To rozwiązanie odbywa się za pośrednictwem .KeyVaultSecretProvider Element KeyVaultSecretProvider jest wywoływany, gdy element TokenCredential nie jest podany dla odwołania do usługi Key Vault. Podany jest identyfikator URI odwołania do usługi Key Vault, a zwracana wartość staje się wartością wpisu tajnego.

Ostrzeżenie

Użycie KeyVaultSecretProvider zastępowania automatycznego używania tożsamości zarządzanej przypisanej przez system. Aby użyć obu tych elementów, należy użyć KeyVaultCredentialProvider identyfikatorów URI, które wymagają rozwiązania, i zwrócić null je.

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 flagi funkcji.

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

Flagi funkcji można włączyć przy użyciu filtrów klawiszy/etykiet. Domyślnie jest przypisywana etykieta null widoczna jako (No Label), . Flagi funkcji ładowane można skonfigurować, 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

Flagi funkcji

Flagi funkcji składają się z dwóch części: nazwy i listy filtrów funkcji, które są używane do włączania funkcji. Flagi funkcji mogą mieć stan logiczny włączone/wyłączone lub mogą mieć listę filtrów funkcji. Flagi funkcji oceniają filtry funkcji do momentu, gdy jeden z nich zwróci truewartość . 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 flagi funkcji

Biblioteka zarządzania funkcjami obsługuje konfigurację aplikacja systemu Azure wraz z application.yml lub bootstrap.yml jako źródła flag funkcji. Oto przykład formatu używanego do konfigurowania flag funkcji w pliku 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

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

  • feature-t jest ustawiona na falsewartość . To ustawienie zawsze zwraca wartość flagi funkcji.
  • feature-u jest używany z filtrami funkcji. Te filtry są definiowane w ramach enabled-for właściwości . 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. Ten filtr funkcji można przekazać do użycia jako konfigurację. W tym przykładzie parametr TimeWindowFilterprzechodzi w godzinach 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 udostępnia FeatureManager informacje umożliwiające określenie, czy flaga funkcji jest włączona. FeatureManager Zapewnia asynchroniczny sposób sprawdzania stanu flagi.

spring-cloud-azure-feature-management-web, wraz z dostarczaniem FeatureManagerelementu , zawiera FeatureManagerSnapshotelement , który buforuje stan wcześniej ocenianych flag funkcji w obiekcie , @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 elementem @Bean , który może być @Autowired lub wstrzykiwany do @Component obiektów typu. 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

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

Jeśli nie skonfigurowano zarządzania funkcjami lub flaga funkcji nie istnieje, isEnabled zawsze zwraca wartość false. Jeśli istniejąca flaga funkcji jest skonfigurowana z nieznanym filtrem funkcji, FilterNotFoundException zostanie zgłoszony element . To zachowanie można zmienić, aby powrócićfalse, konfigurując fail-fast wartość .false W poniższej tabeli opisano fail-fast:

Nazwa/nazwisko opis Wymagani 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.

Bramka funkcji

Za pomocą biblioteki sieci Web zarządzania funkcjami 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.

Wyłączona 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. To zachowanie można zastąpić, implementując DisabledFeaturesHandlermetodę , jak pokazano w poniższym przykładzie:

@Component
public class MyDisabledFeaturesHandler implements DisabledFeaturesHandler {

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

}
Routing

Niektóre trasy mogą uwidaczniać możliwości aplikacji, które są bramowane 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 nie są dodawane automatycznie, ale można je skonfigurować w obiekcie @Configuration.

AlwaysOnFilter

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

Filtr procentowy

Za każdym razem, gdy użytkownik wysyła żądanie, ocena PercentageFilter może zwrócić inny wynik. Tę niespójność można obejść przy użyciu FeatureManagementSnapshotelementu , który buforuje wynik flagi funkcji dla użytkownika. Ta funkcja gwarantuje, że użytkownik ma spójne środowisko, nawet jeśli będzie musiał ponownie wysłać żądanie.

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

TimeWindowFilter

Ten filtr zapewnia możliwość włączenia funkcji na podstawie przedziału czasu. Jeśli określisz tylko Endwartość , funkcja jest uwzględniana do tej pory. Jeśli określisz tylko Startwartość , funkcja jest uwzględniana 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-v:
    enabled-for:
    - name: TimeWindowFilter
      parameters:
        Start: "Wed, 01 May 2019 13:59:59 GMT",
        End: "Mon, 01 July 2019 00:00:00 GMT"

TargetFilter

Ten filtr zapewnia możliwość włączenia funkcji dla odbiorców docelowych. Aby uzyskać szczegółowe wyjaśnienie określania wartości docelowej, zobacz sekcję określania wartości docelowej. 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 uwzględnionych procentach dowolnego wdrożenia grupy.
  • Użytkownik należy do domyślnego procentu wdrożenia.
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

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ą filtru funkcji, wywoływana evaluate jest metoda . Jeśli evaluate funkcja zwraca truewartość , oznacza to, że funkcja powinna być włączona. Jeśli zwraca falsewartość , kontynuuje ocenianie filtrów funkcji do momentu, gdy jeden zwróci truewartość . Jeśli wszystkie filtry zwracają falsewartość , funkcja jest wyłączona.

Filtry funkcji są definiowane jako Spring Beans, dlatego są zdefiniowane jako @Component lub zdefiniowane w elemecie @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. FeatureFilterEvaluationContextma właściwość parameters, która jest .HashMap<String, Object>

Określanie celu

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 wyrażenie zgody 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 wyprzedzony do 100 procent, a funkcja jest całkowicie wdrażana.

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

Określanie wartości docelowej w aplikacji

Przykładowa aplikacja internetowa korzystająca z filtru funkcji określania wartości docelowej jest dostępna w przykładowym projekcie.

Aby rozpocząć korzystanie z TargetingFilter elementu w aplikacji, należy dodać go jako podobny do @Bean dowolnego innego filtru funkcji. TargetingFilter program korzysta z innego @Bean elementu, który ma zostać dodany do aplikacji TargetingContextAccessor. Umożliwia TargetingContextAccessor zdefiniowanie bieżącego TargetingContext elementu do definiowania bieżącego identyfikatora użytkownika i grup, jak pokazano w poniższym przykładzie:

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

}

Opcje oceny określania wartości docelowej

Dostępne są opcje dostosowywania sposobu określania wartości docelowej w danym TargetingFilterobiekcie . 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 odświeżania konfiguracji dla konfiguracji umożliwia ściąganie najnowszych wartości ze sklepu App Configuration store lub sklepów bez konieczności ponownego uruchamiania aplikacji.

Aby włączyć odświeżanie, należy włączyć monitorowanie wraz z wyzwalaczami monitorowania. Wyzwalacz monitorowania to klucz z opcjonalną etykietą, która jest sprawdzana 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 element ETag wyzwalacza monitorowania, powoduje odświeżenie, takie jak zmiana typu zawartości.

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

Aby wyzwolić odświeżanie konfiguracji, zmień wartość klucza w magazynie konfiguracji. Następnie zaktualizuj jeden z kluczy zegarka do nowej wartości. Ta zmiana wyzwala tworzenie dziennika. Na przykład zmiana wartości wyzwalaczy następującego komunikatu /application/config.message dziennika:

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

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

Uwaga

Domyślnie @ConfigurationProperties w tym zakresie znajdują się adnotacje fasoli.

Odświeżanie oparte na ścią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 upływie interwału odświeżania wszystkie wyzwalacze są zaewidencjonowane w danym magazynie pod kątem zmian. Każda zmiana klucza powoduje wyzwolenie odświeżania. Ponieważ biblioteki integrują się z systemem odświeżania Spring, wszystkie odświeżenia ponownie ładują wszystkie konfiguracje ze wszystkich magazynó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 sodpowiednio , , mh, i d 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 wysyłania tego zdarzenia są żądania do punktów końcowych w obiekcie @RestController.

Ręcznie

W aplikacjach korzystających tylko spring-cloud-azure-appconfiguration-configz programu , takich jak aplikacje konsolowe, można ręcznie wyzwolić odświeżanie, wywołując AppConfigurationRefreshmetodę "s refreshConfiguration ". AppConfigurationRefresh@Bean to element, który można wstrzyknąć do dowolnego @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 konfiguracji aplikacja systemu Azure.

Odświeżanie oparte na wypychanie

Możesz skonfigurować bibliotekę spring-cloud-azure-appconfiguration-config-web do odbierania powiadomień wypychanych z magazynu konfiguracji aplikacja systemu Azure 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ę siłownika spring jako zależność, można uwidocznić punkty końcowe odświeżania usługi 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 wygasa interwał odświeżania, więc pozostały interwał odświeżania nie jest czekany przed następnym sprawdzeniem odświeżania. Właściwość appconfiguration-refresh-bus wysyła powiadomienie do połączonej usługi obsługi komunikatów, takiej jak Azure Service Bus, w celu powiadomienia wszystkich wystąpień aplikacji o odświeżeniu. W obu przypadkach nie wygasa ona całkowicie w interwale odświeżania, ale jest wyłączona przez niewielką ilość roztrzasku. To zakłócenia zapewnia, że każde wystąpienie aplikacji nie próbuje odświeżyć w tym samym czasie.

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

Oprócz uwidaczniania punktów końcowych odświeżania do zabezpieczeń dodano wymagany parametr zapytania. Domyślnie nie ustawiono nazwy ani wartości tokenu, ale ustawienie jednej z nich jest wymagane w celu użycia 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ć element webhook, otwórz magazyn konfiguracji aplikacja systemu Azure i otwórz pozycję 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.

Potwierdź, że wybór wysyła powiadomienie instalatora 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 aplikacja systemu 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. W poniższej refresh-interval tabeli opisano właściwość:

Nazwa/nazwisko opis Wymagani 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 aplikacja systemu Azure Configuration nie może określić, kiedy są aktualizowane.

Ponieważ usługa Azure Key Vault przechowuje parę kluczy publicznych i prywatnych certyfikatu jako wpisu tajnego, aplikacja może pobrać dowolny certyfikat jako odwołanie do usługi 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 flagi funkcji

Jeśli flagi funkcji i monitorowanie są włączone, domyślnie interwał odświeżania flag funkcji jest ustawiony na 30 sekund. Po upływie interwału odświeżania wszystkie flagi funkcji są sprawdzane w danym magazynie pod kątem zmian. Każda zmiana klucza powoduje wyzwolenie odświeżania. Ponieważ biblioteki integrują się z systemem odświeżania Spring, wszystkie odświeżenia ponownie ładują wszystkie konfiguracje ze wszystkich magazynó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 sodpowiednio , , mh, i d 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 konfiguracji aplikacja systemu Azure jest w dobrej kondycji. 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 spowodowało kod błędu innego niż 200. Ten stan może być spowodowany problemami od poświadczeń wygasających do problemu z usługą. Biblioteka klienta automatycznie ponawia próbę nawiązania połączenia z magazynem w następnym interwale 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 jest wyłączony w pliku konfiguracji lub konfiguracja lub konfiguracje nie można załadować 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 nawiązywania połączenia z usługą aplikacja systemu Azure 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 setup(ConfigurationClientBuilder builder, String endpoint);
}

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

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

Uwaga

Wartości ConfigurationClientBuilder i SecretClientBuilder są już skonfigurowane do użycia w przypadku przekazania do elementu customize. Wszelkie zmiany klientów, w tym poświadczenia i zasady ponawiania prób, zastępują te, które już istnieją.

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

}