1. 概述
在本教程中,我们将了解Azure Cosmos DB以及我们如何使用Spring Data与其进行交互。
2. Azure Cosmos数据库
Azure Cosmos DB是Microsoft的全球分布式数据库服务。
它是一个NoSQL数据库,为吞吐量、延迟、可用性和一致性保证提供全面的服务级别协议。此外,它确保了99.999%的读写可用性。
Azure Cosmos DB并没有只给出两种一致性选择,即要么一致要么不一致。相反,我们有五个一致性选择:strong、bounded staleness、session、consistent prefix和eventual。
我们可以弹性扩展Azure Cosmos DB的吞吐量和存储。
此外,它在所有Azure区域中都可用,并提供统包全球分发,因为我们只需单击一个按钮就可以在任何Azure区域复制我们的数据。这有助于我们让数据更接近用户,以便我们可以更快地满足他们的请求。
它与模式无关,因为它没有模式。此外,我们不需要为Azure Cosmos Db做任何索引管理。它会自动为我们编制数据索引。
我们可以使用不同的标准API(例如SQL、MongoDB、Cassandra等)来处理Azure CosmosDb。
3. Spring Data Azure Cosmos DB
Microsoft还提供了一个模块,允许我们使用Spring Data来处理CosmosDB。在下一节中,我们将了解如何在Spring Boot应用程序中使用Azure Cosmos DB。
在我们的示例中,我们将创建一个Spring Web应用程序,该应用程序将产品实体存储在Azure Cosmos数据库中并对其执行基本的CRUD操作。首先,我们需要按照文档中的说明在Azure门户中配置帐户和数据库。
如果我们不想在Azure门户上创建帐户,Azure还提供了Azure Cosmos模拟器。尽管它不包含Azure Cosmos服务的所有功能,并且存在一些差异,但我们可以使用它进行本地开发和测试。
我们可以通过两种方式在本地环境中使用模拟器:在我们的机器上下载Azure Cosmos模拟器,或者在适用于Windows的Docker上运行模拟器。
我们将选择在Docker for Windows上运行它的选项。让我们通过运行以下命令来拉取Docker镜像:
docker pull mcr.microsoft.com/cosmosdb/windows/azure-cosmos-emulator
然后我们可以运行Docker镜像并通过运行以下命令启动容器:
md $env:LOCALAPPDATA\CosmosDBEmulator\bind-mount 2>null
docker run --name azure-cosmosdb-emulator --memory 2GB --mount
"type=bind,source=$env:LOCALAPPDATA\CosmosDBEmulator\bind-mount,destination=C:\CosmosDB.Emulator\bind-mount"
--interactive --tty -p 8081:8081 -p 8900:8900 -p 8901:8901 -p 8902:8902 -p 10250:10250
-p 10251:10251 -p 10252:10252 -p 10253:10253 -p 10254:10254 -p 10255:10255 -p 10256:10256 -p 10350:10350
mcr.microsoft.com/cosmosdb/windows/azure-cosmos-emulator
一旦我们在Azure门户或Docker中配置了Azure Cosmos DB帐户和数据库,我们就可以继续在我们的Spring Boot应用程序中配置它。
4. 在Spring中使用Azure Cosmos DB
4.1 使用Spring配置Spring Data Azure Cosmos DB
我们首先在pom.xml中添加spring-data-cosmosdb依赖项:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>spring-data-cosmosdb</artifactId>
<version>2.3.0</version>
</dependency>
要从我们的Spring应用程序访问Azure Cosmos DB,我们需要数据库的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门户的Azure Cosmos DB的keys部分中提供。
要从我们的应用程序连接到Azure Cosmos DB,我们需要创建一个客户端。为此,我们需要在配置类中扩展AbstractCosmosConfiguration类并添加@EnableCosmosRepositories注解。
此注解将扫描指定包中扩展Spring Data Repository接口的接口。
我们还需要配置一个CosmosDBConfig类型的bean:
@Configuration
@EnableCosmosRepositories(basePackages = "cn.tuyucheng.taketoday.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来指示这将是我们容器在数据库中的名称。如果我们没有为collection参数提供任何值,那么类名将用作数据库中的容器名。
我们还为文档定义了一个id。我们可以在我们的类中创建一个名为id的字段,也可以使用@Id注解来标注一个字段。这里我们使用了productid字段作为文档ID。
我们可以通过使用分区键对容器中的数据进行逻辑分区,方法是使用@PartitionKey标注字段。在我们的类中,我们使用productCategory字段作为分区键。
默认情况下,索引策略由Azure定义,但我们也可以通过在我们的实体类上使用@DocumentIndexingPolicy注解来自定义它。
我们还可以通过创建一个名为_etag的字段并使用@Version对其进行标注来为我们的实体容器启用乐观锁定。
4.3 定义Repository
现在让我们创建一个扩展CosmosRepository的ProductRepository接口。使用此接口,我们可以在Azure Cosmos DB上执行CRUD操作:
@Repository
public interface ProductRepository extends CosmosRepository<Product, String> {
List findByProductName(String productName);
}
正如我们所看到的,它的定义方式与其他Spring Data模块类似。
4.4 测试连接
现在我们可以创建一个JUnit测试来使用我们的ProductRepository将Product实体保存在Azure Cosmos DB中:
@Spring BootTest
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测试,我们可以从Spring应用程序测试我们与Azure Cosmos DB的连接。
5. 总结
在本教程中,我们了解了Azure Cosmos DB。此外,我们学习了如何从Spring Boot应用程序访问Azure Cosmos DB,如何通过扩展CosmosRepository来创建实体和配置Repository以与之交互。
与往常一样,本教程的完整源代码可在GitHub上获得。