Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przenieś informacje o konfiguracji z pakietu wdrożeniowego aplikacji do scentralizowanej lokalizacji. Takie podejście zapewnia łatwiejsze zarządzanie danymi konfiguracji i kontrolę nad nimi oraz udostępnianie danych konfiguracji w aplikacjach i wystąpieniach aplikacji.
Kontekst i problem
Większość środowisk środowiska uruchomieniowego aplikacji zawiera informacje o konfiguracji w plikach wdrażanych za pomocą aplikacji. W niektórych przypadkach można edytować te pliki, aby zmienić zachowanie aplikacji po wdrożeniu aplikacji. Jednak zmiany konfiguracji wymagają ponownego wdrożenia aplikacji. Ponowne wdrażanie często skutkuje niedopuszczalnym przestojem i innymi obciążeniami administracyjnymi.
Lokalne pliki konfiguracji ograniczają również konfigurację do pojedynczej aplikacji. W niektórych scenariuszach możesz udostępnić ustawienia konfiguracji w wielu aplikacjach. Przykłady obejmują parametry połączenia bazy danych, informacje o motywie interfejsu użytkownika oraz adresy URL kolejki i miejsca przechowywania używane przez powiązane aplikacje.
Zarządzanie zmianami konfiguracji lokalnych w wielu uruchomionych wystąpieniach aplikacji jest trudne. To wyzwanie może spowodować, że instancje będą używać różnych ustawień konfiguracji podczas wdrażania aktualizacji.
Aktualizacje aplikacji i składników mogą również wymagać zmian w schematach konfiguracji. Wiele systemów konfiguracji nie obsługuje różnych wersji informacji o konfiguracji.
Rozwiązanie
Przechowuj informacje o konfiguracji w magazynie zewnętrznym i podaj interfejs, którego można użyć do szybkiego i wydajnego odczytywania i aktualizowania ustawień konfiguracji. Typ magazynu zewnętrznego zależy od środowiska hostowania i środowiska uruchomieniowego aplikacji. W scenariuszu hostowanym w chmurze magazyn zewnętrzny jest zazwyczaj usługą magazynu w chmurze lub dedykowaną usługą konfiguracji. Może to być również hostowana baza danych lub inny system niestandardowy.
Magazyn zapasowy wybrany dla informacji o konfiguracji powinien mieć interfejs zapewniający spójny i łatwy w użyciu dostęp. Powinien uwidocznić informacje w poprawnie wpisanym i ustrukturyzowanym formacie. Implementacja może również wymagać autoryzowania dostępu użytkowników w celu ochrony danych konfiguracji. Może wymagać wystarczającej elastyczności, aby przechowywać wiele wersji konfiguracji, takich jak deweloperska, stagingowa i produkcyjna, w tym wiele wersji wydań każdej konfiguracji.
Wiele wbudowanych systemów konfiguracji odczytuje dane po uruchomieniu aplikacji, a następnie buforuje dane w pamięci, aby zapewnić szybki dostęp i zminimalizować wpływ na wydajność aplikacji. W zależności od typu używanego magazynu kopii zapasowych i opóźnienia tego magazynu warto zaimplementować mechanizm buforowania w zewnętrznym magazynie konfiguracji. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące buforowania. Na poniższym diagramie przedstawiono przegląd wzorca zewnętrznego magazynu konfiguracji z opcjonalną lokalną pamięcią podręczną.
Problemy i zagadnienia
Podczas podejmowania decyzji o zaimplementowaniu tego wzorca należy wziąć pod uwagę następujące kwestie:
Wybierz magazyn zapasowy zapewniający akceptowalną wydajność, wysoką dostępność i niezawodność. Upewnij się, że możesz utworzyć kopię zapasową w procesie konserwacji aplikacji i administrowania. W aplikacji hostowanej w chmurze użyj mechanizmu magazynu w chmurze lub dedykowanej usługi platformy konfiguracji, aby spełnić te wymagania.
Zaprojektuj schemat magazynu zaplecza, aby zapewnić elastyczność typów informacji, które mogą być przechowywane. Upewnij się, że zapewnia ona możliwości dla wszystkich wymagań dotyczących konfiguracji, takich jak typizowane dane, kolekcje ustawień, wiele wersji ustawień i wszelkie inne funkcje wymagane przez aplikacje. Schemat powinien być łatwy do rozszerzenia w celu obsługi większej liczby ustawień w przypadku zmiany wymagań.
Rozważ fizyczne możliwości magazynu zaplecza, sposób ich powiązania ze sposobem przechowywania informacji o konfiguracji oraz wpływem na wydajność. Na przykład przechowywanie dokumentu XML zawierającego informacje o konfiguracji wymaga interfejsu konfiguracji lub aplikacji do analizowania dokumentu w celu odczytania poszczególnych ustawień. Analizowanie komplikuje sposób aktualizowania ustawień, ale buforowanie ustawień może pomóc w zrównoważeniu wolniejszej wydajności odczytu.
Zastanów się, w jaki sposób interfejs konfiguracji zezwala na kontrolę zakresu i dziedziczenia ustawień konfiguracji. Na przykład może być konieczne określanie zakresu ustawień konfiguracji na poziomie organizacji, aplikacji i maszyny. Interfejs konfiguracji może wymagać delegowania kontroli nad dostępem do różnych zakresów i uniemożliwienia lub zezwolenia poszczególnym aplikacjom na zastępowanie ustawień.
Upewnij się, że interfejs konfiguracji może uwidocznić dane konfiguracji w wymaganych formatach, takich jak wartości typowane, kolekcje, pary klucz-wartość i worki właściwości.
Rozważ, jak interfejs repozytorium konfiguracji zachowuje się, gdy ustawienia są błędne lub nie istnieją w magazynie danych. Może być konieczne przywrócenie ustawień domyślnych i rejestrowanie błędów. Należy również uwzględnić uwrażliwienie na wielkość liter kluczy lub nazw ustawień konfiguracji, sposób przechowywania i obsługi danych binarnych oraz sposób obsługi wartości null lub wartości pustych.
Zastanów się, jak chronić dane konfiguracji i udzielić dostępu tylko odpowiednim użytkownikom i aplikacjom. Interfejs magazynu konfiguracji zwykle udostępnia tę funkcję, ale należy również upewnić się, że użytkownicy i aplikacje nie mogą bezpośrednio uzyskać dostępu do danych w magazynie zapasowym bez odpowiednich uprawnień. Upewnij się, że zostało zachowane ścisłe rozdzielenie uprawnień wymaganych do odczytu i zapisu danych konfiguracji. Należy również rozważyć, czy należy zaszyfrować niektóre lub wszystkie ustawienia konfiguracji oraz jak zaimplementować to szyfrowanie w interfejsie magazynu konfiguracji.
Należy również włączyć rejestrowanie inspekcji, aby zarejestrować, kto odczytuje lub modyfikuje wartości konfiguracji i kiedy te akcje wystąpią. Zastosuj te same wymagania dotyczące inspekcji do wszelkich lokalnych kopii rezerwowych danych konfiguracji.
Oddziel niewrażliwe wartości konfiguracji od tajnych danych. Zachowaj rutynowe ustawienia, takie jak flagi funkcji i punkty końcowe, w ustawieniach konfiguracji. Przechowuj wpisy tajne, takie jak parametry połączenia, klucze interfejsu API, certyfikaty i hasła, w dedykowanym systemie zarządzania wpisami tajnymi, który zapewnia szyfrowanie i kontrolowany dostęp.
Centralnie przechowywane konfiguracje, które zmieniają zachowanie aplikacji podczas wykonywania, mają kluczowe znaczenie. Wdrażanie, aktualizowanie i zarządzanie nimi przy użyciu tych samych mechanizmów, których używasz do wdrażania kodu aplikacji. Na przykład należy przeprowadzić zmiany, które mogą mieć wpływ na więcej niż jedną aplikację przy użyciu w pełni przetestowanego i etapowego podejścia wdrażania, aby upewnić się, że zmiana odpowiada wszystkim aplikacjom korzystającym z tej konfiguracji. Jeśli administrator edytuje ustawienie w celu zaktualizowania jednej aplikacji, może to mieć negatywny wpływ na inne aplikacje, które używają tego samego ustawienia. Produkty takie jak Azure App Configuration pomagają ograniczyć to ryzyko dzięki wbudowanym funkcjom, takim jak historia poprawek, odzyskiwanie do punktu w czasie (PITR), niezmienne migawki i progresywne wzorce wdrażania.
Jeśli aplikacja buforuje informacje o konfiguracji, należy powiadomić aplikację o zmianie konfiguracji. Możesz zaimplementować politykę wygasania dla buforowanych danych konfiguracyjnych, więc te informacje będą automatycznie odświeżane okresowo. Aplikacja widzi zmiany i implementuje je.
Buforowane dane konfiguracji mogą pomóc w rozwiązywaniu przejściowych problemów z łącznością, które występują w zewnętrznym magazynie konfiguracji w czasie wykonywania aplikacji, ale takie podejście zwykle nie rozwiązuje problemu, jeśli magazyn zewnętrzny nie działa po uruchomieniu aplikacji. Upewnij się, że potok wdrażania aplikacji może podać ostatni znany zestaw wartości konfiguracji w pliku konfiguracji do użycia, gdy aplikacja nie może pobrać wartości na żywo podczas uruchamiania.
Kiedy należy używać tego wzorca
Użyj tego wzorca, gdy:
Musisz udostępnić ustawienia konfiguracji w wielu aplikacjach lub wystąpieniach lub wymusić konfigurację standardową między nimi.
Standardowy system konfiguracji nie obsługuje wszystkich wymaganych typów ustawień, takich jak obrazy lub złożone struktury danych.
Potrzebujesz dodatkowego magazynu dla niektórych ustawień, umożliwiając aplikacjom zastępowanie niektórych lub wszystkich centralnie przechowywanych wartości.
Należy uprościć administrowanie wieloma aplikacjami i opcjonalnie monitorować użycie konfiguracji, rejestrując dostęp do magazynu konfiguracji.
Ten wzorzec może nie być odpowiedni w następujących przypadkach:
- Konfiguracja jest prosta, lokalna dla jednej aplikacji i zmienia się tylko podczas normalnych cykli wydania. W takim przypadku zewnętrzny magazyn konfiguracji może dodać niepotrzebną złożoność operacyjną.
Projektowanie obciążenia pracy
Oceń, jak zastosować wzorzec zewnętrznego magazynu konfiguracji w projektowaniu obciążenia, aby sprostać celom i zasadom opisanym w filarach Azure Well-Architected Framework. Poniższa tabela zawiera wskazówki dotyczące tego, jak ten wzorzec obsługuje cele poszczególnych filarów.
| Filar | Jak ten wzorzec obsługuje cele filaru |
|---|---|
| Doskonałość operacyjna pomaga zapewnić jakość obciążeń dzięki ustandaryzowanym procesom i spójności zespołu. | Separacja konfiguracji aplikacji od kodu aplikacji umożliwia konfigurację specyficzną dla środowiska i stosowanie wersjonowania do wartości konfiguracji. Zewnętrzne magazyny konfiguracji są również typowym miejscem do zarządzania flagami funkcji w celu zaimplementowania bezpiecznych praktyk wdrażania. - Projekt automatyzacji OE:10 - OE:11 Bezpieczne praktyki wdrażania |
Jeśli ten wzorzec wprowadza kompromisy w ramach filaru, rozważ je przed celami innych filarów.
Example
W poniższych przykładach pokazano, jak zaimplementować wzorzec zewnętrznego magazynu konfiguracji w Azure. W pierwszym przykładzie użyto usługi App Configuration i bibliotek klienckich. W drugim przykładzie użyto niestandardowego magazynu kopii zapasowych dla scenariuszy wymagających wyspecjalizowanej implementacji.
App Configuration
Większość aplikacji może używać usługi App Configuration zamiast niestandardowego magazynu konfiguracji. Usługa App Configuration obsługuje pary klucz-wartość, do których można przypisać przestrzenie nazw. Usługa App Configuration obsługuje również niezmienne migawki konfiguracji, dzięki czemu można sprawdzać, cofać lub stopniowo wdrażać zmiany konfiguracji bez ryzyka dla uruchomionych wystąpień.
Użyj odwołań migawek, aby umożliwić aplikacjom przełączanie się w czasie wykonywania między migawkami bez zmian kodu lub ponownego wdrażania. Możesz wyeksportować wartości konfiguracji, aby kopia jest dostarczana z aplikacją jako kopia zapasowa do użycia, jeśli usługa jest niedostępna po uruchomieniu aplikacji.
W usłudze App Configuration klucze i wartości są ciągami Unicode, a każda para klucz-wartość ma opcjonalne metadane, takie jak warianty oparte na etykiecie i typ zawartości. Użyj typu zawartości, aby opisać, jak aplikacja powinna interpretować wartość, taką jak w formacie JSON lub wbudowanym typie konfiguracji aplikacji. Usługa App Configuration przechowuje również historię poprawek za pomocą funkcji PITR, która ułatwia przeglądanie i odzyskiwanie poprzednich par klucz-wartość.
Aby zapewnić odporność, aprowizuj magazyn w regionie obsługującym strefy dostępności i włącz replikację geograficzną , aby można było skonfigurować aplikacje do odczytu z najbliższej repliki i przełączać się między punktami końcowymi repliki podczas awarii regionalnych. Użyj odwołań Azure Key Vault, aby przechowywać wpisy tajne w Key Vault i odwoływać się do nich z usługi App Configuration, zamiast przechowywać poświadczenia bezpośrednio w magazynie konfiguracji. Użyj managed identity i Azure kontroli dostępu opartej na rolach (Azure RBAC) zamiast parametrów połączenia w celu uwierzytelniania aplikacji w usłudze App Configuration.
W przypadku obciążeń uruchamianych w Azure Kubernetes Service (AKS), App Configuration Kubernetes Provider może generować pliki ConfigMaps i Secrets bezpośrednio z Twojego sklepu bez konieczności wprowadzania zmian w kodzie w kontenerach obciążeń. Za pomocą usługi App Configuration można również zarządzać flagami funkcji, w tym docelowym wdrażaniem i eksperymentami opartymi na wariantach, w bezpiecznych rozwiązaniach wdrażania.
W przypadku izolacji sieci użyj prywatnych punktów końcowych dla usługi App Configuration, aby ruch danych klienta pozostał na prywatnych adresach IP przez Azure Private Link. Po skonfigurowaniu dostępu prywatnego można wyłączyć dostęp publiczny , aby zmniejszyć narażenie publicznego punktu końcowego. We wdrożeniach replikowanych geograficznie pojedynczy prywatny punkt końcowy może uzyskać dostęp do wszystkich replik, ale w celu zapewnienia większej odporności regionalnej można aprowizować prywatne punkty końcowe dla każdego regionu repliki i odpowiednio skonfigurować system nazw domen (DNS).
Biblioteki klienta
Biblioteki klienckie udostępniają wiele z powyższych funkcji. Biblioteki klienckie integrują się ze środowiskiem uruchomieniowym aplikacji, aby ułatwić pobieranie i buforowanie wartości, odświeżanie wartości podczas ich zmiany i obsługę przejściowych awarii w usłudze App Configuration.
| Runtime | Biblioteka kliencka | Notatki | Szybki start |
|---|---|---|---|
| .NET | Microsoft.Extensions.Configuration.AzureAppConfiguration | Dostawca Microsoft.Extensions.Configuration |
Szybki start — platforma .NET |
| ASP.NET Core | Microsoft.Azure.AppConfiguration.AspNetCore | Dodaje oprogramowanie pośredniczące do odświeżania na żądanie dla ASP.NET Core | Quickstart for ASP.NET Core |
| Azure Functions w .NET | Microsoft.Azure.AppConfiguration.Functions.Worker | Dostawca modelu izolowanej pracy, który używa Program.cs |
Quickstart for Azure Functions |
| .NET Framework | Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration | Konstruktor konfiguracji dla programu System.Configuration |
Quickstart for .NET Framework |
| Java Spring (framework do tworzenia aplikacji w Javie) | com.azure.spring > azure-spring-cloud-appconfiguration-config | Obsługuje dostęp do platformy Spring Za pośrednictwem ConfigurationProperties |
Quickstart for Java Spring |
| Python | azure-appconfiguration-provider (dostawca konfiguracji aplikacji Azure) | Biblioteka dostawcy, która zapewnia obsługę dynamicznego odświeżania oraz odwołań do Key Vault. | Szybki start — Python |
| JavaScript i Node.js | @azure/app-configuration-provider | Biblioteka dostawcy, która zapewnia obsługę dynamicznego odświeżania i wsparcie dla odwołań do Key Vault | Szybki start — JavaScript |
Dostępne są również następujące zadania App Configuration GitHub Akcja i wbudowane zadania Azure Pipelines:
Przykład niestandardowego magazynu zapasowego
W aplikacji, która jest hostowana przez Azure, można użyć Azure Storage do przechowywania informacji o konfiguracji zewnętrznie. Takie podejście zapewnia odporność i wysoką wydajność. Domyślnie usługa Storage replikuje dane trzy razy w jednym centrum danych. W przypadku geograficznej nadmiarowości w różnych regionach można skonfigurować replikację geograficzną z możliwościami ręcznego przełączania awaryjnego. Azure Table Storage udostępnia magazyn typu klucz-wartość, który umożliwia użycie elastycznego schematu dla wartości. Azure Blob Storage zapewnia hierarchiczny magazyn oparty na kontenerach, który może przechowywać dowolny typ danych w indywidualnie nazwanych obiektach blob.
Podczas implementowania tego wzorca należy abstrakcjonować Blob Storage i uwidaczniać ustawienia w aplikacjach. Należy również sprawdzić dostępność aktualizacji w czasie wykonywania i zdecydować, jak reagować na te aktualizacje.
W poniższym przykładzie pokazano, jak można użyć prostego magazynu konfiguracji i Blob Storage do przechowywania i uwidaczniania informacji o konfiguracji. Klasa BlobSettingsStore abstrahuje Blob Storage do przechowywania informacji konfiguracyjnych. Implementuje prosty ISettingsStore interfejs.
public interface ISettingsStore
{
Task<ETag> GetVersionAsync();
Task<Dictionary<string, string>> FindAllAsync();
}
Ten interfejs definiuje metody pobierania ustawień konfiguracji przechowywanych przez magazyn konfiguracji i zawiera numer wersji, którego można użyć do wykrywania ostatnich modyfikacji ustawień konfiguracji. Klasa BlobSettingsStore może używać ETag właściwości obiektu blob do implementowania wersjonowania. Właściwość ETag jest aktualizowana automatycznie za każdym razem, gdy obiekt blob jest zapisywany.
Note
Zgodnie z projektem ta prosta ilustracja uwidacznia wszystkie ustawienia konfiguracji jako wartości ciągu, a nie wartości typizowane.
Klasa ExternalConfigurationManager zapewnia opakowanie wokół wystąpienia BlobSettingsStore. Aplikacja może używać tej klasy do pobierania informacji o konfiguracji. Ta klasa może używać mechanizmu powiadamiania o zmianie, takiego jak Microsoft Reaktywne rozszerzenia do publikowania aktualizacji konfiguracji podczas uruchamiania systemu. Implementuje również wzorzec Cache-Aside ustawień, aby zapewnić lepszą odporność i wydajność.
W poniższym przykładzie pokazano, jak można zaimplementować klasę ExternalConfigurationManager .
static void Main(string[] args)
{
// Start monitoring configuration changes.
ExternalConfiguration.Instance.StartMonitor();
// Get a setting.
var setting = ExternalConfiguration.Instance.GetAppSetting("someSettingKey");
…
}
Następne kroki
- Przykłady konfiguracji aplikacji
- Integrowanie usługi App Configuration z wdrożeniami platformy Kubernetes przy użyciu narzędzia Helm
- Zarządzanie flagami funkcji w usłudze App Configuration
- Wskazówki dotyczące buforowania
- Najlepsze rozwiązania dotyczące konfiguracji aplikacji