Patroon Extern configuratiearchief
Configuratiegegevens vanuit het implementatiepakket voor de toepassing verplaatsen naar een centrale locatie. Dat kan mogelijkheden bieden voor eenvoudiger beheer en controle van configuratiegegevens en voor het delen van configuratiegegevens tussen toepassingen en instanties van toepassingen.
Context en probleem
Het merendeel van de runtime-omgevingen voor toepassingen bevatten configuratiegegevens die zijn opgenomen in bestanden die samen met de toepassing zijn geïmplementeerd. In sommige gevallen is het mogelijk deze bestanden te bewerken om het gedrag van een toepassing te wijzigen nadat deze is geïmplementeerd. Maar vanwege wijzigingen aan de configuratie moet de toepassing opnieuw worden geïmplementeerd, met vaak als gevolg onaanvaardbaar lange uitvaltijden en andere administratieve overhead.
Lokale configuratiebestanden beperken ook de configuratie voor één toepassing, maar soms is het handig om configuratie-instellingen met meerdere toepassingen te delen. Voorbeelden zijn tekenreeksen voor databaseverbindingen, UI-thema-informatie of de URL's van wachtrijen en opslag die door een gerelateerde set toepassingen worden gebruikt.
Het is lastig wijzigingen aan lokale configuraties voor meerdere actieve instanties van de toepassing te beheren, met name in een scenario met hosting in de cloud. Dat kan leiden tot instanties die gebruikmaken van verschillende configuratie-instellingen terwijl de update wordt geïmplementeerd.
Bovendien kunnen voor updates van toepassingen en onderdelen wijzigingen aan de configuratieschema's nodig zijn. Veel configuratiesystemen bieden geen ondersteuning voor verschillende versies van configuratiegegevens.
Oplossing
Bewaar de configuratiegegevens in een externe opslag en zorg voor een interface die snel en efficiënt is in het lezen en bijwerken van configuratie-instellingen. Het type externe opslag is afhankelijk van de hosting- en runtime-omgeving van de toepassing. In een in de cloud gehost scenario is het meestal een cloudopslagservice of toegewezen configuratieservice, maar kan het een gehoste database of een ander aangepast systeem zijn.
De externe opslag die u voor configuratiegegevens kiest, moet een interface hebben die consistente en gemakkelijk te gebruiken toegang biedt. Daarbij moet de informatie in een correct getypte en gestructureerde indeling worden weergegeven. De implementatie moet mogelijk ook gebruikerstoegang machtigen om configuratiegegevens te beveiligen en flexibel genoeg zijn om opslag van meerdere versies van de configuratie toe te staan (zoals ontwikkeling, fasering of productie, inclusief meerdere releaseversies van elke versie).
Veel ingebouwde configuratiesystemen lezen de gegevens wanneer de toepassing wordt opgestart en slaan de gegevens op in het cachegeheugen voor snelle toegang en om de impact op de prestaties van de toepassing zoveel mogelijk te reduceren. Afhankelijk van het gebruikte type externe opslag en de latentie ervan, kan het handig zijn een cachemechanisme binnen het externe configuratiearchief te implementeren. Zie de Caching Guidance (Richtlijnen voor caching) voor meer informatie. De afbeelding biedt een overzicht van het patroon Extern configuratiearchief met optionele lokale cache.

