Einführung in Netflix Archaius mit Spring Cloud

1. Übersicht

Netflix Archaius ist eine leistungsstarke Konfigurationsverwaltungsbibliothek.

Einfach ausgedrückt handelt es sich um ein Framework, mit dem Konfigurationseigenschaften aus vielen verschiedenen Quellen erfasst werden können, um einen schnellen und threadsicheren Zugriff darauf zu ermöglichen.

Darüber hinaus ermöglicht die Bibliothek, dass sich die Eigenschaften zur Laufzeit dynamisch ändern, sodass das System diese Variationen abrufen kann, ohne die Anwendung neu starten zu müssen.

In diesem Einführungs-Tutorial richten wir eine einfache Spring Cloud Archaius-Konfiguration ein, erklären, was unter der Haube passiert, und schließlich sehen wir, wie Spring die Erweiterung der Grundeinstellung ermöglicht.

2. Netflix Archaius-Funktionen

Wie wir wissen, bietet Spring Boot bereits Instrumente zur Verwaltung externer Konfigurationen. Warum also einen anderen Mechanismus einrichten?

Nun, Archaius bietet einige praktische und interessante Funktionen, die von keinem anderen Konfigurationsframework in Betracht gezogen werden . Einige seiner wichtigsten Punkte sind:

  • Dynamische und typisierte Eigenschaften
  • Ein Rückrufmechanismus, der bei Eigenschaftsmutationen aufgerufen wird
  • Gebrauchsfertige Implementierungen dynamischer Konfigurationsquellen wie URLs, JDBC und Amazon DynamoDB
  • Eine JMX-MBean, auf die Spring Boot Actuator oder JConsole zugreifen können, um die Eigenschaften zu überprüfen und zu bearbeiten
  • Validierung dynamischer Eigenschaften

Diese Vorteile können in vielen Szenarien von Vorteil sein.

Aus diesem Grund hat Spring Cloud an einer Bibliothek gearbeitet, mit der eine 'Spring Environment Bridge' einfach konfiguriert werden kann, damit Archaius Eigenschaften aus der Spring Environment lesen kann.

3. Abhängigkeiten

Fügen wir unserer Anwendung den Spring-Cloud-Starter-Netflix-Archaius hinzu, der alle erforderlichen Abhängigkeiten zu unserem Projekt hinzufügt .

Optional können wir unserem Abschnitt dependencyManagement auch Spring-Cloud-Netflix hinzufügen und uns auf die Spezifikation der Versionen der Artefakte verlassen:

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

Hinweis: Wir können Maven Central überprüfen, um sicherzustellen, dass wir die neueste Version der Starterbibliothek verwenden.

4. Verwendung

Sobald wir die erforderliche Abhängigkeit hinzugefügt haben, können wir auf die vom Framework verwalteten Eigenschaften zugreifen :

DynamicStringProperty dynamicProperty = DynamicPropertyFactory.getInstance() .getStringProperty("baeldung.archaius.property", "default value"); String propertyCurrentValue = dynamicProperty.get();

Lassen Sie uns an einem kurzen Beispiel arbeiten, um zu sehen, wie dies sofort verfügbar ist.

4.1. Schnelles Beispiel

Standardmäßig werden alle in einer Datei mit dem Namen config.properties im Klassenpfad der Anwendung definierten Eigenschaften dynamisch verwaltet .

Fügen wir es also mit einigen beliebigen Eigenschaften zu unserem Ressourcenordner hinzu:

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

Jetzt brauchen wir eine Möglichkeit, die Werte der Eigenschaften zu einem bestimmten Zeitpunkt zu überprüfen. In diesem Fall erstellen wir einen RestController , der die Werte als JSON-Antwort abruft :

@RestController public class ConfigPropertiesController { private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance() .getStringProperty("baeldung.archaius.properties.one", "not found!"); @GetMapping("/property-from-dynamic-management") public String getPropertyValue() { return propertyOneWithDynamic.getName() + ": " + propertyOneWithDynamic.get(); } }

Probieren wir es aus. Wir können eine Anfrage an diesen Endpunkt senden, und der Dienst ruft die in config.properties gespeicherten Werte wie erwartet ab.

Bisher keine große Sache, oder? Ok, lassen Sie uns fortfahren und die Werte der Eigenschaft in der Klassenpfaddatei ändern, ohne den Dienst neu zu starten. Daher sollte ein Aufruf des Endpunkts nach etwa einer Minute die neuen Werte abrufen. Ziemlich cool, nicht wahr?

