最新の安定バージョンについては、spring-cloud-function 4.3.0 を使用してください。 |
スタンドアロン 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 メソッドにマッピングしています。を使用すると、いくつかの関数を定義できます。」は機能構成を意味します。