Introduction à Netflix Archaius avec Spring Cloud

Introduction à Netflix Archaius avec Spring Cloud

1. Vue d'ensemble

NetflixArchaius est une puissante bibliothèque de gestion de configuration.

En termes simples, il s’agit d’un framework qui peut être utilisé pour rassembler des propriétés de configuration à partir de nombreuses sources différentes, en leur offrant un accès rapide et sécurisé.

De plus, la bibliothèque permet aux propriétés de changer de manière dynamique lors de l'exécution, permettant ainsi au système d'obtenir ces variations sans avoir à redémarrer l'application.

Dans ce didacticiel d'introduction, nous allons mettre en place une configuration Spring Cloud Archaius simple, nous expliquerons ce qui se passe sous le capot, et enfin, nous verrons comment Spring permet d'étendre la configuration de base.

2. Netflix Archaius Caractéristiques

Comme nous le savons, Spring Boot fournit déjà des instruments pour gérer lesexternalized configurations, alors pourquoi s'embêter à mettre en place un mécanisme différent?

Eh bien,Archaius offers some handy and interesting features that aren’t contemplated by any other configuration framework. Certains de ses points clés sont:

  • Propriétés dynamiques et typées

  • Un mécanisme de rappel invoqué sur des mutations de propriété

  • Implémentations prêtes à l'emploi de sources de configuration dynamiques telles que les URL, JDBC et Amazon DynamoDB

  • Un MBean JMX accessible par Spring Boot Actuator ou JConsole pour inspecter et manipuler les propriétés

  • Validation dynamique des propriétés

Ces avantages peuvent être bénéfiques dans de nombreux scénarios.

Spring Cloud a donc travaillé sur une bibliothèque permettant de configurer facilement un ‘Spring Environment Bridge’ afin qu’Archaius puisse lire les propriétés à partir de Spring Environment.

3. Les dépendances

Ajoutons lespring-cloud-starter-netflix-archaius à notre application, cela ajoutera toutes les dépendances nécessaires à notre projet.

En option, nous pouvons également ajouterspring-cloud-netflix à notre sectiondependencyManagement et nous fier à sa spécification des versions des artefacts:


    
        org.springframework.cloud
        spring-cloud-starter-netflix-archaius
    



    
        
            org.springframework.cloud
            spring-cloud-netflix
            2.0.1.RELEASE
            pom
            import
        
    

Remarque: nous pouvons consulter Maven Central pour vérifier que nous utilisons la dernière version desstarter library.

4. Usage

Once we add the required dependency, we’ll be able to access the properties managed by the framework:

DynamicStringProperty dynamicProperty
  = DynamicPropertyFactory.getInstance()
  .getStringProperty("example.archaius.property", "default value");

String propertyCurrentValue = dynamicProperty.get();

Travaillons sur un court exemple pour voir comment cela est disponible dès la sortie de la boîte.

4.1. Exemple rapide

By default, it manages dynamically all the properties defined in a file named config.properties in the application’s classpath.

Alors ajoutons-le à notre dossier de ressources avec des propriétés arbitraires:

#config.properties
example.archaius.properties.one=one FROM:config.properties

Nous aurons maintenant besoin d'un moyen de vérifier les valeurs des propriétés à tout moment. Dans ce cas, nous allons créer unRestController qui récupère les valeurs sous forme de réponse JSON:

@RestController
public class ConfigPropertiesController {

    private DynamicStringProperty propertyOneWithDynamic
      = DynamicPropertyFactory.getInstance()
      .getStringProperty("example.archaius.properties.one", "not found!");

    @GetMapping("/property-from-dynamic-management")
    public String getPropertyValue() {
    return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get();
    }
}

Essayons-le. Nous pouvons envoyer une requête à ce point de terminaison, et le service récupérera les valeurs stockées dansconfig.properties  comme prévu.

Pas grand chose jusqu'à présent, non? OK, continuons et modifions les valeurs de la propriété dans le fichier classpath, sans redémarrer le service. Par conséquent, au bout d’une minute environ, un appel au système d'extrémité devrait extraire les nouvelles valeurs. Assez cool, non?

Ensuite, nous essaierons de comprendre ce qui se passe sous le capot.

5. Comment ça marche?

Tout d'abord, essayons de comprendre la situation dans son ensemble.

Archaius est une extension desApache’s Commons Configuration library, ajoutant quelques fonctionnalités intéressantes comme un framework d'interrogation pour les sources dynamiques, avec un haut débit et une implémentation thread-safe.

La bibliothèquespring-cloud-netflix-archaius entre alors en jeu, fusionnant toutes les différentes sources de propriétés, et configurant automatiquement les outils Archaius avec ces sources.

5.1. La bibliothèque Netflix Archaius

Il définit une configuration composite, une collection de diverses configurations obtenues à partir de différentes sources.