Problemen en overwegingen
Beschouw de volgende punten als u besluit hoe u dit patroon wilt implementeren:
Kies een externe opslag die acceptabele prestaties, maximale beschikbaarheid en robuustheid biedt, en waarvan een back-up kan worden gemaakt als onderdeel van het toepassingsonderhoud en -beheer. In een in de cloud gehoste toepassing is het gebruik van een cloudopslagmechanisme of een toegewezen configuratieplatformservice meestal een goede keuze om aan deze vereisten te voldoen.
Ontwerp het schema van de externe opslag zodanig dat flexibiliteit wordt geboden wat betreft de soorten gegevens die erin kunnen worden opgenomen. Zorg ervoor dat alle configuratievereisten aan bod komen, zoals getypte gegevens, verzamelingen van instellingen, meerdere versies van instellingen en alle andere functies die de toepassingen vereisen. Het schema moeten gemakkelijk kunnen worden uitgebreid om extra instellingen te ondersteunen wanneer de vereisten veranderen.
Houd rekening met de fysieke mogelijkheden van de externe opslag, hoe deze zich verhoudt tot de manier waarop configuratiegegevens worden opgeslagen, en de gevolgen voor de prestaties. Voor het opslaan van een XML-document met configuratiegegevens moet de configuratie-interface of de toepassing het document parseren om afzonderlijke instellingen te kunnen lezen. Dat maakt het bijwerken van een instelling gecompliceerder, hoewel het in de cache opslaan van de instellingen de mindere leesprestaties kan compenseren.
Bepaal hoe de configuratie-interface het beheer van het bereik en de overname van configuratie-instellingen toestaat. Het kan bijvoorbeeld een vereiste zijn om het bereik van de configuratie-instellingen te bepalen op organisatie-, toepassings- en machineniveau. Het schema moet wellicht het delegeren van het toegangsbeheer tot verschillende bereiken ondersteunen en voorkomen of toestaan dat afzonderlijke toepassingen instellingen overschrijven.
Zorg ervoor dat de configuratie-interface de configuratiegegevens in de gewenste indelingen, zoals getypte waarden, verzamelingen, sleutel-/waardeparen of eigenschappenverzamelingen, kan weergeven.
Houd er rekening mee hoe de interface van het configuratiearchief zich gedraagt wanneer instellingen fouten bevatten of wanneer er geen instellingen in de externe opslag aanwezig zijn. Het kan nodig zijn om standaardinstellingen en registratiefouten te retourneren. Neem ook aspecten mee zoals de hoofdlettergevoeligheid van sleutels of namen voor configuratie-instellingen, de opslag en verwerking van binaire gegevens en de manieren waarop null- of lege waarden worden afgehandeld.
Houd rekening met het beveiligen van de configuratiegegevens om alleen toegang te verlenen voor de juiste gebruikers en toepassingen. Dit is meestal een functie van de interface van het configuratiearchief, maar dit is ook nodig om ervoor te zorgen dat de gegevens in de externe opslag niet rechtstreeks zonder de benodigde machtiging kunnen worden geopend. Zorg voor een strikte scheiding tussen de machtigingen voor het lezen en schrijven van configuratiegegevens. U kunt er ook over nadenken of enkele dan wel alle configuratie-instellingen moeten worden versleuteld en hoe dat in de interface van het configuratiearchief moet worden geïmplementeerd.
Centraal opgeslagen configuraties, die het gedrag van toepassingen tijdens runtime veranderen, zijn uitermate belangrijk en moeten worden geïmplementeerd, bijgewerkt en beheerd met behulp van dezelfde mechanismen als bij het implementeren van de toepassingscode. Wijzigingen die invloed kunnen hebben op meer dan één toepassing, moeten bijvoorbeeld worden uitgevoerd met behulp van een volledig geteste en gefaseerde implementatiebenadering om ervoor te zorgen dat de wijziging geschikt is voor alle toepassingen die van deze configuratie gebruikmaken. Als een beheerder een instelling bewerkt om één toepassing bij te werken, kan dat een negatieve invloed hebben op andere toepassingen die dezelfde instelling gebruiken.
Als een toepassing configuratiegegevens in de cache opslaat, moet de toepassing worden gewaarschuwd als de configuratie wordt gewijzigd. Het is wellicht mogelijk een verloopbeleid te implementeren voor configuratiegegevens in de cache zodat deze informatie automatisch regelmatig wordt vernieuwd en eventuele wijzigingen worden opgepakt (en afgehandeld).
Hoewel caching van configuratiegegevens kan helpen bij het oplossen van tijdelijke verbindingsproblemen met het externe configuratie-opslagopslag tijdens de runtime van de toepassing, lost dit het probleem doorgaans niet op als het externe opslag niet beschikbaar is wanneer de toepassing voor het eerst wordt starten. Zorg ervoor dat uw toepassingsimplementatiepijplijn als terugval de laatst bekende set configuratiewaarden in een configuratiebestand kan leveren als uw toepassing geen livewaarden kan ophalen wanneer deze wordt gestart.
Wanneer dit patroon gebruiken
Dit patroon is handig voor:
Configuratie-instellingen die worden gedeeld tussen meerdere toepassingen en instanties van toepassingen, of in situaties waar een standaardconfiguratie voor meerdere toepassingen en instanties van toepassingen moet worden afgedwongen.
Een standaardconfiguratiesysteem dat geen ondersteuning biedt voor alle vereiste configuratie-instellingen, zoals het opslaan van installatiekopieën of complexe gegevenstypen.
Als aanvullend archief voor enkele instellingen voor toepassingen, waarbij toepassingen eventueel enkele of alle centraal opgeslagen instellingen mogen negeren.
Als een manier om het beheer van meerdere toepassingen te vereenvoudigen en eventueel om het gebruik van configuratie-instellingen te bewaken door sommige of alle soorten toegang naar het configuratiearchief te registreren.
Voorbeeld van aangepaste back-store
In een Microsoft Azure gehoste toepassing is het mogelijk om configuratiegegevens extern op te slaan Azure Storage. Dit is een flexibele oplossing die krachtige prestaties biedt en driemaal wordt gerepliceerd met automatische failover voor maximale beschikbaarheid. Azure-tabelopslag biedt een sleutel/waarde-archief met de mogelijkheid om een flexibel schema voor de waarden te gebruiken. Azure Blob-opslag biedt een hiërarchische opslag op basis van een container die elk type gegevens in afzonderlijk benoemde blobs kan bevatten.
Wanneer u dit patroon implementeert, bent u verantwoordelijk voor het abstraheeren van Azure Blob-opslag en het beschikbaar maken van uw instellingen in uw toepassingen, waaronder het controleren op updates tijdens runtime en het reageren hierop.
In het volgende voorbeeld ziet u hoe een eenvoudig configuratie-opslag kan worden ingenomen via Blob Storage om configuratiegegevens op te slaan en weer te geven. Een BlobSettingsStore klasse kan Blob Storage abstraheeren voor het opslaan van configuratiegegevens en implementeert een eenvoudige ISettingsStore interface.
public interface ISettingsStore
{
Task<ETag> GetVersionAsync();
Task<Dictionary<string, string>> FindAllAsync();
}
Deze interface definieert methoden voor het ophalen van configuratie-instellingen die zijn opgeslagen in het configuratieopslag en bevat een versienummer dat kan worden gebruikt om te detecteren of er onlangs configuratie-instellingen zijn gewijzigd. Een BlobSettingsStore klasse kan de eigenschap van de blob gebruiken om ETag versiegebruik te implementeren. De ETag eigenschap wordt automatisch bijgewerkt telkens wanneer een blob wordt geschreven.
In deze eenvoudige afbeelding worden alle configuratie-instellingen standaard als tekenreekswaarden in plaats van getypte waarden getoond.
Een ExternalConfigurationManager klasse kan vervolgens een wrapper rond een exemplaar BlobSettingsStore leveren. Een toepassing kan deze klasse gebruiken om configuratiegegevens op te halen. Deze klasse kan bijvoorbeeld reactieve Microsoft-extensies gebruiken om wijzigingen in de configuratie te publiceren terwijl het systeem wordt uitgevoerd. Het zou ook verantwoordelijk zijn voor het implementeren van het Cache-Aside-patroon voor instellingen om extra tolerantie en prestaties te bieden.
Het gebruik kan er als volgt uitzien.
static void Main(string[] args)
{
// Start monitoring configuration changes.
ExternalConfiguration.Instance.StartMonitor();
// Get a setting.
var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
…
}
Met Azure App Configuration
Hoewel het bouwen van een aangepast configuratie-opslag in sommige situaties noodzakelijk kan zijn, kunnen veel toepassingen in plaats daarvan Azure App Configuration. Azure App Configuration ondersteunt sleutel-waardeparen die kunnen worden opgeslagen in een naamruimte. De sleutels worden getypt en hebben een afzonderlijke versie. Azure App Configuration biedt ook ondersteuning voor momentopnamen van configuraties naar een bepaald tijdstip, zodat u eenvoudig kunt controleren of zelfs terug kunt draaien naar eerdere configuratiewaarden. Configuratiewaarden kunnen zodanig worden geëxporteerd dat een kopie van de configuratie met uw toepassing kan worden meeverplaatst voor het geval de service onbereikbaar is wanneer de toepassing wordt starten.
Clientbibliotheken
Veel van deze functies worden beschikbaar gesteld via clientbibliotheken die kunnen worden geïntegreerd met de runtime van de toepassing om het ophalen en in de caching van waarden mogelijk te maken, waarden bij wijziging te vernieuwen en zelfs tijdelijke uitval van App Configuration Service af te handelen.
| Runtime | Clientbibliotheek | Notities | Snelstart |
|---|---|---|---|
| .NET | Microsoft.Extensions.Configuration.AzureAppConfiguration | Provider voor Microsoft.Extensions.Configuration |
Snelstartgids |
| ASP.NET | Microsoft.Azure.AppConfiguration.AspNetCore | Provider voor Microsoft.Extensions.Configuration |
Snelstartgids |
| Azure Functions in .NET | Microsoft.Extensions.Configuration.AzureAppConfiguration | Wordt gebruikt met Azure Function-extensies ter ondersteuning van configuratie in Startup.cs | Snelstartgids |
| .NET Framework | Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration | Configuratiebouwer voor System.Configuration |
Snelstartgids |
| Java Spring | com.azure.spring > azure-spring-cloud-appconfiguration-config | Ondersteunt Toegang tot Spring Framework via ConfigurationProperties |
Snelstartgids |
| Python | azure.appconfiguration | Biedt een AzureAppConfigurationClient |
Snelstartgids |
| JavaScript/Node.js | @azure/app-configuration | Biedt een AppConfigurationClient |
Snelstartgids |
Naast clientbibliotheken zijn er ook een Azure App Configuration Sync GitHub Action en Azure App Configuration Pull & Azure App Configuration Push Azure DevOps-taken om configuratiestappen in uw buildproces te integreren.
Volgende stappen
- Aanvullende voorbeelden App Configuration bekijken
- Meer informatie over het integreren Azure App Configuration met Kubernetes-implementaties
- Meer informatie over hoe Azure App Configuration ook functievlaggen kan beheren