Patroon extern configuratieopslag

Verplaats configuratiegegevens uit het implementatiepakket van de toepassing naar een centrale locatie. Deze aanpak biedt eenvoudiger beheer en controle van configuratiegegevens, zodat configuratiegegevens gedeeld kunnen worden tussen toepassingen en toepassingsexemplaren.

Context en probleem

De meeste runtime-omgevingen van toepassingen bevatten configuratiegegevens in bestanden die u met de toepassing implementeert. In sommige gevallen kunt u deze bestanden bewerken om het gedrag van de toepassing te wijzigen nadat u de toepassing hebt geïmplementeerd. Voor configuratiewijzigingen moet u de toepassing echter opnieuw implementeren. Opnieuw implementeren leidt vaak tot onacceptabele downtime en andere administratieve overhead.

Lokale configuratiebestanden beperken de configuratie ook tot één toepassing. In sommige scenario's wilt u mogelijk configuratie-instellingen delen in meerdere toepassingen. Voorbeelden hiervan zijn databaseverbindingsreeksen, ui-themagegevens en de URL's van wachtrijen en opslag die door een gerelateerde set toepassingen worden gebruikt.

Het beheren van wijzigingen in lokale configuraties in meerdere actieve exemplaren van de toepassing is lastig. Deze uitdaging kan leiden tot exemplaren die verschillende configuratie-instellingen gebruiken tijdens het implementeren van de update.

Updates voor toepassingen en onderdelen vereisen mogelijk ook wijzigingen in configuratieschema's. Veel configuratiesystemen bieden geen ondersteuning voor verschillende versies van configuratiegegevens.

Oplossing

Sla de configuratiegegevens op in externe opslag en geef een interface op die u kunt gebruiken om configuratie-instellingen snel en efficiënt te lezen en bij te werken. Het type externe archief is afhankelijk van de hosting- en runtime-omgeving van de toepassing. In een scenario dat in de cloud wordt gehost, is externe opslag doorgaans een cloudopslagservice of toegewezen configuratieservice. Het kan ook een gehoste database of een ander aangepast systeem zijn.

Het back-uparchief dat u voor configuratiegegevens kiest, moet een interface hebben die consistente en gebruiksvriendelijke toegang biedt. De informatie moet in een correct getypte en gestructureerde indeling worden weergegeven. De implementatie moet mogelijk ook de toegang van gebruikers autoriseren om configuratiegegevens te beveiligen. Het moet mogelijk flexibel genoeg zijn om meerdere versies van de configuratie op te slaan, zoals ontwikkeling, fasering en productie, inclusief meerdere releaseversies van elke configuratie.

Veel ingebouwde configuratiesystemen lezen de gegevens wanneer de toepassing wordt gestart en sla de gegevens vervolgens in het geheugen op om snelle toegang te bieden en de impact op de prestaties van de toepassing te minimaliseren. Afhankelijk van het type back-uparchief dat u gebruikt en de latentie van dit archief, wilt u mogelijk een cachingmechanisme implementeren in het externe configuratiearchief. Zie De richtlijnen voor caching voor meer informatie. Het volgende diagram toont een overzicht van het Externe configuratiewinkelpatroon met een optionele lokale cache.

Een diagram dat een overzicht laat zien van het patroon voor extern configuratiestore met een optionele lokale cache.

Problemen en overwegingen