Als nächstes werden wir versuchen zu verstehen, was unter der Haube vor sich geht.

5. Wie funktioniert es?

Lassen Sie uns zunächst versuchen, das Gesamtbild zu verstehen.

Archaius ist eine Erweiterung der Commons-Konfigurationsbibliothek von Apache und bietet einige nützliche Funktionen wie ein Polling-Framework für dynamische Quellen mit hohem Durchsatz und threadsicherer Implementierung.

Anschließend kommt die Spring-Cloud-Netflix-Archaius- Bibliothek ins Spiel, in der alle verschiedenen Eigenschaftsquellen zusammengeführt und die Archaius-Tools automatisch mit diesen Quellen konfiguriert werden.

5.1. Die Netflix Archaius Bibliothek

Es definiert eine zusammengesetzte Konfiguration, eine Sammlung verschiedener Konfigurationen, die aus verschiedenen Quellen stammen.

Darüber hinaus unterstützen einige dieser Konfigurationsquellen möglicherweise die Abfrage zur Laufzeit nach Änderungen. Archaius bietet Schnittstellen und einige vordefinierte Implementierungen, um diese Arten von Quellen zu konfigurieren.

Die Sammlung von Quellen ist hierarchisiert, sodass bei einer Eigenschaft, die in mehreren Konfigurationen vorhanden ist, der endgültige Wert der Wert im obersten Steckplatz ist.

Schließlich verwaltet ein ConfigurationManager den systemweiten Konfigurations- und Bereitstellungskontext. Es kann die endgültige zusammengesetzte Konfiguration installieren oder die installierte zur Änderung abrufen.

5.2. Spring Cloud-Unterstützung

The main task of the Spring Cloud Archaius library is to merge all the different configuration sources as a ConcurrentCompositeConfiguration and install it using the ConfigurationManager.

The order of precedence in which the library defines the sources is:

  1. Any Apache Common Configuration AbstractConfiguration bean defined in the context
  2. All the sources defined in the Autowired Spring ConfigurableEnvironment
  3. The default Archaius sources, which we saw in the example above
  4. Apache's SystemConfiguration and EnvironmentConfiguration sources

Another useful feature this Spring Cloud library provides is the definition of an Actuator Endpoint to monitor and interact with the properties. Its usage is out of the scope of this tutorial.

6. Adapting and Extending the Archaius Configuration

Now that we have a better understanding of how Archaius works, we are in good shape to analyze how to adapt the configuration to our application, or how to extend the functionality using our configuration sources.

6.1. Archaius Supported Configuration Properties

If we want Archaius to take into account other configuration files similar to the config.properties one, we can define the archaius.configurationSource.additionalUrls system property.

The value is parsed to a list of URLs separated by a comma, so, for example, we can add this system property when we launch the application:

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

Archaius will read the config.properties file first, and then the other ones, in the specified order. Because of this, the properties defined in the latter files will have priority over the prior ones.

There are a couple of other system properties we can use to configure various aspects of the Archaius default configuration:

  • archaius.configurationSource.defaultFileName: the default configuration file name in the classpath
  • archaius.fixedDelayPollingScheduler.initialDelayMills: initial delay before reading the configuration source
  • archaius.fixedDelayPollingScheduler.delayMills: delay between two reads of the source; the default value is 1 minute

6.2. Adding Additional Configuration Sources with Spring

How could we add a different Configuration Source to be managed by the described framework? And how could we manage dynamic properties with higher precedence than the ones defined in the Spring Environment?

Reviewing what we mentioned in section 4.2, we can realize that the highest configurations in the Composite Configuration defined by Spring are the AbstractConfiguration beans defined in the context.

Thus, 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.

To keep things simple, we'll see an example where we configure a properties file similar to the default config.properties but with the difference of having a higher precedence than the rest of Spring environment and application properties:

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

Lucky for us, it contemplates several configuration sources that we can set up with almost no effort. Their configuration is out of the scope of this introductory tutorial.

7. Conclusion

Zusammenfassend haben wir Archaius und einige der coolen Funktionen kennengelernt, die es bietet, um das Konfigurationsmanagement zu nutzen.

Außerdem haben wir gesehen, wie die Spring Cloud-Autokonfigurationsbibliothek ins Spiel kommt, sodass wir die API dieser Bibliothek bequem verwenden können.

Wir finden noch einmal alle Beispiele in diesem Tutorial und andere in unserem Github-Repo.