Introduzione a Spring Data Azure Cosmos DB

1. Panoramica

In questo tutorial impareremo a conoscere Azure Cosmos DB e come possiamo interagire con esso usando Spring Data.

2. Azure Cosmos DB

Azure Cosmos DB è il servizio di database distribuito a livello globale di Microsoft.

È un database NoSQL , che fornisce accordi sul livello di servizio completi per garanzie di velocità effettiva, latenza, disponibilità e coerenza. Inoltre, garantisce una disponibilità del 99,999% sia in lettura che in scrittura.

Azure Cosmos DB non offre solo due scelte di coerenza, ovvero coerente o non coerente. Invece, otteniamo cinque scelte di coerenza: forte , debolezza limitata , sessione , prefisso coerente ed eventuale .

Possiamo scalare in modo elastico sia la velocità effettiva che l'archiviazione di Azure Cosmos DB.

Inoltre, è disponibile in tutte le aree di Azure e offre una distribuzione globale chiavi in ​​mano poiché possiamo replicare i nostri dati in qualsiasi area di Azure semplicemente facendo clic su un pulsante. Questo ci aiuta ad avere i nostri dati più vicini ai nostri utenti in modo da poter soddisfare le loro richieste più velocemente.

È indipendente dallo schema in quanto non ha schema . Inoltre, non è necessario eseguire alcuna gestione degli indici per Azure Cosmos Db. Esegue automaticamente l'indicizzazione dei dati per noi.

Possiamo lavorare con Azure CosmosDb utilizzando diverse API standard come SQL, MongoDB, Cassandra, ecc.

3. Spring Data Azure Cosmos DB

Microsoft fornisce anche un modulo che ci consente di lavorare con Cosmos DB utilizzando Spring Data . Nella prossima sezione vedremo come possiamo usare Azure Cosmos DB in un'applicazione Spring Boot.

Nel nostro esempio, creeremo un'applicazione Web Spring che archivia un'entità del prodotto in un database Azure Cosmos ed esegue operazioni CRUD di base su di essa. Innanzitutto, dobbiamo configurare un account e un database nel portale di Azure, seguendo le istruzioni nella documentazione.

Se non si desidera creare un account nel portale di Azure, Azure fornisce anche l'emulatore di Azure Cosmos. Anche se questo non contiene tutte le funzionalità del servizio Azure Cosmos e ci sono alcune differenze, possiamo usarlo per lo sviluppo e il test locale.

Possiamo usare l'emulatore nel nostro ambiente locale in due modi: scaricando l'emulatore di Azure Cosmos sul nostro computer o eseguendo l'emulatore su Docker per Windows.

Sceglieremo l'opzione per eseguirlo su Docker per Windows. Eseguiamo il pull dell'immagine Docker eseguendo il seguente comando:

docker pull microsoft/azure-cosmosdb-emulator

Quindi possiamo eseguire l'immagine Docker e avviare il contenitore eseguendo i seguenti comandi:

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

Dopo aver configurato l'account e il database di Azure Cosmos DB nel portale di Azure o in Docker, possiamo continuare a configurarli nella nostra applicazione Spring Boot.

4. Utilizzo di Azure Cosmos DB in primavera

4.1. Configurazione di Spring Data Azure Cosmos DB con Spring

Iniziamo aggiungendo la dipendenza spring-data-cosmosdb nel nostro pom.xml :

 com.microsoft.azure spring-data-cosmosdb 2.3.0  

Per accedere ad Azure Cosmos DB dalla nostra applicazione Spring avremo bisogno dell'URI del nostro database, le sue chiavi di accesso e il nome del database. Quindi aggiungiamo tutti le proprietà di connessione nella nostra application.properties :

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

Possiamo trovare i valori delle proprietà di cui sopra dal portale di Azure. L'URI, la chiave primaria e la chiave secondaria saranno disponibili nella sezione chiavi del nostro Azure Cosmos DB nel portale di Azure.

Per connetterci ad Azure Cosmos DB dalla nostra applicazione dobbiamo creare un client. Per questo, dobbiamo estendere la classe AbstractCosmosConfiguration nella nostra classe di configurazione e aggiungere l' annotazione @EnableCosmosRepositories .

Questa annotazione cercherà le interfacce che estendono le interfacce del repository di Spring Data nel pacchetto specificato.

Abbiamo anche bisogno di configurare un bean di tipo 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. Creazione di un'entità per Azure Cosmos DB

Per interagire con Azure Cosmos DB, utilizziamo entità. Quindi, creiamo un'entità che archivieremo in Azure Cosmos DB. Per rendere la nostra classe Product un'entità, useremo l' annotazione @Document :

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

In questo esempio, abbiamo utilizzato l' attributo collection con il valore products , per indicare che questo sarà il nome del nostro contenitore nel database . Se non forniamo alcun valore per il parametro di raccolta , il nome della classe verrà utilizzato come nome del contenitore nel database.

Abbiamo anche definito un ID per il nostro documento. Possiamo creare un campo con il nome id nella nostra classe oppure possiamo annotare un campo con l' annotazione @Id . Qui abbiamo utilizzato il campo productid come ID documento.

Possiamo partizionare logicamente i nostri dati nel nostro contenitore utilizzando una chiave di partizione annotando un campo con @PartitionKey. Nella nostra classe, abbiamo utilizzato il campo productCategory come chiave di partizione.

Per impostazione predefinita, la politica di indicizzazione è definita da Azure, ma possiamo anche personalizzarla utilizzando l' annotazione @DocumentIndexingPolicy sulla nostra Entity Class.

Possiamo anche abilitare il blocco ottimistico per il nostro contenitore di entità creando un campo denominato _etag e annotandolo con @Version.

4.3. Definizione del repository

Ora creiamo un'interfaccia ProductRepository che estende CosmosRepository . Utilizzando questa interfaccia, possiamo eseguire operazioni CRUD sul nostro Azure Cosmos DB:

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

Come possiamo vedere, questo è definito in modo simile ad altri moduli Spring Data.

4.4. Verifica della connessione

Ora possiamo creare un test Junit per salvare un'entità prodotto in Azure Cosmos DB utilizzando il nostro 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"); } }

Eseguendo questo test Junit possiamo testare la nostra connessione con Azure Cosmos DB dalla nostra applicazione Spring.

5. conclusione

In questa esercitazione abbiamo appreso di Azure Cosmos DB. Inoltre, abbiamo appreso come accedere ad Azure Cosmos DB da un'applicazione Spring Boot, come creare entità e configurare un repository estendendo CosmosRepository per interagire con esso.

Il codice per l'esempio precedente è disponibile su GitHub.