4.0.1
Microsoft Azure
Azure (英語) アダプターは、Spring Cloud Function コンテキストをブートストラップし、必要に応じて Spring Boot 構成を使用して、Azure フレームワークからユーザー関数に関数呼び出しをチャネルします。Azure Functions は、Azure プラットフォームに固有のユーザーコード内のアノテーションを含む、非常にユニークで侵襲的なプログラミングモデルを備えています。ただし、Spring Cloud Function (具体的には org.springframework.cloud.function.adapter.azure.FunctionInvoker) によって提供される統合スタイルのため、このアノテーションベースのプログラミングモデルは、単純な java 関数 (Azure を意識しない関数) を構成する型 セーフな方法にすぎないことを理解することが重要です。Azure function として認識されます。必要なのは、FunctionInvoker を継承するハンドラーを作成し、関数ハンドラーメソッドを定義して構成し、handleRequest(..) メソッドへのコールバックを行うことだけです。このハンドラーメソッドは、アノテーション付きのメソッドパラメーターとして入力および出力の型を提供します (Azure がクラスをインスペクションし、JSON バインディングを作成できるようにします)。
public class UppercaseHandler extends FunctionInvoker<Message<String>, String> {
@FunctionName("uppercase")
public String execute(@HttpTrigger(name = "req", methods = {HttpMethod.GET,
HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
ExecutionContext context) {
Message<String> message = MessageBuilder.withPayload(request.getBody().get()).copyHeaders(request.getHeaders()).build();
return handleRequest(message, context);
}
}
Azure アノテーションを介して構成を提供するフォームとは別に、このハンドラーメソッドの本体内に Message のインスタンスを作成し、その結果を返す handleRequest(..) メソッドへのコールバックを作成することに注意してください。
遅延している実際のユーザー関数は次のようになります
@Bean
public Function<String, String> uppercase() {
return payload -> payload.toUpperCase();
}
OR
@Bean
public Function<Message<String>, String> uppercase() {
return message -> message.getPayload().toUpperCase();
}
メッセージを作成するときに、必要に応じて HTTP ヘッダーを効果的にコピーして利用できるようにすることができます。
org.springframework.cloud.function.adapter.azure.FunctionInvoker クラスには 2 つの便利なメソッド(handleRequest と handleOutput)があり、実際の関数呼び出しを委譲できるため、ほとんどの場合、関数には 1 行しかありません。
関数名(定義)は Azure の ExecutionContext.getFunctionName() メソッドから取得され、アプリケーションコンテキストで複数の関数を効果的にサポートします。
Azure へのアクセス ExecutionContext
Azure ランタイムによって com.microsoft.azure.functions.ExecutionContext の形式で提供されるターゲット実行コンテキストにアクセスする必要がある場合があります。たとえば、そのようなニーズの 1 つはロギングであるため、Azure コンソールに表示できます。
そのために、FunctionInvoker は ExecutionContext のインスタンスをメッセージヘッダーとして追加し、executionContext キーを介してそれを取得できるようにします。
@Bean
public Function<Message<String>, String> uppercase(JsonMapper mapper) {
return message -> {
String value = message.getPayload();
ExecutionContext context = (ExecutionContext) message.getHeaders().get("executionContext");
. . .
}
}JAR レイアウトに関する注記
Azure の実行時には Spring Cloud Function Web は必要ないため、Azure にデプロイする JAR を作成する前にこれを除外できますが、含めても使用されないため、そのままにしても問題ありません。Azure 上の関数アプリケーションは、Maven プラグインによって生成されたアーカイブです。この関数は、このプロジェクトによって生成された JAR ファイル内に存在します。このサンプルでは、Azure がハンドラークラスを見つけられるように、シンレイアウトを使用して実行可能ファイル jar として作成します。必要に応じて、通常のフラット JAR ファイルを使用することもできます。依存関係は含めないでください。
ビルドファイルの設定
Microsoft Azure で Spring Cloud Function アプリケーションを実行するには、クラウドプラットフォームプロバイダーが提供する Maven プラグインを利用できます。
Maven のアダプタープラグインを使用するには、プラグインの依存関係を pom.xml ファイルに追加します。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-azure</artifactId>
</dependency>
</dependencies> 次に、プラグインを構成します。resourceGroup、appName、その他のオプションのプロパティを指定して、アプリケーションに Azure 固有の構成を提供し、Azure に必要な function.json ファイルが生成されるように package ゴールの実行を追加する必要があります。完全なプラグインドキュメントは、プラグインリポジトリにあります [GitHub] (英語) 。
<plugin>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-functions-maven-plugin</artifactId>
<configuration>
<resourceGroup>${functionResourceGroup}</resourceGroup>
<appName>${functionAppName}</appName>
</configuration>
<executions>
<execution>
<id>package-functions</id>
<goals>
<goal>package</goal>
</goals>
</execution>
</executions>
</plugin>また、プラグインによってスキャンされるファイルが Azure functions ステージングディレクトリにあることを確認する必要があります (ステージングディレクトリとそのデフォルトの場所の詳細については、プラグインリポジトリ [GitHub] (英語) を参照してください)。
Spring Cloud Function アプリケーションを Maven を使用して Microsoft Azure にデプロイするためのサンプル pom.xml ファイル全体は、ここにあります。
| 現在のところ、Maven プラグインのみが利用可能です。Gradle プラグインは、クラウドプラットフォームプロバイダーによって作成されていません。 |
ビルド
./mvnw -U clean package
サンプルの実行
他の Spring Cloud Function サンプルと同様に、サンプルをローカルで実行できます。
および curl -H "Content-Type: text/plain" localhost:8080/api/uppercase -d '{"value": "hello foobar"}'。
az CLI アプリが必要になります(詳細については、https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-java-maven を参照してください)。Azure ランタイムに関数をデプロイするには:
$ az login $ mvn azure-functions:deploy
別のターミナルでこれを試してください: curl https://<azure-function-url-from-the-log>/api/uppercase (英語) -d '{"value": "hello foobar!"}'。上記の機能に正しい URL を使用していることを確認してください。または、Azure ダッシュボード UI で関数をテストすることもできます(関数名をクリックし、右側に移動してテストをクリックし、右下の実行をクリックします)。
Azure サンプルの関数の入力型は、"value" と呼ばれる単一のプロパティを持つ Foo です。以下のようなものでテストするには、これが必要です。
{
"value": "foobar"
}Azure サンプルアプリは、「機能しない」スタイルで記述されています(@Bean を使用)。機能スタイル(Function または ApplicationContextInitializer のみ)は、Azure での起動時に、従来の @Bean スタイルよりもはるかに高速であるため、@Beans (または @EnableAutoConfiguration)が必要ない場合は、これを選択することをお勧めします。ウォームスタートは影響を受けません。 |