このガイドでは、ノンブロッキング Lettuce ドライバーを使用して Spring Data を使用して Redis と対話する関数リアクティブアプリケーションを作成するプロセスを説明します。

構築する

Spring Data Redis およびプロジェクト Reactor (英語) を使用して Redis データストアとリアクティブに対話し、ブロックせずに Coffee オブジェクトを保存および取得する Spring アプリケーションを構築します。このアプリケーションでは、Reactive Streams 仕様に基づいた Reactor の Publisher 実装、つまり Mono (0 または 1 の値を返すパブリッシャー用)および Flux (0 〜 n の値を返すパブリッシャー用)を使用します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Gradle でビルドするに進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-spring-data-reactive-redis/complete のコードに対して結果を確認できます。

Gradle でビルドする

Gradle でビルドする

最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Gradle (英語) および Maven (英語) を操作するために必要なコードはここに含まれています。どちらにも詳しくない場合は、Gradle で Java プロジェクトの構築または Maven で Java プロジェクトの構築を参照してください。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

 └──  src
     └──  main
         └──  java
             └──  hello

Gradle ビルドファイルを作成する

build.gradle

buildscript {
	ext {
		springBootVersion = '2.2.1.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-spring-data-reactive-redis'
    version =  '0.1.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
	mavenCentral()
}


dependencies {
	compile('org.springframework.boot:spring-boot-starter-data-redis-reactive')
	compile('org.springframework.boot:spring-boot-starter-webflux')
	compileOnly('org.projectlombok:lombok')
	testCompile('org.springframework.boot:spring-boot-starter-test')
	testCompile('io.projectreactor:reactor-test')
}

Spring Boot gradle プラグインは多くの便利な機能を提供します。

  • クラスパス上のすべての jar を収集し、単一の実行可能な「ü ber-jar」を構築します。これにより、サービスの実行とトランスポートがより便利になります。

  • public static void main() メソッドを検索して、実行可能なクラスとしてフラグを立てます。

  • Spring Boot の依存関係: GitHub (英語) と一致するようにバージョン番号を設定する組み込みの依存関係リゾルバーを提供します。任意のバージョンをオーバーライドできますが、デフォルトでブートの選択されたバージョンのセットになります。

Maven でビルドする

Maven でビルドする

最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Maven (英語) で作業するために必要なコードはここに含まれています。Maven に詳しくない場合は、Maven で Java プロジェクトの構築を参照してください。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

 └──  src
     └──  main
         └──  java
             └──  hello

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>reactive-redis</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webflux</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>io.projectreactor</groupId>
			<artifactId>reactor-test</artifactId>
			<scope>test</scope>
		</dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Spring Boot Maven プラグインは多くの便利な機能を提供します。

  • クラスパス上のすべての jar を収集し、単一の実行可能な「ü ber-jar」を構築します。これにより、サービスの実行とトランスポートがより便利になります。

  • public static void main() メソッドを検索して、実行可能なクラスとしてフラグを立てます。

  • Spring Boot の依存関係: GitHub (英語) と一致するようにバージョン番号を設定する組み込みの依存関係リゾルバーを提供します。任意のバージョンをオーバーライドできますが、デフォルトでブートの選択されたバージョンのセットになります。

IDE でビルドする

IDE でビルドする

ドメインクラスを作成する

コーヒーカタログに保存するコーヒーの種類を表すクラスを作成します。

src/main/java/hello/Coffee.java

package hello;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Coffee {
  private String id;
  private String name;
}
この例では、Lombok を使用して、コンストラクターおよびいわゆる「データクラス」メソッド(アクセサー / ミューテーター、equals()toString()hashCode())の定型コードを削除します。

リアクティブ Redis 操作をサポートする Spring Bean を使用して構成クラスを作成する

src/main/java/hello/CoffeeConfiguration.java

package hello;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class CoffeeConfiguration {
  @Bean
  ReactiveRedisOperations<String, Coffee> redisOperations(ReactiveRedisConnectionFactory factory) {
    Jackson2JsonRedisSerializer<Coffee> serializer = new Jackson2JsonRedisSerializer<>(Coffee.class);

    RedisSerializationContext.RedisSerializationContextBuilder<String, Coffee> builder =
        RedisSerializationContext.newSerializationContext(new StringRedisSerializer());

    RedisSerializationContext<String, Coffee> context = builder.value(serializer).build();

    return new ReactiveRedisTemplate<>(factory, context);
  }

}

Spring Bean を作成して、開始時にサンプルデータをアプリケーションにロードします。

アプリケーションを複数回(再)起動する可能性があるため、以前の実行からまだ存在している可能性のあるデータを最初に削除する必要があります。これを行うには、flushAll() (Redis)サーバーコマンドを使用します。既存のデータをフラッシュしたら、小さな Flux を作成し、各コーヒー名を Coffee オブジェクトにマップし、それをリアクティブ Redis リポジトリに保存します。次に、すべての値についてレポにクエリを実行し、表示します。

src/main/java/hello/CoffeeLoader.java

package hello;

import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;

import javax.annotation.PostConstruct;
import java.util.UUID;

@Component
public class CoffeeLoader {
  private final ReactiveRedisConnectionFactory factory;
  private final ReactiveRedisOperations<String, Coffee> coffeeOps;

  public CoffeeLoader(ReactiveRedisConnectionFactory factory, ReactiveRedisOperations<String, Coffee> coffeeOps) {
    this.factory = factory;
    this.coffeeOps = coffeeOps;
  }

  @PostConstruct
  public void loadData() {
    factory.getReactiveConnection().serverCommands().flushAll().thenMany(
        Flux.just("Jet Black Redis", "Darth Redis", "Black Alert Redis")
            .map(name -> new Coffee(UUID.randomUUID().toString(), name))
            .flatMap(coffee -> coffeeOps.opsForValue().set(coffee.getId(), coffee)))
        .thenMany(coffeeOps.keys("*")
            .flatMap(coffeeOps.opsForValue()::get))
        .subscribe(System.out::println);
  }
}

RestController を作成して、アプリケーションに外部インターフェースを提供する

src/main/java/hello/CoffeeController.java

package hello;

import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class CoffeeController {
  private final ReactiveRedisOperations<String, Coffee> coffeeOps;

  CoffeeController(ReactiveRedisOperations<String, Coffee> coffeeOps) {
    this.coffeeOps = coffeeOps;
  }

  @GetMapping("/coffees")
  public Flux<Coffee> all() {
    return coffeeOps.keys("*")
        .flatMap(coffeeOps.opsForValue()::get);
  }
}

アプリケーションを実行可能にする

このサービスをデプロイの従来の WAR (英語) ファイルとして外部アプリケーションサーバーにパッケージ化することは可能ですが、以下に示すより単純なアプローチでは、スタンドアロンアプリケーションが作成されます。古き良き Java main() メソッドによって駆動される単一の実行可能な JAR ファイルにすべてをパッケージ化します。途中で、外部インスタンスにデプロイする代わりに、Netty (英語) 非同期「コンテナー」を HTTP ランタイムとして埋め込むための Spring のサポートを使用します。

src/main/java/hello/Application.java

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

@SpringBootApplication は、次のすべてを追加する便利なアノテーションです。

  • @Configuration: アプリケーションコンテキストの Bean 定義のソースとしてクラスにタグを付けます。

  • @EnableAutoConfiguration: クラスパス設定、他の Bean、さまざまなプロパティ設定に基づいて Bean の追加を開始するよう Spring Boot に指示します。例: spring-webmvc がクラスパスにある場合、このアノテーションはアプリケーションに Web アプリケーションとしてフラグを立て、DispatcherServlet のセットアップなどの主要な動作をアクティブにします。

  • @ComponentScan: Spring に、hello パッケージ内の他のコンポーネント、構成、サービスを探して、コントローラーを検出させるように指示します。

main() メソッドは、Spring Boot の SpringApplication.run() メソッドを使用してアプリケーションを起動します。XML が 1 行もないことに気付きましたか? web.xml ファイルもありません。この Web アプリケーションは 100% 純粋な Java であり、接続機能やインフラストラクチャの構成に対処する必要はありませんでした。

実行可能 JAR を構築する

コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、リソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、デプロイできます。

Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar build/libs/gs-spring-data-reactive-redis-0.1.0.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-spring-data-reactive-redis-0.1.0.jar
ここで説明する手順は、実行可能な JAR を作成します。クラシック WAR ファイルを作成することもできます。

アプリケーションをテストする

アプリケーションが実行されたため、HTTPie、curl、またはお気に入りのブラウザーから http://localhost:8080/coffees にアクセスしてテストできます。

要約

おめでとう! Spring Data と Redis を使用して、完全にリアクティブでノンブロッキングのデータベースアクセスを行う Spring アプリケーションを開発しました。

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください: GitHub (英語)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。