Flux réactif avec MongoDB, Kotlin et Spring WebFlux

Flux réactif avec MongoDB, Kotlin et Spring WebFlux

1. Overview

Dans ce didacticiel, nous allons écrire une application simple présentant un flux entièrement réactif à l'aide de Spring Data Reactive MongoDB et SpringSSeEmitter.

D'un côté, nous appliquerons Spring Data Reactive MongoDB pour enregistrer les données via une base de données réactive Mongo et les combinerons avec le mécanisme Server-Sent-Events pour informer les clients abonnés des données entrantes.

De plus, nous profiterons du support Kotlin de Spring Boot.

Alors, commençons!

2. Installer

Tout d'abord, nous devons configurer notre projet Maven en ajoutant la dépendance Spring Data Reactive MongoDB dans nospom.xml:


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

De plus, pour utiliser Kotlin, nous devrons ajouter lesKotlin standard library au même fichier:


    org.jetbrains.kotlin
    kotlin-stdlib

Nous sommes maintenant prêts à commencer à développer notre application. Nous allons commencer à configurer l'environnement pour prendre en charge la programmation réactive et Mongo DB, alors allons-y!

3. Configuration Mongo réactive

La première chose à faire est de configurer notre projet pour prendre en charge les données réactives Spring. Nous allons ajouter une nouvelle classe s'étendant deAbstractReactiveMongoConfiguration pour configurer le client réactif Mongo et le référentiel de données Spring:

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

Cette configuration n'est pas nécessaire si nous voulons interagir avec MongoDB de manière non réactive. Notez que nous devons ajouter la balise@EnableReactiveMongoRepositories pour indiquer à la configuration où se trouvent nos référentiels Spring Data. 

Suite à cela, nous sommes maintenant prêts à commencer à mettre en œuvre la fonctionnalité principale. 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

Ledocument est l'unité de stockage des données dans une base de données MongoDB. Cette unité utilise le style JSON pour stocker les données.

Dans notre projet, nous allons garder les choses simples en utilisant un facticedocument calléEvent avec deux attributs:id etname:

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

5. Référentiel réactif Spring Data

L'abstraction de Spring Data a pour objectif de réduire la quantité de code nécessaire à la mise en œuvre des couches d'accès aux données pour les magasins de persistance.

Par conséquent, la version réactive fonctionne de la même manière, nous aurons donc la ligne suivante pour implémenter tout un référentiel réactif:

interface EventRepository : ReactiveMongoRepository

6. Manette

La classeController sera responsable de l'envoi d'un Server-Sent Event chaque fois que des données réactives sont sauvegardées.

La méthodesaveAndSend enregistre d'abord les données entrantes dans notre base de données Mongo Reactive en déléguant cette action à nosEventRepository. 

Par conséquent, nous allons ajouter un nouveau point de terminaison qui crée et enregistre de nouveauxEvents.

Voyons d'abord le code 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()

Comme nous pouvons le constater, après avoir enregistré les nouvelles données, le référentiel réactif de Spring Data renverra un SSE qui sera envoyé au client abonné.

À ce stade, nous pouvons dire que nous avons un projet complet côté serveur Kotlin réactif. Nous avons déjà tous les éléments nécessaires pour exécuter notre application Spring Boot.

Par conséquent, nous allons maintenant examiner comment créer un client Web simple pour envoyer et recevoir tous nos événements envoyés par le serveur.

7. Abonné

Nous avons ici un client Web simple qui pourra sauvegarder des données et recevoir les modifications du serveur.

Voyons comment cela est mis en œuvre:

7.1. Envoyer des données

Le client enregistrera le nom de l'événement saisi via le boutonSave new event .

Ceci, à son tour, fera une requête HTTP à notre point de terminaison de serveursaveEvent:

7.2. Recevoir des données

D'autre part, le client écoutera également le point d'envoisave . Notez que chaque langage de programmation possède ses propres cadres pour gérer SSE.

Cependant, pour notre exemple, nous allons garder les choses aussi simples que possible:

8. Conclusion

En conclusion,Spring Data MongoDB has been updated to leverage the reactive programming model introduced in Spring Framework 5. Nous disposons maintenant d’un moyen simple d’utiliser ce paradigme de programmation et les événements Server-Sent.

Par conséquent, cela suppose une alternative aux applications non réactives traditionnelles aux problèmes de blocage de la base de données.

L'implémentation de cet exemple peut être vérifiéein the GitHub project.

Il s'agit d'un projet basé sur Maven. Exécutez donc l'application Spring Boot pour voir comment elle fonctionne. N'oubliez pas d'exécuter d'abord le serveur Mongo DB.