MongoDB、Kotlin、およびSpring WebFluxを使ったリアクティブフロー

MongoDB、Kotlin、Spring WebFluxを使用したリアクティブフロー

1. Overview

このチュートリアルでは、Spring Data Reactive MongoDBとSpringSSeEmitterを使用して、完全にリアクティブなフローを紹介する簡単なアプリケーションを作成します。

一方では、Spring Data Reactive MongoDBを適用して、Mongoリアクティブデータベースを介してデータを保存し、それをServer-Sent-Eventsメカニズムと組み合わせて、サブスクライブしたクライアントに受信データについて通知します。

さらに、SpringBootのKotlinサポートを利用します。

それでは、始めましょう!

2. セットアップ

まず、pom.xmlにSpring Data ReactiveMongoDB依存関係を追加してMavenプロジェクトを構成する必要があります。


    org.springframework.boot
    spring-boot-starter-data-mongodb-reactive

さらに、Kotlinを使用するには、同じファイルにKotlin standard libraryを追加する必要があります。


    org.jetbrains.kotlin
    kotlin-stdlib

これで、アプリケーションの開発を開始する準備が整いました。 リアクティブプログラミングとMongoDBをサポートするように環境の構成を開始しますので、始めましょう。

3. リアクティブMongo構成

最初にしなければならないことは、リアクティブなSpring Dataをサポートするようにプロジェクトを構成することです。 AbstractReactiveMongoConfigurationから拡張する新しいクラスを追加して、MongoリアクティブクライアントとSpring DataRepositoryを構成します。

@Configuration
@EnableReactiveMongoRepositories(
  basePackageClasses = arrayOf(EventRepository::class))
class MongoConfig : AbstractReactiveMongoConfiguration() {

    override fun getDatabaseName() = "mongoDatabase"

    override fun reactiveMongoClient() = mongoClient()

    @Bean
    fun mongoClient() = MongoClients.create()

    @Bean
    override fun reactiveMongoTemplate()
     = ReactiveMongoTemplate(mongoClient(), databaseName)
}

非反応的な方法でMongoDBと対話する場合は、この構成は必要ありません。 Spring Dataリポジトリが. である場所を構成に通知するには、@EnableReactiveMongoRepositoriesタグを追加する必要があることに注意してください。

これで、主な機能の実装を開始する準備が整いました。 The first thing we’ll do is develop a new data class to persist the incoming information and then, a related Spring Data reactive repository to manage that persistence.

4. 資料

documentは、MongoDBデータベースにデータを保存する単位です。 このユニットは、データの保存にJSONスタイルを使用します。

このプロジェクトでは、idname:の2つの属性を持つEvent と呼ばれるダミーのdocument を使用して単純にします。

@Document
class Event(id: String, name: String)

5. Spring DataReactiveリポジトリ

Spring Dataの抽象化の目的は、永続ストアのデータアクセスレイヤーを実装するために必要なコードの量を減らすことです。

したがって、リアクティブバージョンは同じように機能するため、リアクティブリポジトリ全体を実装するための次の行があります。

interface EventRepository : ReactiveMongoRepository

6. コントローラ

Controllerクラスは、リアクティブデータが保存されるたびに Server-Sent Eventを送信する責任があります。

メソッドsaveAndSend は、最初に受信データをMongo Reactiveデータベースに保存し、このアクションをEventRepository. に委任します。

したがって、新しいEvents.を作成して保存する新しいエンドポイントを追加します

まず、Kotlinコードを見てみましょう。

@GetMapping(value = "/save",
  produces = arrayOf(MediaType.TEXT_EVENT_STREAM_VALUE))
fun saveAndSend(@RequestParam("eventName") eventName: String) =
  eventRepository
    .save(Event(UUID.randomUUID().toString(), eventName))
    .flux()

ご覧のように、新しいデータを保存した後、Spring Data Reactive Repositoryはサブスクライブされたクライアントに送信されるSSEを返します。

この時点で、リアクティブなKotlinサーバーサイドプロジェクトが完成したと言えます。 Spring Bootアプリケーションを実行するために必要な要素はすべて揃っています。

したがって、ここでは、作成したすべてのServer-Sentイベントを送受信するための単純なWebクライアントを作成する方法を見ていきます。

7. 加入者

ここに、データを保存し、サーバーから変更を受信できるシンプルなWebクライアントがあります。

それがどのように実装されているか見てみましょう:

7.1. データを送る

クライアントは、入力されたイベント名をSave new event buttonを介して保存します。

これにより、サーバーエンドポイントsaveEventにHTTPリクエストが送信されます。

7.2. データを受信する

一方、クライアントはsave endpointもリッスンします。 各プログラミング言語には、SSEを管理するための特定のフレームワークがあることに注意してください。

ただし、この例では、可能な限りシンプルにします。

8. 結論

結論として、Spring Data MongoDB has been updated to leverage the reactive programming model introduced in Spring Framework 5。 これで、このプログラミングパラダイムとサーバー送信イベントを使用する簡単な方法ができました。

したがって、これは、従来の非リアクティブアプリケーションの代替手段として、データベースブロッキングの問題を想定しています。

この例の実装は、in the GitHub projectで確認できます。

これはMavenベースのプロジェクトなので、Spring Bootアプリケーションを実行して、動作を確認します。 最初にMongoDBサーバーを実行することを忘れないでください。