Wzorzec zewnętrznego magazynu konfiguracji

Azure App Configuration
Azure Blob Storage

Przenoszenie informacji o konfiguracji z pakietu wdrożeniowego aplikacji do centralnej lokalizacji. Może to ułatwić zarządzanie danymi konfiguracji i kontrolowanie ich oraz współużytkowanie danych konfiguracji między aplikacjami i wystąpieniami aplikacji.

Kontekst i problem

Większość środowisk uruchomieniowych aplikacji zawiera informacje konfiguracyjne przechowywane w plikach wdrażanych razem z aplikacją. W niektórych przypadkach taki pliki można edytować, aby zmienić sposób działania aplikacji po jej wdrożeniu. Zmiany w konfiguracji wymagają jednak ponownego wdrożenia aplikacji, co często wiąże się z nieakceptowalnym przestojem i innymi narzutami administracyjnymi.

Lokalne pliki konfiguracji ograniczają także konfigurację do pojedynczej aplikacji, a czasem przydaje się współużytkowanie ustawień konfiguracji przez kilka aplikacji. Przykłady obejmują parametry połączenia z bazą danych, informacje o motywie interfejsu użytkownika lub adresy URL kolejek i magazynu używane przez powiązany zestaw aplikacji.

Zarządzanie zmianami w konfiguracjach lokalnych wielu działających wystąpień aplikacji nie jest łatwe, szczególnie w przypadku scenariusza hostingu w chmurze. Może to doprowadzić do sytuacji, gdy podczas wdrażania aktualizacji wystąpienia będą korzystać z różnych ustawień konfiguracji.

Dodatkowo aktualizacje aplikacji i składników mogą 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 zewnętrznym magazynie i udostępnij interfejs do szybkiego i wydajnego odczytywania oraz aktualizowania ustawień konfiguracji. Typ zewnętrznego magazynu zależy od hostingu i środowiska uruchomieniowego aplikacji. W scenariuszu hostowanym w chmurze jest to zazwyczaj oparta na chmurze usługa magazynu lub dedykowana usługa konfiguracji, ale może być hostowaną bazą danych lub innym systemem niestandardowym.

Wybrany przez Ciebie magazyn pomocniczy na informacje o konfiguracji powinien mieć interfejs zapewniający spójny i łatwy dostęp. Powinien ujawniać informacje w poprawnie typizowanym i ustrukturyzowanym formacie. Implementacja może również wymagać autoryzowania dostępu użytkowników w celu ochrony danych konfiguracji i być wystarczająco elastyczna, aby umożliwić przechowywanie wielu wersji konfiguracji (takich jak programowanie, przemieszczanie lub produkcja, w tym wiele wersji wydania każdego z nich).

Wiele wbudowanych systemów konfiguracji odczytuje dane przy uruchamianiu aplikacji i buforuje te dane w pamięci w celu umożliwienia szybkiego dostępu i zminimalizowania wpływu na wydajność aplikacji. W zależności od typu magazynu pomocniczego i opóźnienia tego magazynu pomocne może być zaimplementowanie magazynu buforowania w zewnętrznym magazynie konfiguracji. Aby uzyskać więcej informacji, zobacz Caching Guidance (Wskazówki dotyczące buforowania). Rysunek przedstawia przegląd zewnętrznego magazynu konfiguracji z opcjonalną lokalną pamięcią podręczną.

Przegląd zewnętrznego magazynu konfiguracji z opcjonalną lokalną pamięcią podręczną

Problemy i kwestie do rozważenia

Podczas podejmowania decyzji o sposobie wdrożenia tego wzorca należy rozważyć następujące punkty:

Wybierz magazyn pomocniczy oferujący wystarczającą wydajność, wysoką dostępność i odporność, którego kopię zapasową można tworzyć w ramach procesu konserwacji i administrowania aplikacją. W aplikacji hostowanej w chmurze użycie mechanizmu magazynu w chmurze lub dedykowanej usługi platformy konfiguracji jest zwykle dobrym wyborem, aby spełnić te wymagania.

