Udostępnij za pośrednictwem


Flagi funkcjonalności

Wskazówka

Ta zawartość jest fragmentem e-książki, Architektura Cloud Native .NET Applications for Azure, dostępnej w .NET Docs lub jako bezpłatny plik PDF do pobrania, który można czytać offline.

Natywne aplikacje .NET dla chmury Azure - okładka miniatury eBooka.

W rozdziale 1 potwierdziliśmy, że koncepcja cloud-native dotyczy przede wszystkim szybkości i zwinności. 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ą 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.
  • Przeprowadzenie experimental feature releases na małych segmentach użytkowników w celu zweryfikowania jego wykonalnoś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.

Implementacja flag funkcjonalnych

U podstaw flaga funkcji jest odwołaniem do prostego decision object. Zwraca on stan logiczny wartości on lub off. Flaga zazwyczaj opakowuje blok kodu, który obejmuje zdolność funkcji. 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 zalecają utrzymywanie ustawień konfiguracji poza kodem wykonywalnym 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.

Usługa Azure App Configuration udostępnia scentralizowane repozytorium flag funkcji. Dzięki niej definiujesz różne rodzaje flag funkcji i szybko i pewnie manipulujesz ich stanami. Aby włączyć funkcjonalność flag funkcji, można dodać biblioteki klienta usługi App Configuration do aplikacji. 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 warunkowych w kodzie źródłowym.

Po skonfigurowaniu w klasie Startup, można dodać funkcjonalność flag cech na poziomie kontrolera, akcji lub warstwy pośredniej. 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 funkcjonalności w kontrolerze i działaniu.

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 znacznika funkcji do klasy.

Biblioteki do zarządzania funkcjami odpowiadają za cykl życia flagi 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. Można odtworzyć historię dowolnej pary klucz-wartość i uzyskać jej wcześniejszą wartość w dowolnym momencie w ciągu ostatnich siedmiu dni.