Flagi funkcji
Napiwek
Ta zawartość jest fragmentem książki eBook, Architekting Cloud Native .NET Applications for Azure, dostępnej na platformie .NET Docs lub jako bezpłatny plik PDF do pobrania, który można odczytać w trybie offline.
W rozdziale 1 potwierdziliśmy, że natywny dla chmury jest bardzo szybki i elastyczny. Użytkownicy oczekują szybkiego reagowania, innowacyjnych funkcji i bez przestojów. Feature flags
to nowoczesna technika wdrażania, która pomaga zwiększyć elastyczność aplikacji natywnych dla chmury. Umożliwiają one wdrażanie nowych funkcji w środowisku produkcyjnym, ale ograniczenie ich dostępności. Za pomocą migania przełącznika można aktywować nową funkcję dla określonych użytkowników bez ponownego uruchamiania aplikacji lub wdrażania nowego kodu. Oddzielają one wydanie nowych funkcji od wdrożenia kodu.
Flagi funkcji są oparte na logice warunkowej, która kontroluje widoczność funkcji dla użytkowników w czasie wykonywania. W nowoczesnych systemach natywnych dla chmury typowe jest wczesne wdrażanie nowych funkcji w środowisku produkcyjnym, ale testowanie ich przy użyciu ograniczonej grupy odbiorców. Wraz ze wzrostem ufności funkcja może być stopniowo wdrażana dla szerszej grupy odbiorców.
Inne przypadki użycia flag funkcji to:
- Ogranicz funkcjonalność premium do określonych grup klientów, którzy chcą płacić wyższe opłaty za subskrypcję.
- Stabilizuj system, szybko dezaktywując funkcję problemu, unikając ryzyka wycofania lub natychmiastowej poprawki.
- Wyłącz opcjonalną funkcję z wysokim zużyciem zasobów w okresach szczytowego użycia.
- Przeprowadzanie małych
experimental feature releases
segmentów użytkowników w celu zweryfikowania możliwości i popularności.
Flagi funkcji promują trunk-based
również programowanie. Jest to model rozgałęziania kontroli źródła, w którym deweloperzy współpracują nad funkcjami w jednej gałęzi. Podejście minimalizuje ryzyko i złożoność scalania dużej liczby długotrwałych gałęzi funkcji. Funkcje są niedostępne do momentu aktywowania.
Implementowanie flag funkcji
W jej rdzeniu flaga funkcji jest odwołaniem do prostego decision object
elementu . Zwraca on stan logiczny wartości on
lub off
. Flaga zazwyczaj opakowuje blok kodu, który hermetyzuje funkcję. Stan flagi określa, czy ten blok kodu jest wykonywany dla danego użytkownika. Rysunek 10–11 przedstawia implementację.
if (featureFlag) {
// Run this code block if the featureFlag value is true
} else {
// Run this code block if the featureFlag value is false
}
Rysunek 10–11 — prosta implementacja flagi funkcji.
Zwróć uwagę, jak to podejście oddziela logikę decyzyjną od kodu funkcji.
W rozdziale 1 omówiliśmy element Twelve-Factor App
. Wskazówki zalecane utrzymywanie ustawień konfiguracji zewnętrznych z kodu wykonywalnego aplikacji. W razie potrzeby ustawienia można odczytać ze źródła zewnętrznego. Wartości konfiguracji flagi funkcji powinny być również niezależne od ich bazy kodu. Dzięki zewnętrznej konfiguracji flagi w osobnym repozytorium można zmienić stan flagi bez modyfikowania i ponownego wdrażania aplikacji.
aplikacja systemu Azure Configuration udostępnia scentralizowane repozytorium flag funkcji. Dzięki niej definiujesz różne rodzaje flag funkcji i szybko i pewnie manipulujesz ich stanami. Biblioteki klienta usługi App Configuration można dodać do aplikacji, aby włączyć funkcję flagi funkcji. Obsługiwane są różne struktury języków programowania.
Flagi funkcji można łatwo zaimplementować w usłudze ASP.NET Core. Zainstalowanie bibliotek zarządzania funkcjami platformy .NET i dostawcy usługi App Configuration umożliwia deklaratywne dodawanie flag funkcji do kodu. Umożliwiają one włączenie FeatureGate
atrybutów, aby nie trzeba było ręcznie pisać instrukcji if w bazie kodu.
Po skonfigurowaniu w klasie Startup można dodać funkcję flagi funkcji na poziomie kontrolera, akcji lub oprogramowania pośredniczącego. Rysunek 10–12 przedstawia implementację kontrolera i akcji:
[FeatureGate(MyFeatureFlags.FeatureA)]
public class ProductController : Controller
{
...
}
[FeatureGate(MyFeatureFlags.FeatureA)]
public IActionResult UpdateProductStatus()
{
return ObjectResult(ProductDto);
}
Rysunek 10-12 — implementacja flagi funkcji w kontrolerze i akcji.
Jeśli flaga funkcji jest wyłączona, użytkownik otrzyma kod stanu 404 (Nie znaleziono) bez treści odpowiedzi.
Flagi funkcji można również wstrzykiwać bezpośrednio do klas języka C#. Rysunek 10–13 przedstawia iniekcję flagi funkcji:
public class ProductController : Controller
{
private readonly IFeatureManager _featureManager;
public ProductController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
}
Rysunek 10–13 — wstrzykiwanie flagi funkcji do klasy.
Biblioteki zarządzania funkcjami zarządzają cyklem życia flag funkcji w tle. Aby na przykład zminimalizować dużą liczbę wywołań do magazynu konfiguracji, biblioteki buforują stany flagi przez określony czas. Mogą zagwarantować niezmienność stanów flag podczas wywołania żądania. Oferują również usługę Point-in-time snapshot
. Historię dowolnej wartości klucz-wartość można odtworzyć i podać jej poprzednią wartość w dowolnym momencie w ciągu ostatnich siedmiu dni.