現在、Apigee と Apigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントはこちらをご覧ください。
API プロキシは、バックエンド サービス用の管理されたファサードです。基本的な API プロキシ構成は、ProxyEndpoint(API プロキシの URL を定義)と TargetEndpoint(バックエンド サービスの URL を定義)で構成されます。
Apigee は非常に柔軟性が高く、このパターン上に高度な動作を構築できます。たとえば、ポリシーを追加することで、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>
サービス コールアウトを使用することで、ターゲット エンドポイントの呼び出し前または後に外部サービスを呼び出すというマッシュアップ シナリオを可能にします。サービス コールアウトは、ターゲット エンドポイントの呼び出しに代わるものではありません。