Couchbase Server : les outils du développeur Java

Comme nous vous présentons dans cette série d'articles, Couchbase est une solution très intéressante de base de données NoSQL orientée documents et une bonne alternative à MongoDB. Cependant, une base de données (qu'elle soit relationnelle ou NoSQL) sans application associée n'est pas très utile.

Ainsi, nous allons donc, à travers cet article, partir à la découverte des différents outils nous permettant de créer une application utilisant cette persistance : accès aux données, requêtage, outils divers de développement et de tests, en particulier dans l'environnement Java.

Afin de nous projeter plus facilement dans l'utilisation des différents outils et illustrer chaque mode d'accès, nous allons prendre pour exemple la récupération d'auteurs présents dans le serveur Couchbase. Cet article a pour but de fournir un ensemble de ressources permettant d'avoir quelques notions et de savoir par quoi commencer.

Accès aux données

Couchbase laisse le choix sur la façon de stocker les données : le format peut être JSON ou binaire. On peut ainsi considérer la solution à la fois comme base de données orientée documents et comme base de données clé-valeur.

De même, Couchbase offre plusieurs possibilités pour accéder aux documents comme nous allons le voir tout de suite.

Différentes façons de requêter des documents

Les documents peuvent être recherchés en utilisant ces différentes techniques :

  • Accès par clé (c’est-à-dire par l'identifiant du document) : effectuer des opérations sur un seul document
  • Vues MapReduce : requêter des documents à l’aide de fonctions Map/Reduce (solution historique)
  • N1QL : langage de requêtage pour Couchbase proche du SQL, solution très puissante, à préférer aux vues MapReduce !
  • Full Text Search : pour faire de la recherche plein text

Pour les 3 derniers points (et donc les principaux), il est nécessaire de stocker ses documents sous format JSON, c’est donc le format à utiliser, sauf besoins spécifiques !

Différentes façons d’interagir avec le serveur

Il existe de nombreuses façons d'interagir avec un serveur Couchbase afin de le configurer et d'accéder à ses données, elles peuvent vous être utiles au cours du développement d'applications (vérifier des données, automatiser des initialisations, …). Voici un petit récapitulatif des différents outils :

Administration serveur et buckets Accès aux données (CRUD)
Couchbase Web Console
Command-line Interface (CLI)
cbq (CLI) ✔ (N1QL seulement)
REST API

Pour récupérer les informations de l'auteur ayant comme nom La Fontaine, on pourra utiliser le shell cbq de cette façon :

cbq --script="select * from \`my-bucket\` where type = 'User' and name = 'La Fontaine'"

Couches d’abstraction d’accès aux données

L'ensemble des fonctionnalités de Couchbase est disponible via une API REST, mais d'autres mécanismes ont été développés pour faciliter le traitement sur les données.

En effet, comme il est expliqué au début de la documentation, il est déconseillé d'utiliser directement l'API REST (protection des données, scalabilité et montées de version pouvant être cassantes).

Pour cela, nous allons utiliser les outils mis à disposition : les SDK.

SDK

Des kits de développement sont fournis par Couchbase dans de nombreux langages : C, Go, Java, .NET, Node.js, PHP, Python et Ruby.

Nous allons nous intéresser dans cet article au développement dans l'écosystème Java.

Connecteurs

Des connecteurs sont égalements disponibles pour les outils suivants : Elasticsearch, Hadoop, Kafka, Spark, Talend, ainsi que des drivers JDBC/ODBC.

SDK Java

Le SDK Java est une couche d'abstraction permettant un accès aux données avec le langage N1QL. Les interactions peuvent se faire de façon synchrone ou asynchrone (programmation réactive).

Voici une liste d'opérations disponibles :

Par exemple, pour récupérer les données de l'auteur ayant comme clé author::123, on pourra écrire :

RawJsonDocument rawJsonDocument = bucket.get("author::123", RawJsonDocument.class);
Author author123 = authorMapper.fromJson(rawJsonDocument.content());

Pour en apprendre plus sur ce sujet, je vous conseille vivement ces 2 articles très complets sur une introduction au SDK et sur l'utilisation du N1QL.

Couchbase assure en interne la cohérence des données. Cependant, on peut spécifier le niveau de cohérence à l'enregistrement d'un document (par exemple attendre la réplication du document avant d'acquitter l'enregistrement).

Spring Data Couchbase

Spring Data Couchbase est comme son nom l'indique le projet Spring Data pour Couchbase. Il permet dans l'environnement Spring de faciliter la gestion de l'accès aux documents d'une base de données Couchbase.

La documentation officielle présente très bien l'ensemble des possibilités.

Si cela est possible, je préconise d'utiliser cette solution plutôt que le SDK seul. Il vous sera alors possible d'utiliser les fonctionnalités présentées dans la suite de ce chapitre. Si besoin, le SDK et ses fonctionnalités sont toujours disponibles depuis Spring Data.

Entités

Spring Data intègre la notion d'entités d'objets du domaine : chaque document Couchbase correspond ainsi à une instance de l'entité.

Pour spécifier à Spring qu'une classe est liée à un document Couchbase, il suffit d'ajouter l'annotation @Document à la classe représentant l'entité.

Pour chaque attribut de l'entité, on pourra positionner l'annotation @Field et éventuellement modifier le nom de l'attribut utilisé dans Couchbase. Vous pouvez en apprendre d'avantage dans cette partie de la documentation.

L'identifiant d'une entité correspond à la clé du document Couchbase associé. Spring Data Couchbase vous aide dans la génération de cet identifiant : utilisation d'attributs, de préfixe, de suffixe, etc. L'ensemble des possibilités est expliqué dans cette partie de la documentation.

Voici à quoi pourrait ressembler l'entité représentant un auteur :

@Document
public class Author {

    @IdPrefix
    private String prefix = "author";

    @Id
    @GeneratedValue
    private String id;

    @IdAttribute
    @Field(value = "name")
    private String lastname;
    
    //...
}

Repository

Il est possible de créer très simplement un repository permettant l'accès à vos entités stockées dans Couchbase. Pour cela, il suffit de créer une interface étendant CouchbaseRepository:

interface UserRepository extends CouchbaseRepository<User, Long> {}

Ce nouveau repository possédera ainsi des méthodes de base pour les opérations CRUD (création, lecture, mise à jour, suppression) sur une ou plusieurs instances d'une entité.

D'autres opérations plus avancées sont également disponibles :

  • des recherches filtrées et triées en étendant la classe CouchbasePagingAndSortingRepository
  • la création de requêtes N1QL en étendant la classe N1qlCouchbaseRepository

Comme avec les autres projets Spring Data, vous pouvez également déclarer des Query Methods dans votre interface dont le nom suffira à créer la requête associée :

interface AuthorRepository extends CouchbaseRepository<Author, Long> {
    Author findByLastname(String lastname);
}

Ainsi, il sera très facile de récupérer l'auteur par son nom :

Author laFontaine = authorRepository.findByLastName("La Fontaine");

Spring Data Couchbase ajoute dans chaque document un attribut qui lui permet de connaître son type (par exemple pour récupérer l'ensemble des instances d'une entité). Par défaut, cet attribut est nommé _class.

Pour continuer à approfondir ce sujet, je vous propose de lire cet article.

Utilisation en développement

Il n'existe pas à ma connaissance de base de données embarquée (contrairement à H2 ou Embedded MongoDB par exemple), le plus simple est donc d'utiliser Docker pour le développement.

Démarrer un serveur pour le développement

Lorsque vous voulez démarrer une application localement, vous pouvez utiliser Docker pour lancer le serveur Couchbase associé.

Pour cela, on peut tout d'abord utiliser l'image Docker officielle et l'initialiser manuellement, voici un exemple.

On peut également automatiser l'initialisation, par exemple avec Docker Compose.

Utiliser un serveur pour les tests automatisés

De la même façon, on peut utiliser Docker pour les tests qui nécessitent l'utilisation de la base de données.

En vue d'automatiser un maximum ce process, je conseille d'utiliser Test Containers dans sa version Couchbase.

Afin d'en savoir plus sur l'utilisation de TestContainers Couchbase, je vous conseille cet article pour le SDK Java et celui-ci pour Spring Data Couchbase.

Couchmove

Couchmove est un outil de migration de données pour Couchbase, similaire à Liquibase, Flyway ou mongobee.

Il permet de gérer les migrations entre deux versions d'une application. Il existe 3 types de fichiers pouvant être traités par Couchmove :

  • Script(s) N1QL : requête(s) N1QL lancée(s) sur le serveur Couchbase ;
  • Design document(s) : fonction(s) JavaScript associée(s) à une vue MapReduce ;
  • Document : document JSON inséré tel quel dans le bucket (avec le nom du fichier comme id du document).

Voici trouverez ici la documentation complète.

Point d'attention : la convention de nommage des ids des documents Couchbase est laissée au soin de l'utilisateur. Le :: est parfois conseillé, ce pattern est toutefois à proscrire pour Couchmove (: faisant partie des caractères interdits dans le nom des fichiers sur Windows).

Conclusion

Nous avons vu que le développement d'applications avec la solution Couchbase est facilité par de nombreux outils, officiels ou non. Il existe beaucoup de documentation sur internet pour découvrir l'ensemble de ces outils.

Cependant, le nombre important d'outils peut rendre l'intégration et le cablâge un peu complexe. Pour éviter cela, je ne peux que vous conseillez d'utiliser JHipster pour générer votre socle applicatif, l'intégration de Couchbase et des différents outils étant intégralement gérée (Spring Data Couchbase, Couchmove, TestContainers, gestion des entités...). Vous pouvez retrouver un exemple d'application générée ici.