Zaprojektuj schemat magazynu pomocniczego tak, aby zezwalał na elastyczność w zakresie przechowywanych typów informacji. Upewnij się, że spełnia wszystkie wymagania w zakresie konfiguracji, takie jak typizowane dane, kolekcje ustawień, wiele wersji ustawień i wszelkie inne funkcje, których wymaga używająca go aplikacja. Schemat powinien być łatwy do rozszerzenia o obsługę dodatkowych ustawień po zmianie wymagań.

Przemyśl fizyczne możliwości magazynu pomocniczego, jego relację ze sposobem przechowywania informacji o konfiguracji i wpływ na wydajność. Przykładowo przechowywanie dokumentu XML z informacjami o konfiguracji będzie wymagać interfejsu konfiguracji albo przetwarzania dokumentu w aplikacji w celu odczytania poszczególnych ustawień. Aktualizacja ustawienia będzie nieco bardziej skomplikowana, ale buforowanie ustawień może pomóc w skompensowaniu niższej wydajności odczytu.

Przemyśl sposób, w jak interfejs konfiguracji będzie zezwalać na sterowanie zakresem i dziedziczeniem ustawień konfiguracji. Przykładowo może być wymagane ustawienie zakresu ustawień konfiguracji na poziomie organizacji, aplikacji i maszyny. Konieczna może być obsługa delegowania kontroli nad dostępem do różnych zakresów i uniemożliwianie pojedynczym aplikacjom przesłaniania ustawień lub zezwalanie im na to.

Upewnij się, że interfejs konfiguracji może uwidaczniać dane konfiguracji w wymaganych formatach, takich wartości typizowane, kolekcje, pary klucz/wartość lub zbiory właściwości.

Przemyśl sposób działania interfejsu magazynu konfiguracji w sytuacji, gdy ustawienia będą zawierać błędy lub ustawień nie będzie w magazynie pomocniczym. Właściwe może być zwracanie ustawień domyślnych i rejestrowanie błędów. Przemyśl także takie aspekty jak rozróżnianie wielkości liter w kluczach lub nazwach ustawień konfiguracji, przechowywanie i obsługę danych binarnych oraz obsługę wartości null i pustych.

Pomyśl, jak chronić dane konfiguracji, aby zezwolić na dostęp do nich wyłącznie właściwym użytkownikom i aplikacjom. Jest to prawdopodobnie funkcja interfejsu magazynu konfiguracji, ale trzeba się także upewnić, że do danych w magazynie pomocniczym nie można bezpośrednio uzyskiwać dostępu bez odpowiedniego uprawnienia. Zapewnij ścisłą izolację uprawnień potrzebnych do odczytywania i zapisywania danych konfiguracji. Pomyśl też, czy potrzebujesz szyfrować część lub wszystkie ustawienia konfiguracji i jak zostanie to zaimplementowane w interfejsie magazynu konfiguracji.

Centralnie przechowywane konfiguracje, które zmieniają sposób działania aplikacji w czasie wykonywania, mają krytyczne znaczenie i powinny być wdrażane, aktualizowane oraz zarządzane za pomocą tych samych mechanizmów, które służą do wdrażania kodu aplikacji. Przykładowo zmiany wpływające na więcej niż jedną aplikację muszą być wprowadzane z użyciem podejścia z pełnym testowaniem i zastosowaniem wdrażania przejściowego w celu zapewnienia, że zmiana jest odpowiednia dla wszystkich aplikacji korzystających z tej konfiguracji. Jeśli administrator podda edycji ustawienie w celu zaktualizowania jednej aplikacji, może niekorzystnie wpłynąć na inne aplikacje używające tego samego ustawienia.

Jeśli aplikacja buforuje informacje o konfiguracji, musi być powiadamiana o zmianach konfiguracji. Możliwe może być zaimplementowanie zasad wygasania buforowanych danych konfiguracji w taki sposób, aby były okresowo odświeżane automatycznie, a wszelkie zmiany pobierane (i odpowiednio obsługiwane).