En outre, certaines de ces sources de configuration peuvent prendre en charge l’interrogation des modifications au moment de l’exécution. Archaius fournit des interfaces et des implémentations prédéfinies pour configurer ces types de sources.

La collection de sources est hiérarchisée de sorte que si une propriété est présente dans plusieurs configurations, la valeur finale sera celle de l'emplacement le plus haut.

Enfin, unConfigurationManager gère le contexte de configuration et de déploiement à l'échelle du système. Il peut installer la configuration composite finale ou récupérer la configuration installée pour modification.

5.2. Prise en charge de Spring Cloud

La tâche principale de la bibliothèque Spring Cloud Archaius est de fusionner toutes les différentes sources de configuration en tant queConcurrentCompositeConfiguration et de l'installer à l'aide duConfigurationManager.

L'ordre de priorité dans lequel la bibliothèque définit les sources est le suivant:

  1. Tout bean Apache Common ConfigurationAbstractConfiguration défini dans le contexte

  2. Toutes les sources définies dans lesAutowired SpringConfigurableEnvironment

  3. Les sources par défaut d'Archaius, que nous avons vu dans l'exemple ci-dessus

  4. SourcesSystemConfiguration etEnvironmentConfiguration d'Apache

Une autre fonctionnalité utile fournie par cette bibliothèque Spring Cloud est la définition d'un actionneurEndpoint t pour surveiller et interagir avec les propriétés. Son utilisation sort du cadre de ce tutoriel.

6. Adapter et étendre la configuration d'Archaius

Maintenant que nous comprenons mieux le fonctionnement d'Archaius, nous sommes en mesure d'analyser comment adapter la configuration à notre application ou comment étendre les fonctionnalités à l'aide de nos sources de configuration.

6.1. Propriétés de configuration prises en charge par Archaius

Si nous voulons qu'Archaius prenne en compte d'autres fichiers de configuration similaires à celui deconfig.properties, nous pouvons définir la propriété système dearchaius.configurationSource.additionalUrls.

La valeur est analysée dans une liste d'URL séparées par une virgule. Par exemple, nous pouvons ajouter cette propriété système lors du lancement de l'application:

-Darchaius.configurationSource.additionalUrls=
  "classpath:other-dir/extra.properties,
  file:///home/user/other-extra.properties"

Archaius lira d'abord le fichierconfig.properties, puis les autres, dans l'ordre spécifié. De ce fait, les propriétés définies dans ces derniers fichiers auront la priorité sur les précédentes.

Il existe quelques autres propriétés système que nous pouvons utiliser pour configurer divers aspects de la configuration par défaut d'Archaius:

  • archaius.configurationSource.defaultFileName: le nom du fichier de configuration par défaut dans le chemin de classe

  • archaius.fixedDelayPollingScheduler.initialDelayMills: délai initial avant la lecture de la source de configuration

  • archaius.fixedDelayPollingScheduler.delayMills: délai entre deux lectures de la source; la valeur par défaut est 1 minute

6.2. Ajout de sources de configuration supplémentaires avec Spring

Comment pourrions-nous ajouter une source de configuration différente à gérer par la structure décrite? Et comment pourrions-nous gérer des propriétés dynamiques avec une priorité supérieure à celles définies dans l'environnement Spring?

En revoyant ce que nous avons mentionné dans la section 4.2, nous pouvons nous rendre compte que les configurations les plus élevées dans la configuration composite définie par Spring sont les beansAbstractConfiguration définis dans le contexte.

Ainsi,all we need to do is add an implementation of this Apache’s abstract class to our Spring Context using some of the functionality provided by Archaius, and the Spring’s autoconfiguration will spontaneously add it to the managed configuration properties.

Pour simplifier les choses, nous allons voir un exemple dans lequel nous configurons un fichier de propriétés similaire auxconfig.properties par défaut, mais avec la différence d'avoir une priorité plus élevée que le reste des propriétés de l'environnement et de l'application Spring:

@Bean
public AbstractConfiguration addApplicationPropertiesSource() {
    URL configPropertyURL = (new ClassPathResource("other-config.properties")).getURL();
    PolledConfigurationSource source = new URLConfigurationSource(configPropertyURL);
    return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
}

Heureusement pour nous, il contemple plusieurs sources de configuration que nous pouvons configurer presque sans effort. Leur configuration n’entre pas dans le cadre de ce didacticiel d’introduction.

7. Conclusion

Pour résumer, nous avons découvert Archaius et certaines des fonctionnalités intéressantes qu'il propose pour tirer parti de la gestion de la configuration.

Nous avons également vu comment la bibliothèque d'autoconfiguration Spring Cloud entre en jeu, nous permettant d'utiliser l'API de cette bibliothèque de manière pratique.

Une fois de plus, nous pouvons retrouver tous les exemples présentés dans ce tutoriel et d'autres dans nosGithub repo.