アンチパターン: ターゲットのない API プロキシで Service Callout ポリシーを使用してバックエンド サービスを呼び出す

API プロキシは、バックエンド サービスの管理されたファサードです。基本的な API プロキシ構成は、ProxyEndpoint(API プロキシの URL を定義)と TargetEndpoint(バックエンド サービスの URL を定義)で構成されます。

Apigee Edge は柔軟性に富んでいるので、このパターンの上に洗練された動作を構築できます。たとえば、ポリシーを追加することで、API がクライアント リクエストをバックエンド サービスに送信する前に処理する方法を制御できます。あるいは、クライアントに転送する前にバックエンド サービスから受信したレスポンスを操作できます。Service Callout ポリシーを使用して他のサービスを呼び出せます。また JavaScript コードを追加してカスタム動作を追加することや、バックエンド サービスを呼び出さない API プロキシを作成することもできます。

アンチパターン

サービス コールアウトを使用して、ターゲット エンドポイントへのルートがない API プロキシでバックエンド サービスを呼び出すことは技術的には可能ですが、外部サービスのパフォーマンスに関する分析データが失われます。

ターゲット ルートを含まない API プロキシは、リクエスト メッセージを TargetEndpoint に転送する必要がない場合に役立ちます。これに対して、ProxyEndpoint は必要なすべての処理を実行します。たとえば、ProxyEndpoint は、ルックアップから API サービスの Key-Value ストアへのデータを取得し、バックエンド サービスを呼び出さずにレスポンスを返せます。

以下に示すように、API プロキシで null ルートを定義できます。

<RouteRule name="noroute"/>

null ルートを使用するプロキシは、ターゲット バックエンド サービスを呼び出さないため、「ターゲットのない」プロキシです。

以下の例に示すように、ターゲットのないプロキシにサービス コールアウトを追加して、外部サービスを呼び出すことは技術的に可能です。

<!-- /antipatterns/examples/service-callout-no-target-1.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ProxyEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request>
                <Step>
                    <Name>ServiceCallout-InvokeBackend</Name>
                </Step>
            </Request>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPProxyConnection>
            <BasePath>/no-target-proxy</BasePath>
            <Properties/>
            <VirtualHost>secure</VirtualHost>
        </HTTPProxyConnection>
        <RouteRule name="noroute"/>
    </ProxyEndpoint>
    

ただし、プロキシは外部サービスの動作に関する分析情報(処理時間やエラー率など)を提供できないため、外部サービスのパフォーマンスを評価することは困難になります。

影響

  • 外部サービスの操作に関する分析情報(エラーコード、応答時間、ターゲット パフォーマンスなど)は入手できません。
  • サービス コールアウトを呼び出す前または後に必要となる特定のロジックが、プロキシ ロジック全体の一部として組み込まれているため、これを理解して再利用することが困難になります。

ベスト プラクティス

API プロキシが単一の外部サービスとのみ対話する場合、そのプロキシは基本の設計パターンに従う必要があります。基本の設計パターンでは、バックエンド サービスは API プロキシのターゲット エンドポイントとして定義されています。ターゲット エンドポイントへのルーティング ルールのないプロキシでは、バックエンド サービスの呼び出しに ServiceCallout ポリシーを使用しないでください。

次のプロキシ構成は、上記の例と同じ動作を実装していますが、ベスト プラクティスに従っています。

<!-- /antipatterns/examples/service-callout-no-target-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ProxyEndpoint name="default">
        <Description/>
        <FaultRules/>
        <PreFlow name="PreFlow">
            <Request/>
            <Response/>
        </PreFlow>
        <PostFlow name="PostFlow">
            <Request/>
            <Response/>
        </PostFlow>
        <Flows/>
        <HTTPProxyConnection>
            <BasePath>/simple-proxy-with-route-to-backend</BasePath>
            <Properties/>
            <VirtualHost>secure</VirtualHost>
        </HTTPProxyConnection>
        <RouteRule name="default">
            <TargetEndpoint>default</TargetEndpoint>
        </RouteRule>
    </ProxyEndpoint>
    

サービス コールアウトを使用して、ターゲット エンドポイントを呼び出す前または後に外部サービスを呼び出すというマッシュアップ シナリオをサポートしています。サービス コールアウトは、ターゲット エンドポイントの呼び出しに代わるものではありません。

関連情報