Patroon Extern configuratiearchief

Azure App Configuration
Azure Blob Storage

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 scenario dat in de cloud wordt gehost, is dit doorgaans een cloudopslagservice of toegewezen configuratieservice, maar kan dit 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 de toegang van gebruikers autoriseren 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.

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 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 het opslaan van cacheconfiguratiegegevens kan helpen bij het oplossen van tijdelijke connectiviteitsproblemen met het externe configuratiearchief tijdens de runtime van de toepassing, wordt het probleem meestal niet opgelost als het externe archief uitvalt wanneer de toepassing voor het eerst wordt gestart. Zorg ervoor dat de implementatiepijplijn van uw toepassing de laatst bekende set configuratiewaarden in een configuratiebestand kan bieden als een terugval 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.

Workloadontwerp

Een architect moet evalueren hoe het patroon Extern configuratiearchief kan worden gebruikt in het ontwerp van hun workload om de doelstellingen en principes te verhelpen die worden behandeld in de pijlers van het Azure Well-Architected Framework. Voorbeeld:

Pijler Hoe dit patroon ondersteuning biedt voor pijlerdoelen
Operational Excellence helpt bij het leveren van workloadkwaliteit via gestandaardiseerde processen en teamcohesie. Deze scheiding van toepassingsconfiguratie van toepassingscode ondersteunt omgevingsspecifieke configuratie en past versiebeheer toe op configuratiewaarden. Externe configuratiearchieven zijn ook een algemene plaats voor het beheren van functievlagmen om veilige implementatieprocedures mogelijk te maken.

- OE:10 Automation-ontwerp
- Veilige implementatieprocedures voor OE:11

Net als bij elke ontwerpbeslissing moet u rekening houden met eventuele compromissen ten opzichte van de doelstellingen van de andere pijlers die met dit patroon kunnen worden geïntroduceerd.

Voorbeeld van aangepaste back-upopslag

In een gehoste Microsoft Azure-toepassing is het gebruik van Azure Storage een mogelijke keuze voor het extern opslaan van configuratiegegevens. 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 abstraheren van Azure Blob Storage en het beschikbaar maken van uw instellingen in uw toepassingen, waaronder het controleren op updates tijdens runtime en het aanpakken van hoe u hierop kunt reageren.

In het volgende voorbeeld ziet u hoe een simplistisch configuratiearchief kan worden weergegeven via Blob Storage om configuratiegegevens op te slaan en weer te geven. Een BlobSettingsStore klasse kan Blob Storage abstraheren 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 in het configuratiearchief en bevat een versienummer dat kan worden gebruikt om te detecteren of configuratie-instellingen onlangs zijn gewijzigd. Een BlobSettingsStore klasse kan de ETag eigenschap van de blob gebruiken om versiebeheer te implementeren. De ETag eigenschap wordt automatisch bijgewerkt telkens wanneer een blob wordt geschreven.

In deze eenvoudige afbeelding worden alle configuratie-instellingen als tekenreekswaarden weergegeven in plaats van getypte waarden.

Een ExternalConfigurationManager klasse kan vervolgens een wrapper rond een BlobSettingsStore exemplaar leveren. Een toepassing kan deze klasse gebruiken om configuratiegegevens op te halen. Deze klasse kan iets als Microsoft Reactive Extensions gebruiken om wijzigingen in de configuratie te publiceren terwijl het systeem wordt uitgevoerd. Het is ook verantwoordelijk voor het implementeren van het cache-aside-patroon voor instellingen om extra tolerantie en prestaties te bieden.

Het gebruik kan er ongeveer als volgt uitzien.

static void Main(string[] args)
{
    // Start monitoring configuration changes.
    ExternalConfiguration.Instance.StartMonitor();

    // Get a setting.
    var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
    …
}

Configuratie van Azure-app gebruiken

Hoewel het bouwen van een aangepast configuratiearchief in sommige situaties nodig is, kunnen veel toepassingen in plaats daarvan Azure-app Configuratie gebruiken. Azure-app Configuration ondersteunt sleutel-waardeparen die kunnen worden genaamruimted. De sleutels worden getypt en worden afzonderlijk geversied. Azure-app Configuration ondersteunt ook momentopnamen van een bepaald tijdstip van de configuratie, zodat u eenvoudig kunt controleren of zelfs kunt terugkeren naar eerdere configuratiewaarden. Configuratiewaarden kunnen worden geëxporteerd, zodat een kopie van de configuratie kan worden verzonden met uw toepassing als de service onbereikbaar is wanneer de toepassing wordt gestart.

Clientbibliotheken

Veel van deze functies worden weergegeven via clientbibliotheken die kunnen worden geïntegreerd met de toepassingsruntime om het ophalen en opslaan van cachewaarden mogelijk te maken, waarden bij wijzigingen te vernieuwen en zelfs tijdelijke storingen van App Configuration Service te verwerken.

Runtime Clientbibliotheek Opmerkingen 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 Spring Framework-toegang via ConfigurationProperties Snelstartgids
Python azure.appconfiguration Biedt een AzureAppConfigurationClient Snelstartgids
JavaScript/Node.js @azure/app-configuratie Biedt een AppConfigurationClient Snelstartgids

Naast clientbibliotheken zijn er ook een Azure-app GitHub-actie configuratiesynchronisatie en Azure-app Configuratie pull & Azure-app Configuratiepush azure DevOps-taken om configuratiestappen in uw buildproces te integreren.

Volgende stappen