最新の安定バージョンについては、spring-cloud-function 5.0.2 を使用してください。 |
スタンドアロン Web アプリケーション
関数は、HTTP エンドポイントとして自動的にエクスポートできます。
spring-cloud-function-web モジュールには、Spring Boot Web アプリケーション(MVC サポート付き)に含まれているときにアクティブになる自動構成があります。簡単な開始体験が必要な場合に備えて、すべてのオプションの依存関係を収集する spring-cloud-starter-function-web もあります。
Web 構成をアクティブにすると、アプリには MVC エンドポイント(デフォルトでは "/" にありますが、spring.cloud.function.web.path で構成可能)があり、関数名が URL パスの一部になるアプリケーションコンテキストで関数にアクセスするために使用できます。サポートされているコンテンツ型はプレーンテキストと JSON です。
| SCF は Functional Bean を REST エンドポイントとしてエクスポートする機能を提供しますが、Spring MVC/WebFlux などの代替ではないことを理解することが重要です。SCF は主に、ステートレス機能を HTTP 経由で公開したいだけのステートレスサーバーレスパターンに対応するためのものです。 |
| メソッド | パス | リクエスト | レスポンス | ステータス |
|---|---|---|---|---|
GET | /{supplier} | - | 指定されたサプライヤーからのアイテム | 200 OK |
POST | /{consumer} | JSON オブジェクトまたはテキスト | 入力をミラーリングし、リクエスト本文をコンシューマーにプッシュします | 202 承認済み |
PUT | /{consumer} | JSON オブジェクトまたはテキスト | 入力をミラーリングし、リクエスト本文をコンシューマーにプッシュします | 202 承認済み |
DELETE | /{consumer} | JSON オブジェクトまたはテキスト | - | 204 コンテンツがありません |
POST | /{function} | JSON オブジェクトまたはテキスト | 名前付き関数を適用した結果 | 200 OK |
PUT | /{function} | JSON オブジェクトまたはテキスト | 名前付き関数を適用した結果 | 200 OK |
GET | /{function}/{item} | - | アイテムをオブジェクトに変換し、関数を適用した結果を返します | 200 OK |
上の表が示すように、エンドポイントの動作はメソッドと受信リクエストデータの型によって異なります。受信データが単一値であり、ターゲット関数が明らかに単一値として宣言されている場合 (つまり、コレクションまたは Flux を返さない場合)、レスポンスにも単一値が含まれます。複数値のレスポンスの場合、クライアントは Accept: text/event-stream を送信することで、サーバーから送信されたイベントストリームをリクエストできます。
Message<?> で入力と出力を使用して宣言された関数とコンシューマーは、リクエストヘッダーをメッセージヘッダーとして認識し、出力メッセージヘッダーは HTTP ヘッダーに変換されます。body がない場合、または null の場合、メッセージのペイロードは body または空の文字列になります。
テキストを POST する場合、レスポンス形式は、コンテンツネゴシエーションに応じて、Spring Boot 2.0 以前のバージョンとは異なる場合があります(最良の結果を得るには、コンテンツ型を指定し、ヘッダーを受け入れます)。
このようなアプリケーションをテストする方法の詳細と例については、[ 関数アプリケーションのテスト ] を参照してください。
HTTP リクエストパラメーター
前の表からお気づきのように、引数をパス変数(つまり、/{function}/{item})として関数に渡すことができます。例: localhost:8080/uppercase/foo は、入力パラメーターが foo である uppercase 関数を呼び出します。
これは推奨されるアプローチであり、ほとんどのユースケースに適合しますが、HTTP リクエストパラメーター (例: localhost:8080/uppercase/foo?name=Bill) を処理しなければならない場合があります。フレームワークは、HTTP リクエストパラメーターを HTTP ヘッダーと同様に扱い、ヘッダーキー http_request_param の Message ヘッダーに格納します。その値はリクエストパラメーターの Map になります。そのため、それらにアクセスするには、関数の入力シグネチャーで Message 型 (例: Function<Message<String>, String>) を受け入れる必要があります。便宜上、HeaderUtils.HTTP_REQUEST_PARAM 定数を提供します。
関数マッピングルール
カタログに関数(コンシューマーなど)が 1 つしかない場合、パス内の名前はオプションです。つまり、カタログ curl -H "Content-Type: text/plain" localhost:8080/uppercase -d hello に uppercase 関数しかない場合、curl -H "Content-Type: text/plain" localhost:8080/ -d hello 呼び出しは同じです。
複合関数は、パイプまたはコンマを使用して関数名を区切ることができます(パイプは、URL パスでは有効ですが、コマンドラインで入力するのは少し厄介です)。例: curl -H "Content-Type: text/plain" localhost:8080/uppercase,reverse -d hello。
カタログに複数の関数がある場合、各関数はエクスポートされ、関数名がパスの一部としてマップされます (例: localhost:8080/uppercase)。このシナリオでは、spring.cloud.function.definition プロパティを提供することで、特定の関数または関数構成をルートパスにマップできます。
以下に例を示します。
--spring.cloud.function.definition=foo|bar
上記のプロパティは、"foo" および "bar" 関数を構成し、構成された関数を "/" パスにマップします。
同じプロパティは、URL を介して関数を解決できない場合にも機能します。例: URL は localhost:8080/uppercase である可能性がありますが、uppercase 関数はありません。ただし、関数 foo と bar があります。この場合、localhost:8080/uppercase は foo|bar に解決されます。これは、URL を使用して特定の情報を伝達する場合に特に役立ちます。これは、実際の URL の値を含む uri というメッセージヘッダーがあり、ユーザーがそれを評価と計算に使用できるようにするためです。
関数フィルタリングルール
カタログに複数の関数がある場合、特定の関数または関数構成のみをエクスポートする必要がある場合があります。その場合は、エクスポートする関数を ; で区切ってリストした同じ spring.cloud.function.definition プロパティを使用できます。この場合、ルートパスに何もマップされず、リストされていない関数 (構成を含む) はエクスポートされないことに注意してください。
以下に例を示します。
--spring.cloud.function.definition=foo;bar
これにより、カタログで使用可能な関数の数(localhost:8080/foo など)に関係なく、関数 foo と関数 bar のみがエクスポートされます。
--spring.cloud.function.definition=foo|bar;baz
これにより、カタログで使用可能な関数の数(localhost:8080/foo,bar など)に関係なく、関数構成 foo|bar と関数 baz のみがエクスポートされます。
HTTP ヘッダーの伝播
デフォルトでは、ほとんどのリクエスト HttpHeaders がレスポンス HttpHeaders にコピーされます。特定のヘッダーをフィルター処理する必要がある場合は、コンマで区切られた spring.cloud.function.http.ignored-headers を使用してそれらのヘッダーの名前を指定できます。例: spring.cloud.function.http.ignored-headers=foo,bar。
Spring Cloud Function と CRUD REST
ここまでで、関数が REST エンドポイントとしてエクスポートされ、さまざまな HTTP メソッドを使用して呼び出せることが明確になったはずです。言い換えれば、GET、POST、PUT などを介して単一の関数をトリガーできます。
ただし、これは常に望ましいとは限らず、CRUD の概念には当てはまりません。また、SCF は Spring Web スタックのすべての機能をサポートしておらず、サポートするつもりもありませんが、フレームワークは、単一の関数を特定の HTTP メソッドにマッピングできる CRUD マッピングのサポートを提供します。これは、spring.cloud.function.http.<method-name> プロパティによって実行されます。
以下に例を示します。
spring.cloud.function.http.GET=uppercase;reverse;foo|bar spring.cloud.function.http.POST=reverse spring.cloud.function.http.DELETE=deleteById
ご覧のとおり、ここでは spring.cloud.function.definition プロパティと同じルールを使用して関数をさまざまな HTTP メソッドにマッピングしています。を使用すると、いくつかの関数を定義できます。」は機能構成を意味します。