Buforowanie danych konfiguracji może pomóc w rozwiązywaniu przejściowych problemów z łącznością z zewnętrznym magazynem konfiguracji w czasie wykonywania aplikacji, zazwyczaj nie rozwiązuje to problemu, jeśli magazyn zewnętrzny nie działa, gdy aplikacja jest uruchamiana po raz pierwszy. Upewnij się, że potok wdrażania aplikacji może podać ostatni znany zestaw wartości konfiguracji w pliku konfiguracji jako rezerwowy, jeśli aplikacja nie może pobrać wartości na żywo po uruchomieniu.

Kiedy używać tego wzorca

Ten wzorzec jest przydatny w przypadku:

  • Ustawień konfiguracji współużytkowanych przez wiele aplikacji i wystąpień aplikacji lub standardowej konfiguracji, która musi być narzucana wielu aplikacjom i wystąpieniom aplikacji.

  • Systemu standardowej konfiguracji, który nie obsługuje wszystkich wymaganych ustawień konfiguracji, takich jak przechowywanie obrazów lub złożone typy danych.

  • Jako uzupełniający magazyn przechowujący część ustawień aplikacji, który może umożliwiać aplikacjom przesłanianie niektórych lub wszystkich ustawień przechowywanych centralnie.

  • Jako sposób upraszczania administrowania wieloma aplikacjami i, opcjonalnie, monitorowania użycia ustawień przez rejestrowanie niektórych lub wszystkich typów dostępu do magazynu konfiguracji.

Projekt obciążenia

Architekt powinien ocenić, w jaki sposób wzorzec magazynu konfiguracji zewnętrznej może być używany w projekcie obciążenia, aby sprostać celom i zasadom opisanym w filarach platformy Azure Well-Architected Framework. Na przykład:

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. Ta separacja konfiguracji aplikacji z kodu aplikacji obsługuje konfigurację specyficzną dla środowiska i stosuje przechowywanie wersji do wartości konfiguracji. Zewnętrzne magazyny konfiguracji są również typowym miejscem do zarządzania flagami funkcji w celu włączenia bezpiecznych praktyk wdrażania.

- Projekt automatyzacji OE:10
- OE:11 Sejf praktyk wdrażania

Podobnie jak w przypadku każdej decyzji projektowej, należy rozważyć wszelkie kompromisy w stosunku do celów innych filarów, które mogą zostać wprowadzone przy użyciu tego wzorca.

Przykład niestandardowego magazynu zapasowego

W aplikacji hostowanej na platformie Microsoft Azure możliwy wybór do przechowywania informacji o konfiguracji zewnętrznie polega na użyciu usługi Azure Storage. Usługa ta jest wytrzymała, oferuje dużą wydajność, jest trzykrotnie replikowana i ma automatyczny tryb failover zapewniający wysoką dostępność. Usługa Azure Table Storage udostępnia magazyn kluczy i wartości z możliwością stosowania elastycznego schematu dla wartości. Usługa Azure Blob Storage udostępnia hierarchiczny, oparty na kontenerach magazyn, który pozwala przechowywać dane dowolnego typu w indywidualnie wskazywanych obiektach blob.

Podczas implementowania tego wzorca odpowiadasz za abstrakcję usługi Azure Blob Storage i uwidacznianie ustawień w aplikacjach, w tym sprawdzanie dostępności aktualizacji w czasie wykonywania i reagowanie na nie.

W poniższym przykładzie pokazano, jak uproszczony magazyn konfiguracji może być przewidywany za pośrednictwem usługi Blob Storage w celu przechowywania i uwidaczniania informacji o konfiguracji. Klasa BlobSettingsStore może abstrakcją magazyn obiektów blob do przechowywania informacji o konfiguracji i implementuje prosty ISettingsStore interfejs.

