Introductie tot Netflix Archaius met Spring Cloud

1. Overzicht

Netflix Archaius is een krachtige bibliotheek voor configuratiebeheer.

Simpel gezegd, het is een raamwerk dat kan worden gebruikt om configuratie-eigenschappen uit veel verschillende bronnen te verzamelen en snelle, threadveilige toegang hiertoe biedt.

Bovendien laat de bibliotheek eigenschappen dynamisch veranderen tijdens runtime, waardoor het systeem deze variaties kan krijgen zonder de applicatie opnieuw te hoeven starten.

In deze inleidende tutorial stellen we een eenvoudige Spring Cloud Archaius-configuratie op, leggen we uit wat er onder de motorkap gebeurt en tot slot zullen we zien hoe Spring het mogelijk maakt de basisopstelling uit te breiden.

2. Netflix Archaius-functies

Zoals we weten, biedt Spring Boot al instrumenten om extern gemaakte configuraties te beheren, dus waarom zou je een ander mechanisme opzetten?

Goed, Archaius biedt een aantal handige en interessante functies die door geen enkel ander configuratieframework worden overwogen. Enkele van de belangrijkste punten zijn:

  • Dynamische en getypte eigenschappen
  • Een callback-mechanisme dat wordt aangeroepen bij eigenschapmutaties
  • Gebruiksklare implementaties van dynamische configuratiebronnen zoals URL's, JDBC en Amazon DynamoDB
  • Een JMX MBean die toegankelijk is voor Spring Boot Actuator of JConsole om de eigenschappen te inspecteren en te manipuleren
  • Validatie van dynamische eigenschappen

Deze voordelen kunnen in veel scenario's voordelig zijn.

Daarom heeft Spring Cloud gewerkt aan een bibliotheek die het mogelijk maakt om eenvoudig een ‘Spring Environment Bridge 'te configureren zodat Archaius eigenschappen uit de Spring Environment kan lezen.

3. Afhankelijkheden

Laten we de spring-cloud-starter-netflix-archaius aan onze applicatie, zal het alle noodzakelijke afhankelijkheden aan ons project toevoegen.

Optioneel kunnen we ook toevoegen lente-cloud-netflix naar onze afhankelijkheidsbeheer sectie en vertrouw op de specificatie van de versies van de artefacten:

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

Opmerking: we kunnen Maven Central controleren om te verifiëren dat we de nieuwste versie van de startersbibliotheek gebruiken.

4. Gebruik

Zodra we de vereiste afhankelijkheid hebben toegevoegd, hebben we toegang tot de eigenschappen die door het framework worden beheerd:

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

Laten we aan een kort voorbeeld werken om te zien hoe dit out-of-the-box beschikbaar is.

4.1. Snel voorbeeld

Standaard beheert het dynamisch alle eigenschappen die zijn gedefinieerd in een bestand met de naam config.properties in het klassenpad van de toepassing.

Dus laten we het toevoegen aan onze bronnenmap met enkele willekeurige eigenschappen:

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

Nu hebben we een manier nodig om de waarden van de eigenschappen op elk specifiek moment te controleren. In dit geval maken we een RestController die de waarden ophaalt als een JSON-antwoord:

@RestController openbare klasse ConfigPropertiesController {privé DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance () .getStringProperty ("baeldung.archaius.properties.one", "niet gevonden!"); @GetMapping ("/ property-from-dynamic-management") public String getPropertyValue () {retourneer propertyOneWithDynamic.getName () + ":" + propertyOneWithDynamic.get (); }}

Laten we het uitproberen. We kunnen een verzoek naar dit eindpunt sturen en de service haalt de waarden op die zijn opgeslagen in config.properties zoals verwacht.

Tot nu toe geen probleem, toch? Oké, laten we doorgaan en de waarden van de eigenschap in het classpath-bestand wijzigen, zonder de service opnieuw te starten. Als gevolg hiervan zou na ongeveer een minuut een aanroep naar het eindpunt de nieuwe waarden moeten ophalen. Best cool, is het niet?

Vervolgens zullen we proberen te begrijpen wat er onder de motorkap gebeurt.

5. Hoe werkt het?

Laten we allereerst proberen het grote geheel te begrijpen.

Archaius is een uitbreiding van de Apache's Commons-configuratiebibliotheek en voegt een aantal leuke functies toe, zoals een polling-framework voor dynamische bronnen, met een hoge doorvoer en threadveilige implementatie.

De spring-cloud-netflix-archaius bibliotheek komt dan in het spel, waarbij alle verschillende eigendomsbronnen worden samengevoegd en de Archaius-tools automatisch met deze bronnen worden geconfigureerd.

5.1. De Netflix Archaius-bibliotheek

Het werkt met het definiëren van een samengestelde configuratie, een verzameling van verschillende configuraties die uit verschillende bronnen zijn verkregen.

Bovendien kunnen sommige van die configuratiebronnen ondersteuning bieden voor het ondervragen van wijzigingen tijdens runtime. Archaius biedt interfaces en enkele voorgedefinieerde implementaties om dit soort bronnen te configureren.

