1. Обзор
В этом уроке мы узнаем о базе данных Azure Cosmos DB и о том, как мы можем взаимодействовать с ней, используя данные Spring.
2. Azure Cosmos DB
Azure Cosmos DB является глобально распределенной службой баз данных Microsoft.
Это база данных NoSQL , которая предоставляет комплексные соглашения об уровне обслуживания для обеспечения пропускной способности, задержки, доступности и согласованности. Кроме того, он обеспечивает доступность 99,999% как для чтения, так и для записи.
Azure Cosmos DB не предоставляет только два варианта согласованности, т. Е. либо согласованную, либо непротиворечивую. Вместо этого мы получаем пять вариантов согласованности: сильная , ограниченная тупость , сеанс , согласованный префикс и возможный .
Мы можем эластично масштабировать как пропускную способность, так и хранилище Azure Cosmos DB.
Кроме того, он доступен во всех регионах Azure и предлагает глобальное распространение “под ключ”, поскольку мы можем реплицировать наши данные в любых регионах Azure, просто нажав кнопку. Это помогает нам приблизить наши данные к нашим пользователям, чтобы мы могли быстрее обслуживать их запросы.
Это схема-агностик , поскольку у него нет схемы . Кроме того, нам не нужно управлять индексами для Azure Cosmos Db. Он автоматически выполняет индексацию данных для нас.
Мы можем работать с Azure CosmosDB, используя различные стандартные API, такие как SQL, MongoDB, Cassandra и т. Д.
3. Весенние данные Azure Cosmos DB
Microsoft также предоставляет модуль, который позволяет нам работать с Cosmos DB с использованием Spring Data . В следующем разделе мы рассмотрим, как мы можем использовать Azure Cosmos DB в приложении Spring Boot.
В нашем примере мы создадим веб-приложение Spring, которое хранит сущность продукта в базе данных Azure Cosmos и выполняет с ней основные операции CRUD. Во-первых, нам нужно настроить учетную запись и базу данных на портале Azure, следуя инструкциям в документации .
Если мы не хотим создавать учетную запись на портале Azure, Azure также предоставляет эмулятор Azure Cosmos. Несмотря на то, что он не содержит всех функций службы Azure Cosmos и есть некоторые различия, мы можем использовать его для локальной разработки и тестирования.
Мы можем использовать эмулятор в нашей локальной среде двумя способами: либо загрузив эмулятор Azure Cosmos на свой компьютер, либо запустив эмулятор в Docker для Windows.
Мы выберем вариант, чтобы запустить его в Docker для Windows. Давайте вытащим образ Docker, выполнив следующую команду:
docker pull microsoft/azure-cosmosdb-emulator
Затем мы можем запустить образ Docker и запустить контейнер, выполнив следующие команды:
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
После настройки учетной записи и базы данных Azure Cosmos DB на портале Azure или в Docker мы можем продолжить настройку в нашем приложении Spring Boot.
4. Использование Azure Cosmos DB весной
4.1. Настройка Spring Data Azure Cosmos DB с помощью Spring
Мы начнем с добавления зависимости spring-data-cosmosdb в ваш pom.xml :
com.microsoft.azure spring-data-cosmosdb 2.3.0
Чтобы получить доступ к Azure Cosmos DB из нашего приложения Spring, нам понадобится URL-адрес вашей базы данных, ключи доступа и имя базы данных. Затем мы добавим свойства соединения в наш application.properties :
azure.cosmosdb.uri=cosmodb-uri azure.cosmosdb.key=cosmodb-primary-key azure.cosmosdb.secondaryKey=cosmodb-secondary-key azure.cosmosdb.database=cosmodb-name
Мы можем найти значения вышеуказанных свойств на портале Azure. URI, первичный ключ и вторичный ключ будут доступны в разделе ключи нашей базы данных Azure Cosmos на портале Azure.
Чтобы подключиться к Azure Cosmos DB из нашего приложения, нам нужно создать клиент. Для этого нам нужно расширить Абстрактную конфигурацию Космоса класс в нашем классе конфигурации и добавить @EnableCosmosRepositories аннотацию.
Эта аннотация будет сканировать интерфейсы, расширяющие интерфейсы репозитория Spring Data в указанном пакете.
Нам также нужно настроить компонент типа 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. Создание сущности для Azure Cosmos DB
Для взаимодействия с Azure Cosmos DB мы используем сущности. Итак, давайте создадим сущность, которую мы будем хранить в Azure Cosmos DB. Чтобы сделать наш Продукт класс сущностью, мы будем использовать @Document аннотацию:
@Document(collection = "products") public class Product { @Id private String productid; private String productName; private double price; @PartitionKey private String productCategory; }
В этом примере мы использовали атрибут collection со значением products , чтобы указать, что это будет имя нашего контейнера в базе данных . Если мы не указываем никакого значения для параметра collection , то имя класса будет использоваться в качестве имени контейнера в базе данных.
Мы также определили идентификатор для нашего документа. Мы можем либо создать поле с именем id в нашем классе, либо аннотировать поле аннотацией @Id . Здесь мы использовали поле productid в качестве идентификатора документа.
Мы можем логически разделить наши данные в нашем контейнере, используя ключ раздела, аннотируя поле с помощью @PartitionKey. В нашем классе мы использовали поле Категория продукта в качестве ключа раздела.
По умолчанию политика индексирования определяется Azure, но мы также можем настроить ее с помощью аннотации @DocumentIndexingPolicy в нашем классе сущностей.
Мы также можем включить оптимистическую блокировку для нашего entitycontainer, создав поле с именем _tag и аннотировав его @Version.
4.3. Определение репозитория
Теперь давайте создадим ProductRepository интерфейс, который расширяет Репозиторий Cosmos|/. Используя этот интерфейс, мы можем выполнять операции CRUD в нашей базе данных Azure Cosmos DB:
@Repository public interface ProductRepository extends CosmosRepository{ List findByProductName(String productName); }
Как мы видим, это определяется аналогично другим модулям данных Spring.
4.4. Тестирование соединения
Теперь мы можем создать тест Junit для сохранения сущности Product в Azure Cosmos DB с помощью нашего 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"); } }
Запустив тест Junit, мы можем проверить ваше соединение с Azure Cosmos DB из нашего приложения Spring.
5. Заключение
В этом уроке мы узнали о Azure Cosmos DB. Кроме того, мы узнали, как получить доступ к Azure Cosmos DB из приложения Spring Boot, как создавать сущности и настраивать репозиторий, расширяя CosmosRepository для взаимодействия с ним.
Код для приведенного выше примера доступен на GitHub .