public interface ISettingsStore
{
    Task<ETag> GetVersionAsync();
    Task<Dictionary<string, string>> FindAllAsync();
}

Ten interfejs definiuje metody pobierania ustawień konfiguracji przechowywanych w magazynie konfiguracji i zawiera numer wersji, który może służyć do wykrywania, czy ustawienia konfiguracji zostały ostatnio zmodyfikowane. Klasa BlobSettingsStore może używać ETag właściwości obiektu blob do implementowania przechowywania wersji. Właściwość ETag jest aktualizowana automatycznie za każdym razem, gdy obiekt blob jest zapisywany.

Zgodnie z projektem ta prosta ilustracja uwidacznia wszystkie ustawienia konfiguracji jako wartości ciągu, a nie wartości typizowane.

ExternalConfigurationManager Klasa może następnie dostarczyć otokę dla BlobSettingsStore wystąpienia. Aplikacja może używać tej klasy do pobierania informacji o konfiguracji. Ta klasa może używać takich rozszerzeń reaktywnych firmy Microsoft, aby opublikować wszelkie zmiany wprowadzone w konfiguracji podczas działania systemu. Jest on również odpowiedzialny za implementację wzorca z odkładaniem do pamięci podręcznej dla ustawień w celu zapewnienia dodatkowej odporności i wydajności.

Użycie może wyglądać podobnie do poniższego.

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

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

Korzystanie z konfiguracji aplikacja systemu Azure

Podczas tworzenia niestandardowego magazynu konfiguracji może być konieczne w niektórych sytuacjach, wiele aplikacji może zamiast tego używać aplikacja systemu Azure Configuration. aplikacja systemu Azure Configuration obsługuje pary klucz-wartość, które mogą być przestrzeni nazw. Klucze są wpisywane i są indywidualnie wersjonowane. aplikacja systemu Azure Configuration obsługuje również migawki konfiguracji do punktu w czasie, dzięki czemu można łatwo sprawdzić lub nawet przywrócić wcześniejsze wartości konfiguracji. Wartości konfiguracji można wyeksportować tak, aby kopia konfiguracji mogła być dostarczana z aplikacją w przypadku, gdy usługa jest niedostępna po uruchomieniu aplikacji.

Biblioteki klienta

Wiele z tych funkcji jest uwidacznianych za pośrednictwem bibliotek klienckich, które integrują się ze środowiskiem uruchomieniowym aplikacji w celu ułatwienia pobierania i buforowania wartości, odświeżania wartości zmian, a nawet obsługi przejściowych awarii usługi App Configuration Service.

Środowisko uruchomieniowe Biblioteka klienta Uwagi Szybki start
.NET Microsoft.Extensions.Configuration.AzureAppConfiguration Dostawca dla Microsoft.Extensions.Configuration Szybki start
ASP.NET Microsoft.Azure.AppConfiguration.AspNetCore Dostawca dla Microsoft.Extensions.Configuration Szybki start
Usługa Azure Functions na platformie .NET Microsoft.Extensions.Configuration.AzureAppConfiguration Używane z rozszerzeniami funkcji platformy Azure do obsługi konfiguracji w Startup.cs Szybki start
.NET Framework Microsoft.Configuration.ConfigurationBuilders.AzureAppConfiguration Konstruktor konfiguracji dla programu System.Configuration Szybki start
Java Spring com.azure.spring > azure-spring-cloud-appconfiguration-config Obsługuje dostęp do platformy Spring Za pośrednictwem ConfigurationProperties Szybki start
Python azure.appconfiguration Udostępnia element AzureAppConfigurationClient Szybki start
JavaScript/Node.js @azure/konfiguracja aplikacji Udostępnia element AppConfigurationClient Szybki start

Oprócz bibliotek klienckich istnieją również zadania aplikacja systemu Azure Configuration Sync GitHub Action i aplikacja systemu Azure Configuration Pull & aplikacja systemu Azure Configuration Push Azure DevOps, aby zintegrować kroki konfiguracji z procesem kompilacji.

Następne kroki