De verzameling bronnen is hiërarchisch ingedeeld, zodat als een eigenschap in meerdere configuraties aanwezig is, de uiteindelijke waarde de waarde in de bovenste sleuf is.

Eindelijk een Configuratiemanager behandelt de systeembrede configuratie- en implementatiecontext. Het kan de definitieve samengestelde configuratie installeren of de geïnstalleerde ophalen voor wijziging.

5.2. Spring Cloud-ondersteuning

De belangrijkste taak van de Spring Cloud Archaius-bibliotheek is om alle verschillende configuratiebronnen samen te voegen tot een ConcurrentCompositeConfiguration en installeer het met behulp van de Configuratiemanager.

De rangorde waarin de bibliotheek de bronnen definieert, is:

  1. Elke algemene Apache-configuratie Abstracte Configuratie bean gedefinieerd in de context
  2. Alle bronnen die zijn gedefinieerd in het Met automatische bedrading Voorjaar Configureerbare omgeving
  3. De standaard Archaius-bronnen, die we in het bovenstaande voorbeeld hebben gezien
  4. Apache's Systeem configuratie en Omgeving Configuratie bronnen

Een andere handige functie die deze Spring Cloud-bibliotheek biedt, is de definitie van een actuator Eindpunt om de eigenschappen te bewaken en ermee te communiceren. Het gebruik ervan valt buiten het bestek van deze tutorial.

6. Aanpassen en uitbreiden van de Archaius-configuratie

Nu we een beter begrip hebben van hoe Archaius werkt, zijn we in staat om te analyseren hoe we de configuratie kunnen aanpassen aan onze applicatie, of hoe we de functionaliteit kunnen uitbreiden met behulp van onze configuratiebronnen.

6.1. Door Archaius ondersteunde configuratie-eigenschappen

Als we willen dat Archaius rekening houdt met andere configuratiebestanden vergelijkbaar met het config.properties een, kunnen we de archaius.configurationSource.additionalUrls systeemeigenschap.

De waarde wordt geparseerd in een lijst met URL's gescheiden door een komma, dus we kunnen deze systeemeigenschap bijvoorbeeld toevoegen wanneer we de toepassing starten:

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

Archaius zal het config.properties bestand eerst, en dan de andere, in de opgegeven volgorde. Hierdoor hebben de eigenschappen die in de laatstgenoemde bestanden zijn gedefinieerd voorrang op de eerdere.

Er zijn een aantal andere systeemeigenschappen die we kunnen gebruiken om verschillende aspecten van de Archaius-standaardconfiguratie te configureren:

  • archaius.configurationSource.defaultFileName: de standaard naam van het configuratiebestand in het klassenpad
  • archaius.fixedDelayPollingScheduler.initialDelayMills: initiële vertraging voordat de configuratiebron wordt gelezen
  • archaius.fixedDelayPollingScheduler.delayMills: vertraging tussen twee keer lezen van de bron; de standaardwaarde is 1 minuut

6.2. Extra configuratiebronnen toevoegen met Spring

Hoe kunnen we een andere configuratiebron toevoegen om te beheren door het beschreven raamwerk? En hoe kunnen we dynamische eigenschappen beheren met een hogere prioriteit dan degene die zijn gedefinieerd in de Spring-omgeving?

Als we kijken naar wat we in sectie 4.2 hebben genoemd, kunnen we ons realiseren dat de hoogste configuraties in de samengestelde configuratie die door Spring is gedefinieerd, de Abstracte Configuratie bonen gedefinieerd in de context.

Dus, het enige wat we hoeven te doen is een implementatie van de abstracte klasse van deze Apache aan onze Spring Context toevoegen met behulp van een deel van de functionaliteit die door Archaius wordt geboden, en de autoconfiguratie van de Spring zal het spontaan toevoegen aan de beheerde configuratie-eigenschappen.

Om het simpel te houden, zien we een voorbeeld waarin we een eigenschappenbestand configureren dat lijkt op het standaardbestand config.properties maar met het verschil dat ze een hogere prioriteit hebben dan de rest van de Spring-omgeving en applicatie-eigenschappen:

@Bean openbare AbstractConfiguration addApplicationPropertiesSource () {URL configPropertyURL = (nieuwe ClassPathResource ("other-config.properties")). GetURL (); PolledConfigurationSource source = nieuwe URLConfigurationSource (configPropertyURL); retourneer nieuwe DynamicConfiguration (bron, nieuwe FixedDelayPollingScheduler ()); }

Gelukkig voor ons, het overweegt verschillende configuratiebronnen die we met bijna geen moeite kunnen instellen. Hun configuratie valt buiten het bestek van deze inleidende tutorial.

7. Conclusie

Samenvattend, we hebben geleerd over Archaius en enkele van de coole functies die het biedt om te profiteren van configuratiebeheer.

We hebben ook gezien hoe de autoconfiguratiebibliotheek van Spring Cloud in het spel komt, waardoor we de API van deze bibliotheek gemakkelijk kunnen gebruiken.

Nogmaals, we kunnen alle voorbeelden vinden die in deze tutorial worden getoond en andere in onze Github-repository.