Houd rekening met de volgende punten wanneer u besluit hoe u dit patroon implementeert:

  • Kies een back-uparchief dat acceptabele prestaties, hoge beschikbaarheid en robuustheid biedt. Zorg ervoor dat u er een back-up van kunt maken in het onderhouds- en beheerproces van uw toepassing. Gebruik in een in de cloud gehoste toepassing een cloudopslagmechanisme of een toegewezen configuratieplatformservice om aan deze vereisten te voldoen.

  • Ontwerp het schema van de ondersteunende opslag om flexibiliteit mogelijk te maken in de soorten informatie die het kan bevatten. Zorg ervoor dat deze mogelijkheden biedt voor alle configuratievereisten, zoals getypte gegevens, verzamelingen instellingen, meerdere versies van instellingen en eventuele andere functies die de toepassingen nodig hebben. Het schema moet eenvoudig kunnen worden uitgebreid om meer instellingen te ondersteunen wanneer de vereisten veranderen.

  • Houd rekening met de fysieke mogelijkheden van het back-uparchief, hoe deze betrekking hebben op de manier waarop configuratie-informatie wordt opgeslagen en wat de gevolgen zijn voor de prestaties. Als u bijvoorbeeld een XML-document met configuratiegegevens opslaat, moet u de configuratie-interface of de toepassing het document parseren om afzonderlijke instellingen te lezen. Het parseren maakt het bijwerken van instellingen ingewikkeld, maar het cachen van de instellingen kan helpen om de tragere leesprestaties te compenseren.

  • Bedenk hoe de configuratie-interface het beheer van het bereik en de overname van configuratie-instellingen toestaat. U moet bijvoorbeeld configuratie-instellingen instellen op organisatie-, toepassings- en machineniveau. De configuratie-interface moet mogelijk de controle over de toegang tot verschillende bereiken delegeren en voorkomen of toestaan dat afzonderlijke toepassingen instellingen overschrijven.

  • Zorg ervoor dat de configuratie-interface de configuratiegegevens beschikbaar kan maken in de vereiste indelingen, zoals getypte waarden, verzamelingen, sleutel-waardeparen en eigenschappentassen.

  • Overweeg hoe de interface voor het configuratiearchief zich gedraagt wanneer instellingen fouten bevatten of niet aanwezig zijn in het backing-archief. Mogelijk moet u de standaardinstellingen en logboekfouten herstellen. Houd ook rekening met de hoofdlettergevoeligheid van configuratie-instellingssleutels of -namen, het opslaan en verwerken van binaire gegevens en het verwerken van null- of lege waarden.

  • Overweeg hoe u de configuratiegegevens beveiligt en alleen toegang geeft tot de juiste gebruikers en toepassingen. De interface voor het configuratiearchief biedt deze functie doorgaans, maar u moet er ook voor zorgen dat gebruikers en toepassingen niet rechtstreeks toegang hebben tot de gegevens in het backingarchief zonder de juiste machtigingen. Zorg voor strikte scheiding tussen de machtigingen die nodig zijn voor het lezen en schrijven van configuratiegegevens. Overweeg ook of u enkele of alle configuratie-instellingen moet versleutelen en hoe u deze versleuteling implementeert in de interface van het configuratiearchief.

    U moet ook auditlogboekregistratie inschakelen om vast te leggen wie configuratiewaarden leest of wijzigt en wanneer deze acties plaatsvinden. Pas dezelfde controlevereisten toe op lokale terugvalkopieën van configuratiegegevens.

  • Scheid niet-gevoelige configuratiewaarden van geheimen. Bewaar routine-instellingen, zoals functievlagmen en eindpunten, in de configuratie-instellingen. Sla geheimen, zoals verbindingsreeksen, API-sleutels, certificaten en wachtwoorden, op in een toegewezen geheimbeheersysteem dat versleuteling en beheerde toegang biedt.

  • Centraal opgeslagen configuraties, die het gedrag van toepassingen tijdens runtime wijzigen, zijn van cruciaal belang. Implementeer, werk ze bij en beheer deze met behulp van dezelfde mechanismen die u gebruikt om toepassingscode te implementeren. U moet bijvoorbeeld wijzigingen uitvoeren die van invloed kunnen zijn op meer dan één toepassing met behulp van een volledig geteste en gefaseerde implementatiebenadering om ervoor te zorgen dat de wijziging past bij alle toepassingen die deze configuratie gebruiken. Als een beheerder een instelling bewerkt om een toepassing bij te werken, kan dit van invloed zijn op andere toepassingen die dezelfde instelling gebruiken. Producten zoals Azure App Configuration helpen dit risico te beperken via ingebouwde mogelijkheden, zoals revisiegeschiedenis, herstel naar een bepaald tijdstip (PITR), onveranderbare momentopnamen en progressieve implementatiepatronen.

  • Als een toepassing configuratiegegevens in de cache opslaat, moet u de toepassing waarschuwen wanneer de configuratie wordt gewijzigd. U kunt een verloopbeleid implementeren voor configuratiegegevens in de cache, zodat deze informatie automatisch periodiek wordt vernieuwd. De toepassing ziet de wijzigingen en implementeert deze.

  • Configuratiegegevens in de cache kunnen helpen bij het oplossen van tijdelijke connectiviteitsproblemen die het externe configuratiearchief ondervindt tijdens de runtime van de toepassing, maar deze aanpak lost het probleem meestal niet op als het externe archief uitvalt wanneer de toepassing wordt gestart. Zorg ervoor dat de implementatiepijplijn van uw toepassing de laatst bekende set configuratiewaarden in een configuratiebestand kan bieden dat moet worden gebruikt wanneer uw toepassing geen live-waarden kan ophalen bij het opstarten.

