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