本指南将引导您完成使用过程弹簧数据卡桑德拉构建一个存储数据并从中检索数据的应用程序阿帕奇·卡桑德拉,一个高性能的分布式数据库。
您将构建什么
您将使用 Spring Data Cassandra 从 Apache Cassandra 存储和检索数据。
你需要什么
- 约15分钟
- 最喜欢的文本编辑器或 IDE
- JDK 11或以后
- 格拉德尔 4+或梅文 3.2+
- 您也可以将代码直接导入到 IDE 中:
- 弹簧工具套件 (STS)
- 智能理念
- VSCode
如何完成本指南
像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。
要从头开始,请继续从 Spring 初始化开始.
要跳过基础知识,请执行以下操作:
- 下载并解压缩本指南的源存储库,或使用吉特:
git clone https://github.com/spring-guides/gs-accessing-data-cassandra.git
- 光盘成
gs-accessing-data-cassandra/initial
- 跳转到设置数据库.
完成后,您可以根据 中的代码检查结果。gs-accessing-data-cassandra/complete
从 Spring 初始化开始
你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。
手动初始化项目:
- 导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。
- 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
- 单击依赖关系,然后选择 Apache Cassandra 的 Spring 数据。
- 单击生成。
- 下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。
如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。 |
您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。 |
设置数据库
在构建应用程序之前,您需要设置 Cassandra 数据库。Apache Cassandra 是一个开源的 NoSQL 数据存储,针对大型数据集中的快速读取和快速写入进行了优化。在接下来的小节中,您可以选择使用DataStax Astra DBCassandra-as-a-Service或在Docker容器上本地运行它。本指南介绍如何使用DataStax Astra Cassandra-as-a-Service的免费层,以便您可以在几分钟内在Cassandra数据库中创建和存储数据。
在 () 中添加以下属性以配置 Spring Data Cassandra:application.properties
src/main/resources/application.properties
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS
spring.data.cassandra.request.timeout=10s
spring.data.cassandra.connection.connect-timeout=10s
spring.data.cassandra.connection.init-query-timeout=10s
该属性定义启动时要执行的架构操作,可以是 、、 或 。我们用于创建所需的架构。请参阅的spring.data.cassandra.schema-action
none
create
create-if-not-exists
recreate
recreate-drop-unused
create-if-not-exists
文档了解详情。
在生产环境中设置此项是一种很好的安全做法,以避免在启动时创建或重新创建数据库。 |
我们还增加了默认超时,首次创建架构或远程网络连接速度较慢时可能需要默认超时。
阿斯特拉数据库设置
若要使用托管数据库,可以使用DataStax Astra DBCassandra-as-a-Service。未使用时,它会缩放到零。按照中的说明进行操作以下链接以创建名为 的数据库和密钥库。spring_cassandra
Spring Boot Astra 启动器拉入并自动配置所有必需的依赖项。要使用DataStax Astra DB,您需要将其添加到:pom.xml
<dependency>
<groupId>com.datastax.astra</groupId>
<artifactId>astra-spring-boot-starter</artifactId>
<version>0.1.13</version>
</dependency>
对于 Gradle,请添加到您的文件中。 |
Astra 自动配置需要配置信息才能连接到您的云数据库。您需要:
- 定义凭据:客户端 ID、客户端密码和应用程序令牌。
- 选择具有云区域、数据库 ID 和密钥空间 () 的实例。
spring_cassandra
然后,您需要在 () 中添加这些额外的属性来配置 Astra:application.properties
src/main/resources/application.properties
# Credentials to Astra DB
astra.client-id=<CLIENT_ID>
astra.client-secret=<CLIENT_SECRET>
astra.application-token=<APP_TOKEN>
# Select an Astra instance
astra.cloud-region=<DB_REGION>
astra.database-id=<DB_ID>
astra.keyspace=spring_cassandra
码头工人设置
如果您希望在容器化环境中本地运行 Cassandra,请运行以下 docker run 命令:
docker run -p 9042:9042 --rm --name cassandra -d cassandra:4.0.7
创建容器后,访问 Cassandra 查询语言 shell:
docker exec -it cassandra cqlsh
并为应用程序创建一个密钥空间:
CREATE KEYSPACE spring_cassandra WITH replication = {'class' : 'SimpleStrategy', 'replication_factor' : 1};
现在你已经运行了你的数据库,配置Spring Data Cassandra来访问你的数据库。
在 () 中添加以下属性以连接到本地数据库:application.properties
src/main/resources/application.properties
spring.data.cassandra.local-datacenter=datacenter1
spring.data.cassandra.keyspace-name=spring_cassandra
或者,为了方便捆绑 Cassandra 和相关 Kubernetes 生态系统项目,您可以在K8ssandra大约10分钟后。
创建 Cassandra 实体
在此示例中,您将定义一个(兽医)实体。以下清单显示了类(在 中):Vet
Vet
src/main/java/com/example/accessingdatacassandra/Vet.java
package com.example.accessingdatacassandra;
import java.util.Set;
import java.util.UUID;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;
@Table
public class Vet {
@PrimaryKey
private UUID id;
private String firstName;
private String lastName;
private Set<String> specialties;
public Vet(UUID id, String firstName, String lastName, Set<String> specialties) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.specialties = specialties;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Set<String> getSpecialties() {
return specialties;
}
public void setSpecialties(Set<String> specialties) {
this.specialties = specialties;
}
}
该类用 注释,将其映射到 Cassandra 表。每个属性都映射到一个列。Vet
@Table
该类使用简单的类型。选择正确的主键至关重要,因为它决定了我们的分区键,以后无法更改。@PrimaryKey
UUID
为什么它如此重要?分区键不仅定义数据唯一性,还控制数据局部性。插入数据时,主键经过哈希处理,并用于选择存储数据的节点。这样,我们知道数据始终可以在该节点中找到。 |
Cassandra 对数据进行非规范化处理,并且不像 SQL/RDBMS 那样需要表连接,这使您可以更快地检索数据。出于这个原因,我们将我们的建模为 .specialties
Set<String>
创建简单查询
Spring Data Cassandra专注于在Apache Cassandra中存储数据。但是,它继承了Spring Data Commons项目的功能,包括派生查询的能力。从本质上讲,你不需要学习Cassandra的查询语言。相反,您可以编写一些方法,并让查询为您编写。
若要了解其工作原理,请创建一个查询实体的存储库接口,如以下清单 (in ) 所示:Vet
src/main/java/com/example/accessingdatacaddandra/VetRepository.java
package com.example.accessingdatacassandra;
import java.util.UUID;
import org.springframework.data.repository.CrudRepository;
public interface VetRepository extends CrudRepository<Vet, UUID> {
Vet findByFirstName(String username);
}
VetRepository
扩展接口,并为存储库使用的值和键分别指定泛型类型参数的类型 — 和 。此接口附带许多操作,包括基本的 CRUD(创建、读取、更新、删除)和简单的查询(如)数据访问操作。 不从 扩展,因为使用限制或偏移的经典分页模式不适用于 Cassandra。CassandraRepository
Vet
UUID
findById(..)
CassandraRepository
PagingAndSortingRepository
您可以根据需要通过声明其方法签名来定义其他查询。但是,您只能执行包含主键的查询。该方法是一个有效的 Spring Data 方法,但在 Cassandra 中是不允许的,因为它不是主键的一部分。findByFirstName
firstName
存储库中某些生成的方法可能需要全表扫描。一个示例是方法,它需要查询群集中的所有节点。不建议对大型数据集进行此类查询,因为它们可能会影响性能。 |
添加命令行运行程序
定义一个类型的 bean 并注入 以设置一些数据并使用其方法。CommandLineRunner
VetRepository
Spring Boot 会自动处理这些存储库,只要它们包含在类的同一包(或子包)中。若要更好地控制注册过程,可以使用注释。@SpringBootApplication
@EnableCassandraRepositories
默认情况下,扫描当前包以查找扩展 Spring Data 的存储库接口之一的任何接口。您可以使用它安全地告诉Spring Data Cassandra按类型扫描不同的根包,如果您的项目布局有多个项目并且找不到您的存储库。 |
Spring Data Cassandra 使用 来执行方法背后的查询。您可以自行使用该模板进行更复杂的查询,但本指南不涉及这一点。(参见 Spring Data Cassandra 参考指南[CassandraTemplate
find*
https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#reference]).
下面的清单显示了完成的类(在 /src/main/java/com/example/accessingdatacassandra/AccessingDataCassandraApplication.java):AccessingDataCassandraApplication
package com.example.accessingdatacassandra;
import java.util.Arrays;
import java.util.HashSet;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.cassandra.core.CassandraTemplate;
@SpringBootApplication
public class AccessingDataCassandraApplication {
private final static Logger log = LoggerFactory.getLogger(AccessingDataCassandraApplication.class);
public static void main(String[] args) {
SpringApplication.run(AccessingDataCassandraApplication.class, args);
}
@Bean
public CommandLineRunner clr(VetRepository vetRepository) {
return args -> {
vetRepository.deleteAll();
Vet john = new Vet(UUID.randomUUID(), "John", "Doe", new HashSet<>(Arrays.asList("surgery")));
Vet jane = new Vet(UUID.randomUUID(), "Jane", "Doe", new HashSet<>(Arrays.asList("radiology, surgery")));
Vet savedJohn = vetRepository.save(john);
Vet savedJane = vetRepository.save(jane);
vetRepository.findAll()
.forEach(v -> log.info("Vet: {}", v.getFirstName()));
vetRepository.findById(savedJohn.getId())
.ifPresent(v -> log.info("Vet by id: {}", v.getFirstName()));
};
}
}
构建可执行的 JAR
您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。
如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./gradlew bootRun
./gradlew build
java -jar build/libs/gs-accessing-data-cassandra-0.1.0.jar
如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./mvnw spring-boot:run
./mvnw clean package
java -jar target/gs-accessing-data-cassandra-0.1.0.jar
此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件. |
总结
祝贺!您已经开发了一个 Spring 应用程序,它使用 Spring Data Cassandra 来访问分布式数据。