チュートリアル: Spring Boot アプリ内で機能フラグを使用する

Spring Boot Core 機能管理ライブラリでは、Spring Boot アプリケーションで機能フラグを実装するためのサポートが提供されます。 これらのライブラリにより、機能フラグを宣言的にコードに追加できます。

機能管理ライブラリは、バックグラウンドで機能フラグのライフサイクルも管理します。 たとえば、ライブラリは、フラグの状態を更新およびキャッシュしたり、要求の呼び出し中にフラグの状態が不変であることを保証したりします。 さらに、Spring Boot ライブラリには、MVC コントローラーのアクション、ルート、およびミドルウェアを含む統合が用意されています。

Spring Boot アプリに機能フラグを追加するクイックスタートでは、Spring Boot アプリケーションに機能フラグを追加する複数の方法が示されています。 このチュートリアルでは、それらの方法についてより詳細に説明します。

このチュートリアルでは、次の内容を学習します。

  • アプリケーションの主要部分に機能フラグを追加して、機能の可用性を制御します。
  • 機能フラグを管理するのに App Configuration を使用する場合は、それと統合します。

機能管理を設定する

Spring Boot 機能マネージャー FeatureManager は、フレームワークのネイティブ構成システムから機能フラグを取得します。 その結果、Spring Boot がサポートする任意の構成ソース (ローカルの bootstrap.yml ファイルや環境変数など) を使用して、アプリケーションの機能フラグを定義できます。 FeatureManager は、依存関係の挿入を拠り所としています。 機能管理サービスは、標準の規則を使用して登録できます。

private FeatureManager featureManager;

public HelloController(FeatureManager featureManager) {
    this.featureManager = featureManager;
}

機能フラグはアプリケーションの外部で保持し、別々に管理することをお勧めします。 そうすることで、フラグの状態をいつでも変更して、アプリケーションにその変更をすぐに反映させることができます。 App Configuration は、専用のポータル UI を介してすべての機能フラグを一元的に整理および制御するための場所を提供します。 また、App Configuration は、その Spring Boot クライアント ライブラリを介してお使いのアプリケーションに直接フラグを配信します。

App Configuration に Spring Boot アプリケーションを接続する最も簡単な方法は、構成プロバイダーを使用することです。

<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>spring-cloud-azure-feature-management-web</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>5.8.0</version>
        <type>pom</type>
        <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

機能フラグの宣言

各機能フラグには 2 つの部分があります。1 つは名前で、もう 1 つは、機能の状態が "オン" である (つまり、その値が "True" である) かどうかの評価に使用される 2 つ以上のフィルターの一覧です。 フィルターは、機能をオンにするタイミングに関するユース ケースを定義します。

機能フラグに複数のフィルターがある場合は、フィルターのいずれかが、機能を有効にする必要があると判断するまで、フィルター一覧が順番に走査されます。 その時点で、機能フラグが "オン" になり、残りのフィルターの結果はすべてスキップされます。 どのフィルターも、機能を有効にする必要があると示していない場合、機能フラグは "オフ" になります。

機能マネージャーは、application.yml を機能フラグの構成ソースとしてサポートしています。 次の例は、YAML ファイルでの機能フラグの設定方法を示しています。

feature-management:
  feature-a: true
  feature-b: false
  feature-c:
    enabled-for:
      -
        name: PercentageFilter
        parameters:
          Value: 50

慣例により、この YML ドキュメントの feature-management セクションが機能フラグの設定に使用されます。 前述の例は、EnabledFor プロパティにフィルターが定義されている 3 つの機能フラグを示しています。

  • feature-a は "オン" です。
  • feature-b は "オフ" です。
  • feature-c は、parameters プロパティとともに PercentageFilter という名前のフィルターを指定します。 PercentageFilter は、構成可能なフィルターです。 この例で、PercentageFilter は、feature-c フラグが "オン" になる確率を 50% に指定しています。

機能フラグのチェック

機能管理の基本的なパターンでは、最初に機能フラグが "オン" に設定されているかどうかをチェックします。 そうなっている場合は、機能マネージャーが、機能に含まれているアクションを実行します。 次に例を示します。

private FeatureManager featureManager;
...
if (featureManager.isEnabledAsync("feature-a").block()) {
    // Run the following code
}

依存関係の挿入

Spring Boot では、依存関係の挿入を介して機能マネージャー FeatureManager にアクセスできます。

@Controller
@ConfigurationProperties("controller")
public class HomeController {
    private FeatureManager featureManager;

    public HomeController(FeatureManager featureManager) {
        this.featureManager = featureManager;
    }
}

コントローラー アクション

MVC コントローラーでは、@FeatureGate 属性を使用して、特定のアクションを有効にするかどうかを制御できます。 次の Index アクションを実行するには、feature-a が "オン" になっている必要があります。

@GetMapping("/")
@FeatureGate(feature = "feature-a")
public String index(Model model) {
    ...
}

制御する機能フラグが "オフ" であるために MVC コントローラーまたはアクションがブロックされている場合、登録されている DisabledFeaturesHandler インターフェイスが呼び出されます。 既定の DisabledFeaturesHandler インターフェイスは、応答本文なしで 404 状態コードをクライアントに返します。

MVC フィルター

MVC フィルターは、機能フラグの状態に基づいてアクティブになるように設定できます。 以下のコードは、FeatureFlagFilter という名前の MVC フィルターを追加します。 このフィルターは、feature-a が有効になっている場合のみ、MVC パイプライン内でトリガーされます。

@Component
public class FeatureFlagFilter implements Filter {

    @Autowired
    private FeatureManager featureManager;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if(!featureManager.isEnabled("feature-a")) {
            chain.doFilter(request, response);
            return;
        }
        ...
        chain.doFilter(request, response);
    }
}

ルート

機能フラグを使用して、ルートをリダイレクトすることができます。 次のコードでは、feature-a が有効になっている場合にユーザーがリダイレクトされます。

@GetMapping("/redirect")
@FeatureGate(feature = "feature-a", fallback = "/getOldFeature")
public String getNewFeature() {
    // Some New Code
}

@GetMapping("/getOldFeature")
public String getOldFeature() {
    // Some New Code
}

次のステップ

このチュートリアルでは、Spring Boot アプリケーションで spring-cloud-azure-feature-management-web ライブラリを使用して機能フラグを実装する方法について説明しました。 その他の質問については、リファレンス ドキュメントを参照してください。Spring Cloud Azure App Configuration ライブラリのしくみに関する詳細がすべて記載されています。Spring Boot と App Configuration での機能管理サポートの詳細については、次のリソースを参照してください。