Wanneer gebruikt u dit patroon?

Gebruik dit patroon wanneer:

  • U moet configuratie-instellingen delen over meerdere toepassingen of exemplaren of een standaardconfiguratie afdwingen.

  • Uw standaardconfiguratiesysteem biedt geen ondersteuning voor alle vereiste instellingstypen, zoals afbeeldingen of complexe gegevensstructuren.

  • U hebt een aanvullend archief nodig voor sommige instellingen, terwijl toepassingen bepaalde of alle centraal opgeslagen waarden kunnen overschrijven.

  • U moet het beheer voor meerdere toepassingen vereenvoudigen en eventueel het configuratiegebruik bewaken door toegang tot het configuratiearchief vast te leggen.

Dit patroon is mogelijk niet geschikt wanneer:

  • Uw configuratie is eenvoudig, lokaal in één toepassing en verandert alleen tijdens normale releasecycli. In dit geval kan een extern configuratiearchief onnodige operationele complexiteit toevoegen.

Werklastontwerp

Evalueer hoe u het patroon Externe Configuratieopslag gebruikt in een workloadontwerp om de doelstellingen en principes aan te pakken die worden behandeld in de pijlers Azure Well-Architected Framework. De volgende tabel bevat richtlijnen over hoe dit patroon de doelstellingen van elke pijler ondersteunt.

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 veelvoorkomende plaats voor het beheren van functievlagmen om veilige implementatieprocedures te implementeren.

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

Als dit patroon compromissen binnen een pijler introduceert, moet u deze tegen de doelstellingen van de andere pijlers overwegen.

Voorbeeld

In de volgende voorbeelden ziet u hoe u het patroon Externe configuratiewinkel implementeert in Azure. In het eerste voorbeeld worden App Configuration- en clientbibliotheken gebruikt. In het tweede voorbeeld wordt een aangepaste back-upopslag gebruikt voor scenario's waarvoor een gespecialiseerde implementatie is vereist.

App Configuration

De meeste toepassingen kunnen App Configuration gebruiken in plaats van een aangepast configuratiearchief. App Configuration ondersteunt sleutel-waardeparen waarop u naamruimten kunt toepassen. App Configuration biedt ook ondersteuning voor onveranderbare momentopnamen van configuratie, zodat u configuratiewijzigingen kunt inspecteren, terugdraaien of geleidelijk kunt implementeren zonder risico voor actieve exemplaren.

Gebruik momentopnameverwijzingen om toepassingen te laten schakelen tussen momentopnamen tijdens runtime zonder codewijzigingen of opnieuw implementeren. U kunt configuratiewaarden exporteren zodat een kopie met uw toepassing wordt verzonden als back-up die moet worden gebruikt als de service niet bereikbaar is wanneer de toepassing wordt gestart.

In App Configuration zijn sleutels en waarden Unicode-tekenreeksen en elk sleutel-waardepaar heeft optionele metagegevens, zoals varianten op basis van labels en inhoudstype. Gebruik het inhoudstype om te beschrijven hoe uw toepassing een waarde moet interpreteren, zoals in JSON of in een ingebouwd App Configuration-type. App Configuration houdt ook een revisiegeschiedenis bij met PITR, waarmee u eerdere sleutel-waardeparen kunt controleren en herstellen.

Voor tolerantie richt u uw winkel in in een regio die beschikbaarheidszones ondersteunt en schakelt u geo-replicatie in, zodat u uw toepassingen kunt configureren om te lezen van de dichtstbijzijnde replica en tussen replica-eindpunten te schakelen tijdens regionale storingen. Gebruik Azure Key Vault-referenties om geheimen in Key Vault te bewaren en ernaar te verwijzen vanuit App Configuration, in plaats van credentials rechtstreeks in het configuratiearchief op te slaan. Gebruik beheerde identiteit en Azure op rollen gebaseerd toegangsbeheer (Azure RBAC) in plaats van verbindingsreeksen om toepassingen te verifiëren bij App Configuration.

Voor workloads die worden uitgevoerd in Azure Kubernetes Service (AKS), kan de App Configuration Kubernetes Provider ConfigMaps en Geheimen rechtstreeks vanuit uw winkel genereren zonder dat codewijzigingen in uw workloadcontainers nodig zijn. U kunt App Configuration ook gebruiken om functievlagmen te beheren, waaronder gerichte implementatie en experimenten op basis van varianten, in uw veilige implementatieprocedures.

