Prise en charge de la configuration des applications
Cet article décrit la bibliothèque Spring Cloud Azure App Configuration. Cette bibliothèque charge les configurations et les indicateurs de fonctionnalité à partir du service Azure App Configuration. La bibliothèque génère des PropertySource
abstractions pour correspondre aux abstractions déjà générées par l’environnement Spring, telles que les variables d’environnement, les configurations de ligne de commande, les fichiers de configuration locaux, etc.
Spring est un framework d’application open source développé par VMware qui fournit une approche simplifiée et modulaire pour créer des applications Java. Azure Spring Cloud est un projet open source qui fournit une intégration de Spring fluide aux services Azure.
Prérequis
- Un abonnement Azure - En créer un gratuitement
- Kit de développement Java (JDK) version 8 ou ultérieure.
- Apache Maven
- Azure CLI
Configurer votre magasin App Configuration
Utilisez la commande suivante pour créer votre magasin Azure App Configuration :
az appconfig create \
--resource-group <your-resource-group> \
--name <name-of-your-new-store> \
--sku Standard
Cette commande crée un magasin de configuration vide. Vous pouvez charger vos configurations à l’aide de la commande d’importation suivante :
az appconfig kv import \
--name <name-of-your-new-store> \
--source file \
--path <location-of-your-properties-file> \
--format properties \
--prefix /application/
Vérifiez vos configurations avant de les charger. Vous pouvez charger des fichiers YAML en modifiant le format en YAML. Le champ de préfixe est important, car il s’agit du préfixe par défaut chargé par la bibliothèque cliente.
Utilisation de la bibliothèque
Pour utiliser la fonctionnalité dans une application, vous pouvez la générer en tant qu’application Spring Boot. Le moyen le plus pratique d’ajouter la dépendance est avec le démarrage com.azure.spring:spring-cloud-azure-starter-appconfiguration-config
Spring Boot . L’exemple suivant pom.xml fichier utilise 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>5.18.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>
Remarque
Si vous utilisez Spring Boot 2.x, veillez à définir la spring-cloud-azure-dependencies
version 4.19.0
sur .
Pour plus d’informations sur la version utilisée pour ce boM, consultez La version de Spring Cloud Azure à utiliser.
L’exemple suivant montre une application Spring Boot de base à l’aide d’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);
}
}
Pour cet exemple, le fichier bootstrap.properties contient la ligne suivante :
spring.cloud.azure.appconfiguration.stores[0].connection-string=${CONFIG_STORE_CONNECTION_STRING}
CONFIG_STORE_CONNECTION_STRING
est une variable d’environnement avec le chaîne de connexion à votre Magasin Azure App Configuration. Vous pouvez accéder à votre chaîne de connexion à l’aide de la commande suivante :
az appconfig credential list --name <name-of-your-store>
Par défaut, si aucune configuration n’est définie, les configurations commençant /application/
par sont chargées avec une étiquette par défaut, (No Label)
sauf si un profil Spring est défini, auquel cas l’étiquette par défaut est votre profil Spring. Étant donné que le magasin est vide, aucune configuration n’est chargée, mais la source de propriété Azure App Configuration est toujours générée.
Une source de propriété nommée /application/https://<name-of-your-store>.azconfig.io/
est créée contenant les propriétés de ce magasin. L’étiquette utilisée dans la requête est ajoutée à la fin du nom. Si aucune étiquette n’est définie, le caractère \0
est présent sous la forme d’un espace vide.
Configuration du chargement
La bibliothèque prend en charge le chargement d’un ou plusieurs magasins App Configuration. Dans le cas où une clé est dupliquée sur plusieurs magasins, le chargement de tous les magasins entraîne le chargement de la configuration des magasins de priorité la plus élevée. La dernière victoire. Ce processus est illustré dans l’exemple suivant :
spring.cloud.azure.appconfiguration.stores[0].connection-string=[first-store-connection-string]
spring.cloud.azure.appconfiguration.stores[1].connection-string=[second-store-connection-string]
Dans l’exemple, si les deux magasins ont la même configuration, la configuration du deuxième magasin a la priorité la plus élevée et la dernière gagne.
Remarque
Vous pouvez utiliser les paramètres Azure App Configuration comme n’importe quelle autre configuration Spring. Pour plus d’informations, consultez Les fonctionnalités principales de la documentation Spring Boot ou du guide de démarrage rapide : Créer une application Spring Java avec Azure App Configuration.
Sélection de configurations
Les configurations sont chargées par leur clé et leur étiquette. Par défaut, les configurations qui commencent par la clé /application/
sont chargées. L’étiquette par défaut est ${spring.profiles.active}
. Si ${spring.profiles.active}
ce n’est pas le cas, les configurations avec l’étiquette null
sont chargées. L’étiquette null
apparaît comme (No Label)
dans la Portail Azure.
Vous pouvez configurer les configurations chargées en sélectionnant différents filtres de clé et d’étiquette, comme illustré dans l’exemple suivant :
spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter=[my-key]
spring.cloud.azure.appconfiguration.stores[0].selects[0].label-filter=[my-label]
La key-filter
propriété prend en charge les filtres suivants :
Filtre de clé | Résultat |
---|---|
* |
Correspond à n’importe quelle clé. |
abc |
Correspond à une clé nommée abc . |
abc* |
Correspond aux noms de clés qui commencent par abc . |
abc,xyz |
Correspond aux noms de clés abc ou xyz . Limité à cinq valeurs séparées par des virgules. |
La label-filter
propriété prend en charge les filtres suivants :
Étiquette | Description |
---|---|
* |
Correspond à n’importe quelle étiquette, y compris \0 . |
\0 |
Correspond aux null étiquettes, qui apparaissent comme (No Label) dans le Portail Azure. |
1.0.0 |
Correspond exactement à l’étiquette 1.0.0 . |
1.0.* |
Correspond aux étiquettes qui commencent par 1.0.* . |
,1.0.0 |
Correspond aux étiquettes null et 1.0.0 . Limité à cinq valeurs séparées par des virgules. |
Si vous utilisez YAML avec des filtres d’étiquette et que vous devez commencer null
par , le filtre d’étiquette doit être entouré de guillemets simples, comme illustré dans l’exemple suivant :
spring:
cloud:
azure:
appconfiguration:
stores:
- selects:
- label-filter: ',1.0.0'
Remarque
Vous ne pouvez pas les combiner *
,
dans les filtres. Dans ce cas, vous devez utiliser une valeur de sélection supplémentaire.
Profils de Spring
Par défaut, spring.profiles.active
est défini comme valeur par défaut label-filter
pour toutes les configurations sélectionnées. Vous pouvez remplacer cette fonctionnalité à l’aide label-filter
de . Vous pouvez utiliser les profils Spring dans l’utilisation label-filter
${spring.profiles.active}
, comme illustré dans l’exemple suivant :
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
Dans le premier label-filter
, toutes les configurations avec l’étiquette null
sont chargées, suivies de toutes les configurations correspondant aux profils Spring. Les profils Spring ont la priorité sur les null
configurations, car ils sont à la fin.
Dans la seconde label-filter
, la chaîne _local
est ajoutée à la fin des profils Spring, mais uniquement au dernier Spring Profile.
Magasins désactivés
À l’aide de la configuration spring.cloud.azure.appconfiguration.enabled
, vous pouvez désactiver le chargement pour tous les magasins de configuration. Avec la spring.cloud.azure.appconfiguration.stores[0].enabled
configuration, vous pouvez désactiver un magasin individuel.
Outre la désactivation des magasins, vous pouvez configurer les magasins à désactiver s’ils ne parviennent pas à se charger. Pour cette configuration, utilisez spring.cloud.azure.appconfiguration.stores[0].fail-fast
. Lorsqu’il fail-fast
false
est désactivé en le définissant sur , un RuntimeException
résultat dans le magasin d’applications est désactivé sans aucune configuration de son chargement. Si un magasin de configuration est désactivé au démarrage, il n’est pas vérifié pour les modifications lors de l’actualisation. En outre, il n’existe aucune tentative de chargement des valeurs à partir de celle-ci si les configurations sont mises à jour.
Si une erreur se produit RuntimeException
lors d’une vérification de l’actualisation ou lors de la tentative de rechargement des configurations, la tentative d’actualisation se termine et est retentée après la refresh-interval
réussite.
Authentification
La bibliothèque prend en charge toutes les formes d’identité prises en charge par la bibliothèque d’identités Azure. Vous pouvez effectuer l’authentification par le biais de la configuration des chaîne de connexion et de l’identité managée.
Chaîne de connexion
L’authentification via chaîne de connexion est le formulaire le plus simple à configurer. Vous pouvez accéder aux chaîne de connexion d’un magasin à l’aide de la commande suivante :
az appconfig credential list --name <name-of-your-store>
Vous pouvez ensuite définir la spring.cloud.azure.appconfiguration.stores[0].connection-string
propriété sur la chaîne de connexion. Nous vous recommandons vivement de définir la chaîne de connexion dans le fichier de configuration local sur une valeur d’espace réservé qui est mappée à une variable d’environnement. Cette approche vous permet d’éviter d’ajouter les chaîne de connexion au contrôle de code source.
Configuration d’Azure Spring Cloud
Vous pouvez utiliser la configuration d’Azure Spring Cloud pour configurer la bibliothèque. Vous pouvez utiliser les propriétés suivantes pour configurer la bibliothèque :
spring.cloud.azure.appconfiguration.stores[0].endpoint= <URI-of-your-configuration-store>
Quand seul le point de terminaison est défini, la bibliothèque cliente utilise DefaultAzureCredential pour s’authentifier. Les DefaultAzureCredential
méthodes suivantes sont utilisées pour s’authentifier :
- Informations d’identification de l’environnement
- Informations d’identification de l’identité managée
- Informations d’identification de l’interface CLI pour développeurs Azure
- Informations d’identification IntelliJ
- Informations d’identification d’Azure CLI
- Informations d’identification Azure PowerShell
Vous devez attribuer une identité telle qu’une identité affectée par le système pour lire les configurations. Vous pouvez créer cette affectation à l’aide de la commande suivante :
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>
Remarque
Vous ne pouvez définir qu’une seule méthode d’authentification par point de terminaison : chaîne de connexion, identité affectée par l’utilisateur ou informations d’identification de jeton. Si vous avez besoin de combiner et de faire correspondre, vous pouvez utiliser ConfigurationClientCustomizer
pour modifier des magasins qui utilisent une autre méthode.
Géoréplication
La bibliothèque prend en charge la fonctionnalité de géoréplication d’Azure App Configuration. Cette fonctionnalité vous permet de répliquer vos données vers d’autres emplacements. Cette fonctionnalité est utile pour la haute disponibilité et la récupération d’urgence.
Chaque réplica que vous créez a un point de terminaison dédié. Si votre application réside dans plusieurs géolocalisations, vous pouvez mettre à jour chaque déploiement de votre application dans un emplacement pour vous connecter au réplica le plus proche de cet emplacement, ce qui permet de réduire la latence réseau entre votre application et App Configuration. Étant donné que chaque réplica a son quota de requêtes distinct, cette configuration permet également l’extensibilité de votre application alors qu’elle augmente vers un service distribué multirégion.
Le basculement peut se produire si la bibliothèque observe l’une des conditions suivantes :
- Reçoit des réponses avec le code d’état non disponible du service (HTTP 500 ou version ultérieure) à partir d’un point de terminaison.
- Rencontre des problèmes de connectivité réseau.
- Les requêtes sont limitées (code d’état HTTP 429)
Création d’un magasin de configuration avec géoréplication
Pour créer un réplica de votre magasin de configuration, vous pouvez utiliser Azure CLI ou le Portail Azure. L’exemple suivant utilise Azure CLI pour créer un réplica dans la région USA Est 2 :
az appconfig replica create --location --name --store-name [--resource-group]
Utilisation du réplica du magasin de configuration
Une fois que vous avez créé un réplica, vous pouvez l’utiliser dans votre application. Comme le magasin d’origines, vous pouvez vous connecter à votre réplica à l’aide de l’ID Microsoft Entra ou d’un chaîne de connexion.
Pour utiliser l’ID Microsoft Entra pour vous connecter à votre réplica, vous devez répertorier les endpoints
instances de votre magasin de configuration, comme indiqué dans l’exemple suivant :
spring.cloud.azure.appconfiguration.stores[0].endpoints[0]=[your primary store endpoint]
spring.cloud.azure.appconfiguration.stores[0].endpoints[1]=[your replica store endpoint]
Vous pouvez répertorier autant de points de terminaison que vous avez des réplicas. La bibliothèque tente de se connecter aux points de terminaison dans l’ordre dans lequel elles sont répertoriées. Si la bibliothèque ne parvient pas à se connecter à un réplica, elle essaie la suivante dans la liste. Une fois la période écoulée, la bibliothèque tente de se reconnecter aux points de terminaison préférés.
Valeurs de clé
Azure App Configuration prend en charge plusieurs types de valeurs clés, dont certaines ont des fonctionnalités spéciales intégrées. Azure App Configuration prend en charge le type de contenu JSON, les espaces réservés Spring et les références Key Vault.
Espaces réservés
La bibliothèque prend en charge les configurations avec ${}
des espaces réservés d’environnement de style. Lorsque vous référencez une clé Azure App Configuration avec un espace réservé, supprimez les préfixes de la référence. Par exemple, /application/config.message
est référencé en tant que ${config.message}
.
Remarque
Le préfixe en cours de suppression correspond à la valeur spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter
.
JSON
Les configurations qui ont un type application/json
de contenu sont traitées en tant qu’objets JSON. Cette fonctionnalité vous permet de mapper une configuration à un objet complexe à l’intérieur d’un @ConfigurationProperties
. Par exemple, considérez la clé /application/config.colors
JSON avec la valeur suivante :
{
"Red": {
"value": [255, 0, 0]
},
"Blue": {
"value": [0, 255, 0]
},
"Green": {
"value": [0, 0, 255]
}
}
Cette clé est mappée au code suivant :
@ConfigurationProperties(prefix = "config")
public class MyConfigurations {
private Map<String, Color> colors;
}
Références Key Vault
Azure App Configuration et ses bibliothèques prennent en charge le référencement des secrets stockés dans Key Vault. Dans App Configuration, vous pouvez créer des clés avec des valeurs qui mappent aux secrets stockés dans un coffre de clés. Les secrets sont stockés en toute sécurité dans Key Vault, mais sont accessibles de la même façon que toute autre configuration après son chargement.
Votre application utilise le fournisseur client pour récupérer les références Key Vault, tout comme pour les autres clés stockées dans App Configuration. Étant donné que le client reconnaît les clés en tant que références Key Vault, ils ont un type de contenu unique et le client se connecte à Key Vault pour récupérer leurs valeurs pour vous.
Remarque
Key Vault autorise uniquement la récupération des secrets un par un, de sorte que chaque référence Key Vault stockée dans App Configuration entraîne une extraction sur Key Vault.
Création de références Key Vault
Vous pouvez créer une référence Key Vault dans le Portail Azure en accédant à l’Explorateur>de configuration pour créer une>référence Key Vault. Vous pouvez ensuite sélectionner un secret à référencer parmi les coffres de clés auquel vous avez accès. Vous pouvez également créer des références De coffre de clés arbitraires à partir de l’onglet Entrée. Dans le Portail Azure, entrez un URI valide.
Vous pouvez également créer une référence Key Vault via Azure CLI à l’aide de la commande suivante :
az appconfig kv set-keyvault \
--name <name-of-your-store> \
--key <key-name> \
--secret-identifier <URI-to-your-secret>
Vous pouvez créer n’importe quel identificateur secret via Azure CLI. Les identificateurs de secret nécessitent simplement le format {vault}/{collection}/{name}/{version?}
dans lequel la section de version est facultative.
Utiliser des références Key Vault
Vous pouvez utiliser la configuration d’Azure Spring Cloud pour configurer la bibliothèque. Vous pouvez utiliser les mêmes informations d’identification que celles utilisées pour vous connecter à App Configuration pour vous connecter à Azure Key Vault.
Résoudre les secrets non-Key Vault
La bibliothèque App Configuration fournit une méthode pour résoudre localement les secrets qui n’ont pas de coffre de clés qui leur sont associés. Cette résolution est effectuée par le biais du KeyVaultSecretProvider
. L’option KeyVaultSecretProvider
est appelée lorsqu’une TokenCredential
référence Key Vault n’est pas fournie. L’URI de la référence Key Vault est fourni et la valeur retournée devient la valeur du secret.
Avertissement
L’utilisation d’un KeyVaultSecretProvider
remplacement remplace l’utilisation automatique de l’identité managée affectée par le système. Pour utiliser les deux, vous devez utiliser KeyVaultCredentialProvider
et retourner null
les URI qui ont besoin de résoudre.
public class MySecretProvider implements KeyVaultSecretProvider {
@Override
public String getSecret(String uri) {
...
}
}
Gestion des fonctionnalités
La gestion des fonctionnalités permet aux applications Spring Boot d’accéder dynamiquement au contenu. La gestion des fonctionnalités a différentes fonctions, telles que les suivantes :
- Indicateurs de fonctionnalité qui peuvent activer ou désactiver le contenu
- Filtres de fonctionnalités pour le ciblage lorsque le contenu est affiché
- Filtres de fonctionnalités personnalisés
- Portes de fonctionnalité pour activer dynamiquement les points de terminaison
Vous pouvez activer les indicateurs de fonctionnalité via la configuration suivante :
spring.cloud.azure.appconfiguration.stores[0].feature-flags.enabled= true
Les indicateurs de fonctionnalité activés sont chargés dans le système de configuration Spring avec le préfixe feature-management
. Vous pouvez également inscrire des indicateurs de fonctionnalité dans le fichier de configuration local. Pour plus d’informations, consultez la section Déclaration de l’indicateur de fonctionnalité.
Le moyen le plus simple d’utiliser la gestion des fonctionnalités consiste à utiliser les bibliothèques et spring-cloud-azure-feature-management-web
les spring-cloud-azure-feature-management
bibliothèques. La différence entre les deux bibliothèques est qu’il spring-cloud-azure-feature-management-web
faut une dépendance aux spring-web
bibliothèques pour spring-webmvc
ajouter d’autres fonctionnalités, telles que des portes de fonctionnalité.
Vous pouvez activer les indicateurs de fonctionnalité à l’aide de filtres clé/étiquette. Par défaut, une null
étiquette, considérée comme (No Label)
affectée, est affectée. Vous pouvez configurer les indicateurs de fonctionnalité chargés en définissant un filtre d’étiquette, comme illustré dans l’exemple suivant :
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
Principes de base de la gestion des fonctionnalités
Indicateurs de fonctionnalité
Les indicateurs de fonctionnalité sont composés de deux parties : un nom et une liste de filtres de fonctionnalités utilisés pour activer la fonctionnalité. Les indicateurs de fonctionnalité peuvent avoir un état booléen activé/désactivé, ou avoir une liste de filtres de fonctionnalités. Les indicateurs de fonctionnalité évaluent les filtres de fonctionnalités jusqu’à ce qu’un retour soit retourné true
. Si aucun filtre de fonctionnalité n’est retourné true
, l’indicateur de fonctionnalité retourne false
.
Filtres de fonctionnalités
Les filtres de fonctionnalités définissent un scénario pour lequel une fonctionnalité doit être activée. Les filtres de fonctionnalités sont évalués de façon synchrone.
La bibliothèque de gestion des fonctionnalités est fournie avec quatre filtres prédéfinis : AlwaysOnFilter, PercentageFilter, TimeWindowFilter et TargetingFilter.
Vous pouvez créer des filtres de fonctionnalités personnalisés. Par exemple, vous pouvez utiliser un filtre de fonctionnalités pour fournir une expérience personnalisée aux clients qui utilisent un navigateur Microsoft Edge. Vous pouvez personnaliser les fonctionnalités de ce filtre de fonctionnalités, par exemple, pour afficher un en-tête spécifique pour l’audience du navigateur Microsoft Edge.
Déclaration d’indicateur de fonctionnalité
La bibliothèque de gestion des fonctionnalités prend en charge Azure App Configuration avec application.yml ou bootstrap.yml en tant que sources pour les indicateurs de fonctionnalité. Voici un exemple du format utilisé pour configurer des indicateurs de fonctionnalité dans un fichier 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
Cet exemple présente les indicateurs de fonctionnalité suivants :
feature-t
est défini surfalse
. Ce paramètre retourne toujours la valeur de l’indicateur de fonctionnalité.feature-u
est utilisé avec des filtres de fonctionnalités. Ces filtres sont définis sous laenabled-for
propriété. Dans ce cas,feature-u
dispose d’un filtre de fonctionnalité appeléRandom
, qui ne nécessite aucune configuration, de sorte que seule la propriété de nom est requise.feature-v
spécifie un filtre de fonctionnalités nomméTimeWindowFilter
. Ce filtre de fonctionnalités peut être transmis aux paramètres à utiliser comme configuration. Dans cet exemple, unTimeWindowFilter
, passe les heures de début et de fin pendant lesquelles la fonctionnalité est active.feature-w
est utilisé pour leAlwaysOnFilter
, qui prend toujours la valeurtrue
. Leevaluate
champ est utilisé pour arrêter l’évaluation des filtres de fonctionnalités et génère le retourfalse
du filtre de fonctionnalités.
Évaluation des indicateurs de fonctionnalité
La spring-cloud-azure-feature-management
bibliothèque fournit FeatureManager
pour déterminer si un indicateur de fonctionnalité est activé. FeatureManager
fournit un moyen asynchrone de vérifier l’état de l’indicateur.
spring-cloud-azure-feature-management-web
, ainsi que fournir FeatureManager
, contient FeatureManagerSnapshot
, qui met en cache l’état des indicateurs de fonctionnalités précédemment évalués dans le @RequestScope
pour garantir que toutes les requêtes retournent la même valeur. En outre, la bibliothèque web fournit @FeatureGate
, qui peut bloquer ou rediriger des requêtes web vers différents points de terminaison.
Vérification d’indicateur de fonctionnalité
FeatureManager
est un @Bean
objet qui peut être @Autowired
ou injecté dans @Component
des objets de type. FeatureManager
a une méthode isEnabled
qui, lorsqu’elle a passé le nom d’un indicateur de fonctionnalité, retourne son état.
@Autowired
FeatureManager featureManager;
if (featureManager.isEnabled("feature-t")) {
// Do Something
}
Remarque
FeatureManger
possède également une version asynchrone appelée isEnabled
isEnabledAsync
.
Si vous n’avez pas configuré la gestion des fonctionnalités ou que l’indicateur de fonctionnalité n’existe pas, isEnabled
retourne false
toujours . Si un indicateur de fonctionnalité existant est configuré avec un filtre de fonctionnalité inconnu, il FilterNotFoundException
est levée. Vous pouvez modifier ce comportement pour revenir false
en configurant fail-fast
sur false
. Le tableau suivant décrit fail-fast
:
Nom | Description | Obligatoire | Par défaut |
---|---|---|---|
spring.cloud.azure.feature.management.fail-fast |
Si une exception se produit, une RuntimeException exception est levée. Si cette propriété est définie false sur , isEnabled retourne false à la place. |
Non | true |
La seule différence entre FeatureManagerSnapshot
et FeatureManager
est la mise en cache des résultats dans le @RequestScope
.
Porte de fonctionnalité
Avec la bibliothèque web de gestion des fonctionnalités, vous pouvez exiger qu’une fonctionnalité donnée soit activée pour exécuter un point de terminaison. Vous pouvez configurer cette exigence à l’aide de l’annotation @FeatureGate
, comme illustré dans l’exemple suivant :
@GetMapping("/featureT")
@FeatureGate(feature = "feature-t")
@ResponseBody
public String featureT() {
...
}
Vous ne pouvez accéder au featureT
point de terminaison que si « feature-t » est activé.
Gestion des actions désactivées
Lorsqu’un point de terminaison est bloqué, car la fonctionnalité spécifiée est désactivée, DisabledFeaturesHandler
est appelée. Par défaut, un HTTP 404 est retourné. Vous pouvez remplacer ce comportement en implémentant DisabledFeaturesHandler
, comme illustré dans l’exemple suivant :
@Component
public class MyDisabledFeaturesHandler implements DisabledFeaturesHandler {
@Override
public HttpServletResponse handleDisabledFeatures(HttpServletRequest request, HttpServletResponse response) {
...
return response;
}
}
Routage
Certains itinéraires peuvent exposer les fonctionnalités d’application qui sont contrôlées par les fonctionnalités. Si une fonctionnalité est désactivée, vous pouvez rediriger ces itinéraires vers un autre point de terminaison, comme illustré dans l’exemple suivant :
@GetMapping("/featureT")
@FeatureGate(feature = "feature-t" fallback= "/oldEndpoint")
@ResponseBody
public String featureT() {
...
}
@GetMapping("/oldEndpoint")
@ResponseBody
public String oldEndpoint() {
...
}
Filtres de fonctionnalités intégrés
Il existe quelques filtres de fonctionnalités fournis avec le spring-cloud-azure-feature-management
package. Ces filtres de fonctionnalités ne sont pas ajoutés automatiquement, mais vous pouvez les configurer dans un @Configuration
.
AlwaysOnFilter
Ce filtre retourne true
toujours . Pour obtenir un exemple d’utilisation, consultez la section déclaration d’indicateur de fonctionnalité.
PercentageFilter
Chaque fois qu’un utilisateur effectue une demande, l’évaluation PercentageFilter
peut retourner un résultat différent. Vous pouvez contourner cette incohérence à l’aide du FeatureManagementSnapshot
, qui met en cache le résultat de l’indicateur de fonctionnalité par utilisateur. Cette fonctionnalité garantit qu’un utilisateur a une expérience cohérente, même s’il doit renvoyer la demande.
feature-management:
feature-v:
enabled-for:
- name: PercentageFilter
parameters:
Value: 50
TimeWindowFilter
Ce filtre permet d’activer une fonctionnalité en fonction d’une fenêtre de temps. Si vous spécifiez uniquement End
, la fonctionnalité est considérée comme activée jusqu’à ce moment. Si vous spécifiez uniquement Start
, la fonctionnalité est considérée sur tous les points après cette heure. Si vous spécifiez les deux, la fonctionnalité est considérée comme valide entre les deux fois.
feature-management:
feature-v:
enabled-for:
- name: TimeWindowFilter
parameters:
Start: "Wed, 01 May 2019 13:59:59 GMT",
End: "Mon, 01 July 2019 00:00:00 GMT"
TargetingFilter
Ce filtre permet d’activer une fonctionnalité pour un public cible. Pour obtenir une explication détaillée du ciblage, consultez la section de la section ciblage. Les paramètres de filtre incluent un objet d’audience qui décrit les utilisateurs, les groupes et un pourcentage par défaut de la base d’utilisateurs qui doit avoir accès à la fonctionnalité. Pour chaque objet de groupe répertorié dans l’audience cible, un pourcentage est requis qui définit le pourcentage des membres de ce groupe ayant accès à la fonctionnalité. Un utilisateur dispose de la fonctionnalité activée dans les cas suivants :
- L’utilisateur est spécifié directement dans la section des utilisateurs.
- L’utilisateur se trouve dans le pourcentage inclus de l’un des déploiements de groupe.
- L’utilisateur tombe dans le pourcentage de déploiement par défaut.
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
Filtres de fonctionnalités personnalisés
La création d’un filtre de fonctionnalités personnalisé permet d’activer les fonctionnalités en fonction des critères que vous définissez. Pour créer un filtre de fonctionnalités personnalisé, vous devez implémenter l’interface FeatureFilter
. FeatureFilter
a une seule méthode evaluate
. Lorsqu’une fonctionnalité spécifie qu’elle peut être activée avec un filtre de fonctionnalités, la evaluate
méthode est appelée. Si evaluate
elle est retournée true
, cela signifie que la fonctionnalité doit être activée. S’il retourne false
, il continue à évaluer les filtres de fonctionnalités jusqu’à ce qu’un retour soit effectué true
. Si tous les filtres retournent false
, la fonctionnalité est désactivée.
Les filtres de fonctionnalités sont définis en tant que Spring Beans, de sorte qu’ils sont définis comme @Component
ou définis dans un @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;
}
}
Filtres de fonctionnalités paramétrables
Certains filtres de fonctionnalités nécessitent des paramètres pour déterminer si une fonctionnalité doit être activée. Par exemple, un filtre de fonctionnalités de navigateur peut activer une fonctionnalité pour un certain ensemble de navigateurs. Vous souhaiterez peut-être qu’une fonctionnalité soit activée pour les navigateurs Microsoft Edge et Chrome, mais pas Firefox. Pour configurer cette situation, vous pouvez concevoir un filtre de fonctionnalités pour attendre des paramètres. Ces paramètres sont spécifiés dans la configuration des fonctionnalités et dans le code, et sont accessibles via le FeatureFilterEvaluationContext
paramètre de evaluate
. FeatureFilterEvaluationContext
a une propriété parameters
, qui est un HashMap<String, Object>
.
Ciblage
Le ciblage est une stratégie de gestion des fonctionnalités qui permet aux développeurs de déployer progressivement de nouvelles fonctionnalités sur leur base d’utilisateurs. La stratégie repose sur le concept de ciblage d’un ensemble d’utilisateurs appelés public cible. Un public est constitué d’utilisateurs, de groupes spécifiques et d’un pourcentage désigné de l’ensemble de la base d’utilisateurs. Les groupes inclus dans le public peuvent être divisés en pourcentages de leurs membres totaux.
Les étapes suivantes illustrent un exemple de déploiement progressif d’une nouvelle fonctionnalité « Bêta » :
- Les utilisateurs individuels Jeff et Alicia ont accès à la version bêta.
- Un autre utilisateur, Mark, demande d’accepter et est inclus.
- Vingt pour cent d’un groupe appelé utilisateurs « Ring1 » sont inclus dans la version Bêta.
- Le nombre d’utilisateurs « Ring1 » inclus dans la version bêta est passé à 100 %.
- Cinq pour cent de la base d’utilisateurs sont inclus dans la version Bêta.
- Le pourcentage de déploiement est passé à 100 % et la fonctionnalité est entièrement déployée.
Cette stratégie de déploiement d’une fonctionnalité est intégrée à la bibliothèque via le filtre de fonctionnalités inclus TargetingFilter
.
Ciblage dans une application
Un exemple d’application web qui utilise le filtre de fonctionnalités de ciblage est disponible dans l’exemple de projet.
Pour commencer à utiliser l’application TargetingFilter
, vous devez l’ajouter comme @Bean
tout autre filtre de fonctionnalité. TargetingFilter
s’appuie sur un autre @Bean
à ajouter à l’application TargetingContextAccessor
. Permet TargetingContextAccessor
de définir le courant TargetingContext
à utiliser pour définir l’ID d’utilisateur et les groupes actuels, comme illustré dans l’exemple suivant :
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);
}
}
Options d’évaluation de ciblage
Les options sont disponibles pour personnaliser la façon dont l’évaluation du ciblage est effectuée dans un ensemble donné TargetingFilter
. Vous pouvez définir un paramètre facultatif, TargetingEvaluationOptions
pendant la TargetingFilter
création.
@Bean
public TargetingFilter targetingFilter(MyTargetingContextAccessor contextAccessor) {
return new TargetingFilter(contextAccessor, new TargetingEvaluationOptions().setIgnoreCase(true));
}
Actualisation de la configuration
L’activation de l’actualisation de la configuration pour vos configurations vous permet d’extraire leurs dernières valeurs à partir de votre magasin Ou magasin App Configuration sans avoir à redémarrer l’application.
Pour activer l’actualisation, vous devez activer la surveillance avec les déclencheurs de surveillance. Un déclencheur d’analyse est une clé avec une étiquette facultative qui recherche les modifications de valeur pour déclencher des mises à jour. La valeur du déclencheur de surveillance peut être n’importe quelle valeur, tant qu’elle change lorsqu’une actualisation est nécessaire.
Remarque
Toute opération qui modifie l’ETag d’un déclencheur de surveillance provoque une actualisation, telle qu’une modification de type de contenu.
spring:
cloud:
azure:
appconfiguration:
stores:
- monitoring:
enabled: true
triggers:
- key: [my-watched-key]
label: [my-watched-label]
Pour déclencher une actualisation de la configuration, modifiez la valeur d’une clé dans votre magasin de configuration. Ensuite, mettez à jour l’une des clés espions vers une nouvelle valeur. Cette modification déclenche la création d’un journal. Par exemple, en modifiant la valeur des /application/config.message
déclencheurs, le message de journal suivant :
INFO 17496 --- [TaskScheduler-1] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [config.message]
Une fois que l’application a généré le journal, elle actualise tous les @Bean
s dans l’étendue d’actualisation.
Remarque
Par défaut, @ConfigurationProperties
les haricots annotés sont inclus dans cette étendue.
Actualisation basée sur l’extraction
Les bibliothèques Spring App Configuration prennent en charge la possibilité de vérifier régulièrement l’intervalle d’actualisation des modifications apportées aux déclencheurs de surveillance. Par défaut, l’intervalle d’actualisation est défini sur 30 secondes. Une fois l’intervalle d’actualisation passé, tous les déclencheurs sont archivés dans le magasin donné pour les modifications. Toute modification apportée à la clé entraîne un déclenchement d’une actualisation. Étant donné que les bibliothèques s’intègrent au système d’actualisation Spring, toutes les actualisations rechargent toutes les configurations de tous les magasins. Vous pouvez définir l’intervalle d’actualisation sur un intervalle de plus de 1 seconde. Les unités prises en charge pour l’intervalle d’actualisation sont s
, m
et h
d
pour les secondes, les minutes, les heures et les jours respectivement. L’exemple suivant définit l’intervalle d’actualisation sur 5 minutes :
spring.cloud.azure.appconfiguration.stores[0].monitoring.refresh-interval= 5m
Automatisé
Lorsque vous utilisez la spring-cloud-azure-appconfiguration-config-web
bibliothèque, l’application recherche automatiquement une actualisation chaque fois qu’une demande servlet se produit, en particulier ServletRequestHandledEvent
. La façon la plus courante d’envoyer cet événement est par des demandes adressées aux points de terminaison dans un @RestController
.
Manuel
Dans les applications qui utilisent uniquement spring-cloud-azure-appconfiguration-config
, telles que les applications console, vous pouvez déclencher manuellement une actualisation en appelant AppConfigurationRefresh
la méthode ' .refreshConfiguration
AppConfigurationRefresh
est un @Bean
que vous pouvez injecter dans n’importe quel @Component
.
En outre, étant donné que la bibliothèque utilise le système de configuration de Spring, le déclenchement d’une actualisation entraîne une actualisation de toutes vos configurations, pas seulement un rechargement des configurations à partir de votre magasin Azure App Configuration.
Actualisation par envoi (push)
Vous pouvez configurer la spring-cloud-azure-appconfiguration-config-web
bibliothèque pour recevoir des notifications Push de votre magasin Azure App Configuration pour actualiser vos valeurs de configuration. Vous pouvez configurer cette configuration via un Web Hook Azure Event Grid, que vous pouvez configurer pour envoyer des notifications de modifications à des clés spécifiées. En ajoutant la bibliothèque Spring Actuator en tant que dépendance, vous pouvez exposer les points de terminaison d’actualisation d’App Configuration. Il existe deux points de terminaison différents : appconfiguration-refresh
et appconfiguration-refresh-bus
. Ces points de terminaison fonctionnent de la même façon que leurs équivalents refresh
et refresh-bus
, où les points de terminaison de configuration d’application expirent l’intervalle d’actualisation au lieu de forcer une actualisation lors de la réception. Vous pouvez toujours utiliser et refresh
refresh-bus
, mais vous ne pouvez pas les connecter directement à Azure Event Grid avec un Web Hook, car ils nécessitent une réponse lors de l’installation.
La propriété expire l’intervalle d’actualisation. L’intervalle appconfiguration-refresh
d’actualisation restant n’est donc pas attendu avant la vérification de l’actualisation suivante. La appconfiguration-refresh-bus
propriété envoie une notification à un service de messagerie connecté, tel qu’Azure Service Bus, pour notifier toutes les instances d’une application à actualiser. Dans les deux cas, il n’expire pas complètement à l’intervalle d’actualisation, mais est désactivé par une petite gigue. Cette gigue garantit que chaque instance de votre application n’essaie pas d’actualiser en même temps.
management.endpoints.web.exposure.include= appconfiguration-refresh, appconfiguration-refresh-bus
En plus d’exposer les points de terminaison d’actualisation, un paramètre de requête requis a été ajouté pour la sécurité. Aucun nom ou valeur de jeton n’est défini par défaut, mais la définition d’un jeton est requise pour utiliser les points de terminaison, comme indiqué dans l’exemple suivant :
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]
Configuration des hooks web
Pour configurer un hook web, ouvrez votre magasin Azure App Configuration et ouvrez Événements à partir du menu de navigation. Ensuite, sélectionnez Abonnement aux événements. Définissez le nom de votre événement et sélectionnez le type de point de terminaison comme Web Hook. Si vous sélectionnez Web Hook, une option de point de terminaison s’affiche. Choisissez Sélectionner un point de terminaison. Votre point de terminaison doit ressembler à l’exemple suivant : https://www.myaplication.com/actuator/appconfiguration-refresh?myTokenName=mySecret
.
Confirmez que la sélection envoie une notification d’installation à l’URI donné et attend une réponse. Si aucune réponse n’est retournée, le programme d’installation échoue. La azure-spring-cloud-appconfiguration-web
configuration de la bibliothèque pour les points de terminaison retourne la réponse correcte si le magasin Azure App Configuration est configuré pour l’application. Cette confirmation peut être envoyée d’une autre manière. Pour plus d’informations sur la remise des hooks web, consultez remise d’événements webhook.
Remarque
Cette validation se produit uniquement lors de la création ou de la modification du point de terminaison.
Nous vous recommandons vivement de configurer des filtres, car sinon, une actualisation est déclenchée après chaque création et modification de clé.
Actualisation forcée du client
Vous pouvez configurer la bibliothèque pour forcer l’actualisation de toutes les configurations à un intervalle d’actualisation. Le tableau suivant décrit la refresh-interval
propriété :
Nom | Description | Obligatoire | Par défaut |
---|---|---|---|
spring.cloud.azure.appconfiguration.refresh-interval |
Durée standard entre les actualisations. Est un Duration . |
Non | null |
L’actualisation avec spring.cloud.azure.appconfiguration.refresh-interval
ne vérifie aucune clé espion configurée. Cette propriété est utilisée pour vous assurer que les secrets Key Vault sont conservés à jour, car Azure App Configuration ne peut pas savoir quand ils sont mis à jour.
Étant donné qu’Azure Key Vault stocke la paire de clés publique et privée d’un certificat en tant que secret, votre application peut récupérer n’importe quel certificat en tant que référence Key Vault dans App Configuration. Étant donné que les certificats doivent faire l’objet d’une rotation périodique, les applications clientes doivent être mises à jour aussi fréquemment, ce qui peut être effectué à l’aide de l’intervalle d’actualisation du client.
Actualisation de l’indicateur de fonctionnalité
Si les indicateurs de fonctionnalité et la surveillance sont tous les deux activés, l’intervalle d’actualisation par défaut pour les indicateurs de fonctionnalité est défini sur 30 secondes. Une fois l’intervalle d’actualisation passé, tous les indicateurs de fonctionnalité sont archivés dans le magasin donné pour les modifications. Toute modification apportée à la clé entraîne un déclenchement d’une actualisation. Étant donné que les bibliothèques s’intègrent au système d’actualisation Spring, toutes les actualisations rechargent toutes les configurations de tous les magasins. Vous pouvez définir l’intervalle d’actualisation sur un intervalle de plus de 1 seconde. Les unités prises en charge pour l’intervalle d’actualisation sont s
, m
et h
d
pour les secondes, les minutes, les heures et les jours respectivement. L’exemple suivant définit l’intervalle d’actualisation sur 5 minutes :
spring.cloud.azure.appconfiguration.stores[0].monitoring.feature-flag-refresh-interval= 5m
Indicateur d’intégrité
La bibliothèque cliente est fournie avec un indicateur d’intégrité qui vérifie si la connexion au magasin Azure App Configuration ou aux magasins est saine. Si elle est activée pour chaque magasin, elle donne l’une des valeurs d’état suivantes :
- UP : la dernière connexion a réussi.
- DOWN - La dernière connexion a entraîné un code d’erreur non-200. Cet état peut être dû à des problèmes allant des informations d’identification arrivant à expiration à un problème de service. La bibliothèque cliente retente automatiquement de se connecter au magasin à l’intervalle d’actualisation suivant.
- NOT LOADED : le magasin de configuration est répertorié dans le fichier de configuration local, mais le magasin de configuration n’a pas été chargé à partir du fichier au démarrage. Le magasin de configurations est désactivé dans le fichier de configuration ou la configuration ou les configurations n’ont pas pu être chargées au démarrage pendant que la
fail-fast
configuration du magasin a été définiefalse
sur .
Vous pouvez activer l’indicateur d’intégrité en définissant management.health.azure-app-configuration.enabled=true
.
Personnalisation du client
La bibliothèque App Configuration utilise le Kit de développement logiciel (SDK) Azure pour Java pour la connexion à Azure App Configuration et Azure Key Vault. Deux interfaces et ConfigurationClientCustomizer
SecretClientCustomizer
, sont fournies pour modifier les clients. Chaque interface a une customize
méthode qui prend dans son générateur respectif ainsi que la String
valeur de l’URI pour lequel le client est configuré, comme indiqué dans les définitions d’interface suivantes :
public interface ConfigurationClientCustomizer {
public void setup(ConfigurationClientBuilder builder, String endpoint);
}
public interface SecretClientCustomizer {
public void setup(SecretClientBuilder builder, String endpoint);
}
Ces interfaces permettent la personnalisation du client HTTP et de ses configurations. L’exemple suivant remplace la valeur par défaut HttpClient
par une autre qui utilise un proxy pour tout le trafic dirigé vers App Configuration et Key Vault.
Remarque
Les ConfigurationClientBuilder
paramètres sont SecretClientBuilder
déjà configurés pour être utilisés lors de leur passage.customize
Toutes les modifications apportées aux clients, y compris les informations d’identification et la stratégie de nouvelle tentative, remplacent celles déjà en place.
Vous pouvez également effectuer cette configuration à l’aide de la configuration d’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();
}
}