Reaktiver Fluss mit MongoDB, Kotlin und Spring WebFlux

Reactive Flow mit MongoDB, Kotlin und Spring WebFlux

1. Overview

In diesem Tutorial schreiben wir eine einfache Anwendung, die einen vollständig reaktiven Fluss mit Spring Data Reactive MongoDB und SpringSSeEmitterzeigt.

Auf der einen Seite wenden wir Spring Data Reactive MongoDB an, um Daten über eine Mongo-reaktive Datenbank zu speichern und sie mit dem Server-Sent-Events-Mechanismus zu kombinieren, um abonnierte Clients über eingehende Daten zu benachrichtigen.

Darüber hinaus nutzen wir die Kotlin-Unterstützung von Spring Boot.

So lass uns anfangen!

2. Konfiguration

Zunächst müssen wir unser Maven-Projekt konfigurieren und die Spring Data Reactive MongoDB-Abhängigkeit in unserenpom.xml hinzufügen:


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

Um Kotlin verwenden zu können, müssen wir außerdem dieKotlin standard library derselben Datei hinzufügen:


    org.jetbrains.kotlin
    kotlin-stdlib

Jetzt können wir mit der Entwicklung unserer Anwendung beginnen. Wir werden mit der Konfiguration der Umgebung beginnen, um reaktive Programmierung und Mongo DB zu unterstützen. Los geht's!

3. Reaktive Mongo-Konfiguration

Als erstes müssen wir unser Projekt so konfigurieren, dass es reaktive Federdaten unterstützt. Wir werden eine neue Klasse hinzufügen, die vonAbstractReactiveMongoConfiguration reicht, um den reaktiven Mongo-Client und das Spring Data Repository zu konfigurieren:

@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)
}

Diese Konfiguration ist nicht erforderlich, wenn wir nicht reaktiv mit MongoDB interagieren möchten. Beachten Sie, dass wir das@EnableReactiveMongoRepositories-Tag hinzufügen müssen, um der Konfiguration mitzuteilen, wo sich unsere Spring Data-Repositorys in.  befinden

Anschließend können wir mit der Implementierung der Hauptfunktionalität beginnen. 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. Dokumentieren

document ist die Einheit zum Speichern von Daten in einer MongoDB-Datenbank. Dieses Gerät verwendet den JSON-Stil zum Speichern von Daten.

In unserem Projekt werden wir es einfach halten, indem wir einen Dummydocument calledEvent mit zwei Attributen verwenden:id undname:

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

5. Spring Data Reactive Repository

Ziel der Spring Data-Abstraktion ist es, die Menge an Code zu reduzieren, die zum Implementieren von Datenzugriffsschichten für Persistenzspeicher erforderlich ist.

Folglich funktioniert die reaktive Version genauso, sodass wir die folgende Zeile haben, um ein gesamtes reaktives Repository zu implementieren:

interface EventRepository : ReactiveMongoRepository

6. Regler

Die KlasseController ist für das Senden von Server-Sent Event verantwortlich, wenn reaktive Daten gespeichert werden.

Die MethodesaveAndSend will speichert zuerst die eingehenden Daten in unserer Mongo Reactive-Datenbank und delegiert diese Aktion an unsereEventRepository. 

Infolgedessen fügen wir einen neuen Endpunkt hinzu, der neueEvents.erstellt und speichert

Schauen wir uns zunächst den Kotlin-Code an:

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

Wie wir sehen können, gibt das reaktive Spring Data-Repository nach dem Speichern der neuen Daten eine SSE zurück, die an den abonnierten Client gesendet wird.

An dieser Stelle können wir sagen, dass wir ein komplettes reaktives Kotlin-Server-Projekt haben. Wir haben bereits alle erforderlichen Elemente, um unsere Spring Boot-Anwendung auszuführen.

Daher sehen wir uns nun an, wie Sie einen einfachen Webclient erstellen, um alle von uns erstellten Server-Sent-Ereignisse zu senden und zu empfangen.

7. Teilnehmer

Hier haben wir einen einfachen Web-Client, der Daten speichern und Änderungen vom Server empfangen kann.

Mal sehen, wie es implementiert wird:

7.1. Schicke Daten

Der Client speichert den eingegebenen Ereignisnamen über die SchaltflächeSave new event .

Dies führt wiederum zu einer HTTP-Anforderung an unseren ServerendpunktsaveEvent:

7.2. Empfange Daten

Andererseits hört der Client auchsave endpoint ab. Beachten Sie, dass jede Programmiersprache ihre spezifischen Frameworks zum Verwalten von SSE hat.

In unserem Beispiel halten wir es jedoch so einfach wie möglich:

8. Fazit

Zusammenfassend istSpring Data MongoDB has been updated to leverage the reactive programming model introduced in Spring Framework 5. Wir haben jetzt eine einfache Möglichkeit, dieses Programmierparadigma und Server-Sent-Ereignisse zu verwenden.

Daher setzt dies alternativ zu den herkömmlichen nicht reaktiven Anwendungen die Probleme mit der Datenbankblockierung voraus.

Die Implementierung dieses Beispiels kann inin the GitHub project überprüft werden.

Dies ist ein Maven-basiertes Projekt. Führen Sie dann die Spring Boot-Anwendung aus, um zu sehen, wie sie funktioniert. Vergessen Sie nicht, zuerst den Mongo DB-Server auszuführen.