Gebruik voor netwerkisolatie private-eindpunten voor App Configuration zodat clientverkeer via Azure Private Link op privé-IP-adressen blijft staan. Nadat u persoonlijke toegang hebt ingesteld, kunt u openbare toegang uitschakelen om de blootstelling aan openbare eindpunten te verminderen. In geo-gerepliceerde implementaties kan één privé-eindpunt alle replica's bereiken, maar voor een hogere regionale tolerantie kunt u privé-eindpunten inrichten voor elke replicaregio en het DNS (Domain Name System) dienovereenkomstig instellen.

A-diagram met een voorbeeld van een implementatie van het externe configuratiearchief met App Configuration als de centrale hub die verbinding maakt met meerdere Azure services en opslagsystemen.

Clientbibliotheken

Clientbibliotheken bieden veel van de voorgaande functies. Clientbibliotheken kunnen worden geïntegreerd met de runtime van de toepassing om waarden op te halen en in de cache op te slaan, waarden te vernieuwen wanneer ze worden gewijzigd en tijdelijke storingen in App Configuration af te handelen.

Looptijd Clientbibliotheek Opmerkingen Quickstart
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Provider voor Microsoft.Extensions.Configuration Quickstart voor .NET
ASP.NET Core Microsoft.Azure.AppConfiguration.AspNetCore Hiermee voegt u aanvraaggestuurde middleware voor vernieuwen toe voor ASP.NET Core Quickstart voor ASP.NET Core
Azure Functions in .NET Microsoft.Azure.AppConfiguration.Functions.Worker Provider voor het geïsoleerde werkmodel dat gebruikmaakt van Program.cs Quickstart voor Azure Functions
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Configuratiebouwer voor System.Configuration Quickstart voor .NET Framework
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config Ondersteunt Spring Framework-toegang via ConfigurationProperties Quickstart voor Java Spring
Python azure-appconfiguration-provider Providerbibliotheek die ondersteuning biedt voor dynamisch vernieuwen en Key Vault-verwijzingen. Quickstart voor Python
JavaScript en Node.js @azure/app-configuration-provider Library die ondersteuning biedt voor dynamisch vernieuwen en verwijzingen naar Key Vault Quickstart voor JavaScript

De volgende App Configuration sync GitHub Action en ingebouwde Azure-pipelines taken zijn ook beschikbaar:

Voorbeeld van aangepaste achtergrondopslag

In een toepassing die Azure hosts, kunt u Azure Storage gebruiken om configuratiegegevens extern op te slaan. Deze aanpak biedt tolerantie en hoge prestaties. Standaard worden gegevens drie keer binnen één datacenter gerepliceerd. Voor georedundantie tussen regio's kunt u geo-replicatie instellen met handmatige failovermogelijkheden. Azure-tabelopslag biedt een sleutel-waardearchief dat een flexibel schema voor de waarden kan gebruiken. Azure Blob Storage biedt een hiërarchisch archief op basis van containers dat elk type gegevens in afzonderlijke benoemde blobs kan bevatten.

Wanneer u dit patroon implementeert, moet u Blob Storage abstract maken en uw instellingen beschikbaar maken in uw toepassingen. U moet ook controleren op updates tijdens runtime en bepalen hoe u op deze updates moet reageren.

In het volgende voorbeeld ziet u hoe u een eenvoudig configuratiearchief en Blob Storage kunt gebruiken om configuratiegegevens op te slaan en weer te geven. Een BlobSettingsStore-klasse abstraheert Blob Storage voor het opslaan van configuratiegegevens. Het 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 het configuratiearchief bevat en bevat een versienummer dat u kunt gebruiken om recente configuratie-instellingswijzigingen te detecteren. 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.

Opmerking

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

Een ExternalConfigurationManager klasse biedt een wrapper rond een BlobSettingsStore exemplaar. Een toepassing kan deze klasse gebruiken om configuratiegegevens op te halen. Deze klasse kan gebruikmaken van een wijzigingsmeldingsmechanisme, zoals Microsoft Reactieve extensies, om configuratie-updates te publiceren terwijl het systeem wordt uitgevoerd. Het implementeert ook het Cache-Aside patroon voor instellingen om betere tolerantie en prestaties te bieden.

In het volgende voorbeeld ziet u hoe u een ExternalConfigurationManager klasse kunt implementeren.

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

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

Volgende stappen