Introduction à Spring Data Azure Cosmos DB

1. Vue d'ensemble

Dans ce didacticiel, nous découvrirons Azure Cosmos DB et comment nous pouvons interagir avec lui à l'aide de Spring Data.

2. Azure Cosmos DB

Azure Cosmos DB est le service de base de données distribué à l'échelle mondiale de Microsoft.

Il s'agit d'une base de données NoSQL , qui fournit des accords de niveau de service complets pour les garanties de débit, de latence, de disponibilité et de cohérence. En outre, il assure une disponibilité de 99,999% pour les lectures et les écritures.

Azure Cosmos DB ne donne pas seulement deux choix de cohérence, c'est-à-dire cohérent ou non cohérent. Au lieu de cela, nous obtenons cinq choix de cohérence: fort , obsolescence limitée , session , préfixe cohérent et éventuel .

Nous pouvons mettre à l'échelle de manière élastique le débit et le stockage d'Azure Cosmos DB.

De plus, il est disponible dans toutes les régions Azure et offre une distribution mondiale clé en main, car nous pouvons répliquer nos données dans toutes les régions Azure en cliquant simplement sur un bouton. Cela nous aide à rapprocher nos données de nos utilisateurs afin de pouvoir répondre plus rapidement à leurs demandes.

Il est indépendant du schéma car il n'a pas de schéma . De plus, nous n'avons pas besoin de faire de gestion d'index pour Azure Cosmos Db. Il fait automatiquement l'indexation des données pour nous.

Nous pouvons travailler avec Azure CosmosDb en utilisant différentes API standard telles que SQL, MongoDB, Cassandra, etc.

3. Spring Data Azure Cosmos DB

Microsoft fournit également un module qui nous permet de travailler avec Cosmos DB en utilisant Spring Data . Dans la section suivante, nous verrons comment nous pouvons utiliser Azure Cosmos DB dans une application Spring Boot.

Dans notre exemple, nous allons créer une application Web Spring qui stocke une entité de produit dans une base de données Azure Cosmos et y effectue des opérations CRUD de base. Tout d'abord, nous devons configurer un compte et une base de données dans le portail Azure, en suivant les instructions de la documentation.

Si nous ne voulons pas créer de compte sur le portail Azure, Azure fournit également l'émulateur Azure Cosmos. Même si cela ne contient pas toutes les fonctionnalités d'Azure Cosmos Service et qu'il existe certaines différences, nous pouvons l'utiliser pour le développement et les tests locaux.

Nous pouvons utiliser l'émulateur dans notre environnement local de deux manières: soit en téléchargeant l'émulateur Azure Cosmos sur notre machine, soit en exécutant l'émulateur sur Docker pour Windows.

Nous choisirons l'option pour l'exécuter sur Docker pour Windows. Tirons l'image Docker en exécutant la commande suivante:

docker pull microsoft/azure-cosmosdb-emulator

Ensuite, nous pouvons exécuter l'image Docker et démarrer le conteneur en exécutant les commandes suivantes:

set containerName=azure-cosmosdb-emulator set hostDirectory=%LOCALAPPDATA%\azure-cosmosdb-emulator.hostd md %hostDirectory% 2>nul docker run --name %containerName% --memory 2GB --mount "type=bind,source=%hostDirectory%,destination=C:\CosmosDB.Emulator\bind-mount" -P --interactive --tty microsoft/azure-cosmosdb-emulator

Une fois que nous avons configuré le compte et la base de données Azure Cosmos DB dans le portail Azure ou dans Docker, nous pouvons continuer à le configurer dans notre application Spring Boot.

4. Utilisation d'Azure Cosmos DB au printemps

4.1. Configurer Spring Data Azure Cosmos DB avec Spring

Nous commençons par ajouter la dépendance spring-data-cosmosdb dans notre pom.xml :

 com.microsoft.azure spring-data-cosmosdb 2.3.0  

Pour accéder à Azure Cosmos DB à partir de notre application Spring, nous aurons besoin de l'URI de notre base de données, de ses clés d'accès et du nom de la base de données. Ensuite, nous ajoutons tous les propriétés de connexion dans notre application.properties :

azure.cosmosdb.uri=cosmodb-uri azure.cosmosdb.key=cosmodb-primary-key azure.cosmosdb.secondaryKey=cosmodb-secondary-key azure.cosmosdb.database=cosmodb-name 

