1. Обзор
В этом руководстве мы узнаем об Azure Cosmos DB и о том, как мы можем взаимодействовать с ней с помощью Spring Data.
2. База данных Azure Cosmos
Azure Cosmos DB — это глобально распределенная служба базы данных Майкрософт.
Это база данных NoSQL , которая предоставляет всеобъемлющие соглашения об уровне обслуживания для пропускной способности, задержки, доступности и гарантий согласованности. Кроме того, он обеспечивает доступность на уровне 99,999% как для чтения, так и для записи.
Azure Cosmos DB не предоставляет только два варианта согласованности, т. е. согласованность или несогласованность. Вместо этого мы получаем пять вариантов согласованности: сильное
, ограниченное устаревание
, сеанс
, согласованный префикс
и возможное
.
Мы можем эластично масштабировать как пропускную способность, так и хранилище Azure Cosmos DB.
Кроме того, он доступен во всех регионах Azure и предлагает готовое глобальное распространение, поскольку мы можем реплицировать наши данные в любых регионах Azure, просто нажав кнопку. Это помогает нам располагать наши данные ближе к нашим пользователям, чтобы мы могли быстрее обслуживать их запросы.
Он независим от схемы, поскольку не имеет schema . Кроме того, нам не нужно выполнять какое-либо управление индексами для Azure Cosmos Db. Он автоматически индексирует данные для нас.
Мы можем работать с Azure CosmosDb, используя различные стандартные API, такие как SQL, MongoDB, Cassandra и т. д.
3. Spring Data 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 Azure Cosmos DB с помощью Spring
Начнем с добавления зависимости spring-data-cosmosdb в наш pom.xml
:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>spring-data-cosmosdb</artifactId>
<version>2.3.0</version>
</dependency>
Чтобы получить доступ к Azure Cosmos DB из нашего приложения Spring, нам потребуется URI нашей базы данных, ее ключи доступа и имя базы данных. Затем мы добавим свойства соединения в наш 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 DB на портале Azure.
Чтобы подключиться к Azure Cosmos DB из нашего приложения, нам нужно создать клиент. Для этого нам нужно расширить класс AbstractCosmosConfiguration
в нашем классе конфигурации и добавить аннотацию @EnableCosmosRepositories
.
Эта аннотация будет сканировать интерфейсы, которые расширяют интерфейсы репозитория Spring Data в указанном пакете.
Нам также нужно настроить bean-компонент типа CosmosDBConfig
:
@Configuration
@EnableCosmosRepositories(basePackages = "com.foreach.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. Чтобы сделать наш класс Product сущностью,
мы будем использовать аннотацию @Document
:
@Document(collection = "products")
public class Product {
@Id
private String productid;
private String productName;
private double price;
@PartitionKey
private String productCategory;
}
В этом примере мы использовали атрибут collection
со значением products
, чтобы указать, что это будет имя нашего контейнера в базе данных . Если мы не укажем никакого значения для параметра коллекции
, то имя класса будет использоваться в качестве имени контейнера в базе данных.
Мы также определили идентификатор для нашего документа. Мы можем либо создать поле с именем id
в нашем классе, либо аннотировать поле аннотацией @Id
. Здесь мы использовали поле productid
в качестве идентификатора документа.
Мы можем логически разделить наши данные в нашем контейнере, используя ключ раздела, аннотируя поле с помощью @PartitionKey.
В нашем классе мы использовали поле productCategory
в качестве ключа раздела.
По умолчанию политика индексирования определяется Azure, но мы также можем настроить ее, используя аннотацию @DocumentIndexingPolicy
в нашем классе сущностей.
Мы также можем включить оптимистическую блокировку для нашего контейнера сущностей, создав поле с именем _etag
и аннотировав его @Version.
4.3. Определение репозитория
Теперь давайте создадим интерфейс ProductRepository
, расширяющий CosmosRepository
. Используя этот интерфейс, мы можем выполнять операции CRUD в нашей базе данных Azure Cosmos:
@Repository
public interface ProductRepository extends CosmosRepository<Product, String> {
List findByProductName(String productName);
}
Как мы видим, это определяется аналогично другим модулям Spring Data.
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 .