本ハンズオンで、次の図のような簡易家計簿のAPIサーバーをSpring WebFlux.fnを使って実装します。 あえてSpring BootもDependency Injectionも使わないシンプルなWebアプリとして実装します。
またメモリ使用量を抑えることで、Cloud Foundry(Pivotal Web Services)上で安く運用し続けられるようにします。
本ハンズオンはReactorの知識が必要になります。以下のハンズオンを事前に実施しておくことを強くオススメします。
- https://github.com/reactor/lite-rx-api-hands-on
- https://docs.google.com/presentation/d/1-0NopTfA-CGiCNvKPDOH9ZDMHhazKuoT-_1R69Wp8qs
完成版のソースコードは https://github.com/making/webfluxfn-handson です。各章毎にbranchを作成しています。
ハンズオンコンテンツ
- はじめに 👈
- 簡易家計簿Moneygerプロジェクトの作成
- YAVIによるValidationの実装
- R2DBCによるデータベースアクセス
- Web UIの追加
- 例外ハンドリングの改善
- 収入APIの実装
- Spring Bootアプリに変換
- GraalVMのSubstrateVMでNative Imageにコンパイル
ウォームアップ
まずはSpring Bootを使ったSpring WebFlux.fnのHello World!アプリケーションを作成します。
以下のコマンドを実行すると、hello-fnフォルダに雛形プロジェクトが生成されます。Windowsの場合はGit BashなどのBash実行環境を利用してください。
curl https://start.spring.io/starter.tgz \
-d artifactId=hello-fn \
-d baseDir=hello-fn \
-d packageName=com.example \
-d dependencies=webflux \
-d applicationName=HelloFnApplication | tar -xzvf -
hello-fn/src/main/java/com/example/HelloFnApplication.java
を次のように修正してください。
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// ↓ここから追加
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
// ↑ここまで
@SpringBootApplication
public class HelloFnApplication {
// ↓ここから追加
@Bean
public RouterFunction<ServerResponse> routes() {
return RouterFunctions.route()
.GET("/", req -> ServerResponse.ok().syncBody("Hello World!"))
.build();
}
// ↑ここまで
public static void main(String[] args) {
SpringApplication.run(HelloFnApplication.class, args);
}
}
ビルドして実行してください。
syncBody
メソッドはSpring 5.2(Spring Boot 2.2)ではbodyValue
にrenameされます。
cd hello-fn
./mvnw clean package -DskipTests=true -DskipTests=true
java -jar target/hello-fn-0.0.1-SNAPSHOT.jar
$ curl localhost:8080
Hello World!
このあとはSpring Bootを使わない方法でアプリケーションを構築します。