IK.AM

@making's tech note


Spring WebFlux.fnハンズオン - 1. はじめに


本ハンズオンで、次の図のような簡易家計簿のAPIサーバーをSpring WebFlux.fnを使って実装します。 あえてSpring BootもDependency Injectionも使わないシンプルなWebアプリとして実装します。

image

またメモリ使用量を抑えることで、Cloud Foundry(Pivotal Web Services)上で安く運用し続けられるようにします。

完成例

本ハンズオンはReactorの知識が必要になります。以下のハンズオンを事前に実施しておくことを強くオススメします。

完成版のソースコードは https://github.com/making/webfluxfn-handson です。各章毎にbranchを作成しています。

ハンズオンコンテンツ

  1. はじめに 👈
  2. 簡易家計簿Moneygerプロジェクトの作成
  3. YAVIによるValidationの実装
  4. R2DBCによるデータベースアクセス
  5. Web UIの追加
  6. 例外ハンドリングの改善
  7. 収入APIの実装
  8. Spring Bootアプリに変換
  9. 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を使わない方法でアプリケーションを構築します。


✒️️ Edit  ⏰ History  🗑 Delete