私はJava、Spring、Jerseyを使用しています。
RESTAPI Aがあり、q
というクエリパラメータを受け取り、これを別のAPIに送信しますAPI B応答を取得します。
最初にクライアントから別のクエリAPI Cにクエリを渡し、API Cを使用して新しいリクエストを作成します。つまり、基本的には、新しいHttpServletRequestWrapper
パラメータを持つq
でリクエストをラップします。
うまくいけば、この画像はこれを少し明確にするでしょう:
したがって、このシナリオではjavax.servlet.Filter
を使用するという考えです。私を悩ませるいくつかの質問:
Filter
から別のAPIを呼び出すのは良い習慣ですか?
私は春を使用しています。 Filter
内でAPI Cのクライアントに@Autowired
を使用することは問題でしょうか?
Webサービスオーケストレーションとして一般的に知られていることを実行しています。マイクロサービスのオーケストレーションについて StackOverflowに関するこの関連記事 を参照してください。
サーブレットフィルターを使用して外部サービスを呼び出すことはお勧めしません。 Oracleのドキュメントによると、フィルタはHTTPリクエストまたはHTTPレスポンス、あるいはその両方を変換するために使用されることになっています。この場合、それは純粋に変換するのではなく、ユーザーの制御下にない外部サービスを呼び出しているので、潜在的な障害点として扱う必要があります。
フィルターは、フォーマットの変換やロギングなどに使用する必要があります。すべての外部呼び出しは、サービスオーケストレーションロジックの一部として行う必要があります。
フィルターのオーケストレーションロジックの制限は、それが呼び出される順序が重要であり、この順序を正しくするように注意する必要があることです。コード設計の観点からは、これによりコードがより脆弱になります。
また、後でタイムアウトなどを使用してサービスのより複雑なオーケストレーションを行う場合は、チェーン内の他のフィルターに影響を与える可能性があるため、フィルターの使用が問題になる可能性があります。
推奨されるアプローチは、Apache CamelやSpring Integrationなどを使用するか、上記のStack Overflowリンクが示唆するようにAPI Gatewayパターンを実装することです。
通常、エンドポイントごとに外部サービスを呼び出したり、さまざまなユースケースでオーケストレーションの順序を変更したりする必要がないため、これはお勧めできません。一方、エンドポイントの周りの一般的なロジックにはフィルターが使用されます。
しかし、春 OAuth2ClientAuthenticationProcessingFilter が何をするかを見て、トークンを取得するために認証サーバーを呼び出します。
したがって、それは要件に要約されます。外部呼び出しの順序が確実で、サービスの回復力に注意を払っていれば、害はありません。