12.2. Quarkus 関数の開発
Quarkus 関数プロジェクトを作成 したら、指定のテンプレートを変更して、関数にビジネスロジックを追加できます。これには、関数呼び出しと返されるヘッダーとステータスコードの設定が含まれます。
12.2.1. 前提条件
- 関数を開発する前に、OpenShift Serverless Functions の設定 のセットアップ手順を完了している。
12.2.2. Quarkus 関数テンプレートの構造
Knative (kn
) CLI を使用して Quarkus 関数を作成すると、プロジェクトディレクトリーは一般的な Maven プロジェクトと同様になります。さらに、プロジェクトには、関数の設定に使用される func.yaml
ファイルが含まれています。
http
および event
トリガー関数のテンプレート構造はいずれも同じです。
テンプレート構造
. ├── func.yaml 1 ├── mvnw ├── mvnw.cmd ├── pom.xml 2 ├── README.md └── src ├── main │ ├── java │ │ └── functions │ │ ├── Function.java 3 │ │ ├── Input.java │ │ └── Output.java │ └── resources │ └── application.properties └── test └── java └── functions 4 ├── FunctionTest.java └── NativeFunctionIT.java
- 1
- イメージ名とレジストリーを決定するために使用されます。
- 2
- プロジェクトオブジェクトモデル (POM) ファイルには、依存関係に関する情報などのプロジェクト設定が含まれています。このファイルを変更して、別の依存関係を追加できます。
追加の依存関係の例
... <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.8.0</version> <scope>test</scope> </dependency> </dependencies> ...
依存関係は、最初のコンパイル時にダウンロードされます。
- 3
- 関数プロジェクトには、
@Funq
アノテーションが付けられた Java メソッドが含まれている必要があります。このメソッドはFunction.java
クラスに配置できます。 - 4
- 関数のローカルでのテストに使用できる単純なテストケースが含まれます。
12.2.3. Quarkus 関数の呼び出しについて
クラウドイベントに応答する Quarkus プロジェクトや、簡単な HTTP 要求に応答する Quarkus プロジェクトを作成できます。Knative のクラウドイベントは HTTP 経由で POST 要求として転送されるため、いずれかの関数タイプは受信 HTTP 要求をリッスンして応答します。
受信要求が受信されると、Quarkus 関数は使用可能なタイプのインスタンスと合わせて呼び出されます。
呼び出しメソッド | インスタンスに含まれるデータタイプ | データの例 |
---|---|---|
HTTP POST 要求 | 要求のボディーに含まれる JSON オブジェクト |
|
HTTP GET 要求 | クエリー文字列のデータ |
|
|
|
|
以下の例は、以前の表に記載されている customerId
および productId
の購入データを受信して処理する関数です。
Quarkus 関数の例
public class Functions { @Funq public void processPurchase(Purchase purchase) { // process the purchase } }
購入データが含まれる、該当の Purchase
JavaBean クラスは以下のようになります。
クラスの例
public class Purchase { private long customerId; private long productId; // getters and setters }
12.2.3.1. 呼び出し例
以下のコード例は、withBeans
、withCloudEvent
、および withBinary
の 3 つの関数を定義します。
例
import io.quarkus.funqy.Funq; import io.quarkus.funqy.knative.events.CloudEvent; public class Input { private String message; // getters and setters } public class Output { private String message; // getters and setters } public class Functions { @Funq public Output withBeans(Input in) { // function body } @Funq public CloudEvent<Output> withCloudEvent(CloudEvent<Input> in) { // function body } @Funq public void withBinary(byte[] in) { // function body } }
Functions
クラスの withBeans
関数は、以下の方法で呼び出すことができます。
JSON ボディーが含まれる HTTP POST 要求:
$ curl "http://localhost:8080/withBeans" -X POST \ -H "Content-Type: application/json" \ -d '{"message": "Hello there."}'
クエリーパラメーターが含まれる HTTP GET 要求:
$ curl "http://localhost:8080/withBeans?message=Hello%20there." -X GET
バイナリーエンコーディングの
CloudEvent
オブジェクト:$ curl "http://localhost:8080/" -X POST \ -H "Content-Type: application/json" \ -H "Ce-SpecVersion: 1.0" \ -H "Ce-Type: withBeans" \ -H "Ce-Source: cURL" \ -H "Ce-Id: 42" \ -d '{"message": "Hello there."}'
構造化されたエンコーディングでの
CloudEvent
オブジェクト:$ curl http://localhost:8080/ \ -H "Content-Type: application/cloudevents+json" \ -d '{ "data": {"message":"Hello there."}, "datacontenttype": "application/json", "id": "42", "source": "curl", "type": "withBeans", "specversion": "1.0"}'
Functions
クラスの withCloudEvent
関数は、withBeans
関数と同様に CloudEvent
オブジェクトを使用して呼び出すことができます。ただし、withBeans
とは異なり、withCloudEvent
はプレーン HTTP 要求で呼び出すことはできません。
Functions
クラスの withBinary
関数は、以下にで呼び出すことができます。
バイナリーエンコーディングの
CloudEvent
オブジェクト:$ curl "http://localhost:8080/" -X POST \ -H "Content-Type: application/octet-stream" \ -H "Ce-SpecVersion: 1.0"\ -H "Ce-Type: withBinary" \ -H "Ce-Source: cURL" \ -H "Ce-Id: 42" \ --data-binary '@img.jpg'
構造化されたエンコーディングでの
CloudEvent
オブジェクト:$ curl http://localhost:8080/ \ -H "Content-Type: application/cloudevents+json" \ -d "{ \"data_base64\": \"$(base64 --wrap=0 img.jpg)\", \"datacontenttype\": \"application/octet-stream\", \"id\": \"42\", \"source\": \"curl\", \"type\": \"withBinary\", \"specversion\": \"1.0\"}"
12.2.4. CloudEvent 属性
CloudEvent の属性 (type
、subject
など) を読み取るか、書き込む必要がある場合は、CloudEvent<T>
汎用インターフェイスおよび CloudEventBuilder
ビルダーを使用できます。<T>
タイプパラメーターは使用可能なタイプのいずれかでなければなりません。
以下の例では、CloudEventBuilder
を使用して、購入処理の成功または失敗を返します。
public class Functions { private boolean _processPurchase(Purchase purchase) { // do stuff } public CloudEvent<Void> processPurchase(CloudEvent<Purchase> purchaseEvent) { System.out.println("subject is: " + purchaseEvent.subject()); if (!_processPurchase(purchaseEvent.data())) { return CloudEventBuilder.create() .type("purchase.error") .build(); } return CloudEventBuilder.create() .type("purchase.success") .build(); } }
12.2.5. Quarkus 関数の戻り値
関数は、許可された型のリストから任意の型のインスタンスを返すことができます。または、Uni<T>
型を返すこともできます。ここで、<T>
型パラメーターは、許可されている型の任意の型にすることができます。
Uni<T>
タイプは、返されるオブジェクトが受信したオブジェクトと同じ形式でシリアライズされるため、関数が非同期 API を呼び出す場合に便利です。以下に例を示します。
- 関数が HTTP 要求を受信すると、返されるオブジェクトが HTTP 応答のボディーに送信されます。
-
関数がバイナリーエンコーディングで
CloudEvent
オブジェクトを受信する場合に、返されるオブジェクトはバイナリーエンコードされたCloudEvent
オブジェクトの data プロパティーで送信されます。
以下の例は、購入リストを取得する関数を示しています。
コマンドの例
public class Functions { @Funq public List<Purchase> getPurchasesByName(String name) { // logic to retrieve purchases } }
- HTTP 要求経由でこの関数を呼び出すと、応答のボディーに購入されたリストが含まれる HTTP 応答が生成されます。
-
受信
CloudEvent
オブジェクト経由でこの関数を呼び出すと、data
プロパティーの購入リストが含まれるCloudEvent
応答が生成されます。
12.2.5.1. 使用可能なタイプ
関数の入力と出力は、void
、String
、または byte[]
型のいずれかです。さらに、プリミティブ型とそのラッパー (int
や Integer
など) にすることもできます。これらは、Javabean、マップ、リスト、配列、および特殊な CloudEvents<T>
タイプの複合オブジェクトにすることもできます。
マップ、リスト、配列、CloudEvents<T>
型の <T>
型パラメーター、および Javabeans の属性は、ここにリストされている型のみにすることができます。
例
public class Functions { public List<Integer> getIds(); public Purchase[] getPurchasesByName(String name); public String getNameById(int id); public Map<String,Integer> getNameIdMapping(); public void processImage(byte[] img); }
12.2.6. Quarkus 関数のテスト
Quarkus 関数は、コンピューターに対してローカルでテストできます。kn func create
を使用して関数を作成するときに作成されるデフォルトプロジェクトには、基本的な Maven テストを含む src/test/
ディレクトリーがあります。これらのテストは、必要に応じて拡張できます。
前提条件
- Quarkus 関数を作成している。
-
Knative (
kn
) CLI がインストールされている。
手順
- 関数のプロジェクトフォルダーに移動します。
Maven テストを実行します。
$ ./mvnw test
12.2.7. liveness および readiness プローブの値の上書き
Quarkus 関数の liveness
プローブ値と readiness
プローブ値をオーバーライドできます。これにより、関数に対して実行されるヘルスチェックを設定できます。
前提条件
- OpenShift Serverless Operator および Knative Serving がクラスターにインストールされている。
-
Knative (
kn
) CLI がインストールされている。 -
kn func create
を使用して関数を作成している。
手順
/health/liveness
パスと/health/readiness
パスを独自の値でオーバーライドします。これを行うには、関数ソースのプロパティーを変更するか、func.yaml
ファイルでQUARKUS_SMALLRYE_HEALTH_LIVENESS_PATH
およびQUARKUS_SMALLRYE_HEALTH_READINESS_PATH
環境変数を設定します。関数ソースを使用してパスを上書きするには、
src/main/resources/application.properties
ファイルの path プロパティーを更新します。quarkus.smallrye-health.root-path=/health 1 quarkus.smallrye-health.liveness-path=alive 2 quarkus.smallrye-health.readiness-path=ready 3
環境変数を使用してパスを上書きするには、
func.yaml
ファイルのbuild
ブロックにパス変数を定義します。build: builder: s2i buildEnvs: - name: QUARKUS_SMALLRYE_HEALTH_LIVENESS_PATH value: alive 1 - name: QUARKUS_SMALLRYE_HEALTH_READINESS_PATH value: ready 2
新しいエンドポイントを
func.yaml
ファイルに追加して、Knative サービスのコンテナーに適切にバインドされるようにします。deploy: healthEndpoints: liveness: /health/alive readiness: /health/ready