Nous pouvons trouver les valeurs des propriétés ci-dessus à partir du portail Azure. L'URI, la clé primaire et la clé secondaire seront disponibles dans la section des clés de notre Azure Cosmos DB dans le portail Azure.

Pour nous connecter à Azure Cosmos DB à partir de notre application, nous devons créer un client. Pour cela, nous devons étendre la classe AbstractCosmosConfiguration dans notre classe de configuration et ajouter l' annotation @EnableCosmosRepositories .

Cette annotation recherchera les interfaces qui étendent les interfaces de référentiel de Spring Data dans le package spécifié.

Nous devons également configurer un bean de type CosmosDBConfig :

@Configuration @EnableCosmosRepositories(basePackages = "com.baeldung.spring.data.cosmosdb.repository") public class AzureCosmosDbConfiguration extends AbstractCosmosConfiguration { @Value("${azure.cosmosdb.uri}") private String uri; @Value("${azure.cosmosdb.key}") private String key; @Value("${azure.cosmosdb.database}") private String dbName; private CosmosKeyCredential cosmosKeyCredential; @Bean public CosmosDBConfig getConfig() { this.cosmosKeyCredential = new CosmosKeyCredential(key); CosmosDBConfig cosmosdbConfig = CosmosDBConfig.builder(uri, this.cosmosKeyCredential, dbName) .build(); return cosmosdbConfig; } }

4.2. Création d'une entité pour Azure Cosmos DB

Afin d'interagir avec Azure Cosmos DB, nous utilisons des entités. Alors, créons une entité que nous allons stocker dans Azure Cosmos DB. Pour faire de notre classe Product une entité, nous utiliserons l' annotation @Document :

@Document(collection = "products") public class Product { @Id private String productid; private String productName; private double price; @PartitionKey private String productCategory; }

Dans cet exemple, nous avons utilisé l' attribut collection avec les produits de valeur , pour indiquer que ce sera le nom de notre conteneur dans la base de données . Si nous ne fournissons aucune valeur pour le paramètre de collection , le nom de la classe sera utilisé comme nom du conteneur dans la base de données.

Nous avons également défini un identifiant pour notre document. Nous pouvons soit créer un champ avec le nom id dans notre classe, soit annoter un champ avec l' annotation @Id . Ici, nous avons utilisé le champ productid comme identifiant du document.

Nous pouvons logiquement partitionner nos données dans notre conteneur en utilisant une clé de partition en annotant un champ avec @PartitionKey. Dans notre classe, nous avons utilisé le champ productCategory comme clé de partition.

Par défaut, la stratégie d'indexation est définie par Azure, mais nous pouvons également la personnaliser à l'aide de l' annotation @DocumentIndexingPolicy sur notre classe d'entité.

Nous pouvons également activer le verrouillage optimiste pour notre conteneur d'entités en créant un champ nommé _etag et en l'annotant avec @Version.

4.3. Définition du référentiel

Créons maintenant une interface ProductRepository qui étend CosmosRepository . À l'aide de cette interface, nous pouvons effectuer des opérations CRUD sur notre Azure Cosmos DB:

@Repository public interface ProductRepository extends CosmosRepository { List findByProductName(String productName); }

Comme nous pouvons le voir, cela est défini de la même manière que les autres modules Spring Data.

4.4. Tester la connexion

Nous pouvons maintenant créer un test Junit pour enregistrer une entité Product dans Azure Cosmos DB à l'aide de notre ProductRepository :

@SpringBootTest public class AzureCosmosDbApplicationManualTest { @Autowired ProductRepository productRepository; @Test public void givenProductIsCreated_whenCallFindById_thenProductIsFound() { Product product = new Product(); product.setProductid("1001"); product.setProductCategory("Shirt"); product.setPrice(110.0); product.setProductName("Blue Shirt"); productRepository.save(product); Product retrievedProduct = productRepository.findById("1001", new PartitionKey("Shirt")) .orElse(null); Assert.notNull(retrievedProduct, "Retrieved Product is Null"); } }

En exécutant ce test Junit, nous pouvons tester notre connexion avec Azure Cosmos DB à partir de notre application Spring.

5. Conclusion

Dans ce didacticiel, nous avons découvert Azure Cosmos DB. De plus, nous avons appris comment accéder à Azure Cosmos DB à partir d'une application Spring Boot, comment créer des entités et configurer un référentiel en étendant CosmosRepository pour interagir avec lui.

Le code de l'exemple ci-dessus est disponible à l'adresse over sur GitHub.