4.1.1 启用 Spring Data Cassandra
要开始使用 Spring Data Cassandra,您需要为 Spring Boot 添加 Spring Data Cassandra 依赖。实际上有两个独立的 Spring Data Cassandra 依赖项可供选择:一个用于响应式数据持久化,另一个用于标准、非响应式持久化。
我们将在第 15 章后面讨论更多关于编写响应式 Repository 的内容。现在,我们使用非响应式 starter 依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>
通过勾选 Cassandra 复选框,也可以在 Initializr 中获得此依赖项。
现在,重要的是理解这种依赖关系是代替了 Spring Data JPA 依赖项的。因为我们不是将 Taco Cloud 数据使用 JPA 持久化到关系数据库,而是使用 Spring Data 将数据持久化到 Cassandra 数据库。因此,您要移除 Spring Data JPA 以及任何关系数据库的依赖项(例如 JDBC 驱动程序或 H2 依赖项)。
Spring Data Cassandra stater 的依赖会带来一些下层依赖,其中主要包括 Spring Data Cassandra 的包。有了这些包位于运行时类路径中,自动配置会触发 Cassandra Repository 的创建。这意味着可以用很少的显式配置来编写 Cassandra Repository。
Cassandra 作为多节点的集群运行,这些节点共同充当一个完整的数据库系统。如果您没有 Cassandra 集群可以使用,则可以为其启动单节点集群,为开发目的使用 Docker 创建:
$ docker network create cassandra-net
$ docker run --name my-cassandra \
--network cassandra-net \
-p 9042:9042 \
-d cassandra:latest
这将启动单节点集群,并使用端口(9042),供您的应用程序访问。
不过,您也需要提供一些必要配置。至少,您需要配置一个键空间的名称, Repository 将在该空间中进行操作。为此,首先需要创建这样一个键空间。
注意在 Cassandra 中,键空间是 Cassandra 节点中的一组表。它大致类似于关系数据库中的一个库。
尽管可以配置 Spring Data Cassandra 自动地创建键空间,但手动创建通常要容易得多(或者使用现有键空间)。使用 Cassandra CQL(Cassandra Query Language)
,您可以为 Taco Cloud 应用程序创建键空间。您可以使用 Docker 启动 CQL shell,如下所示::
$ docker run -it --network cassandra-net --rm cassandra cqlsh my-cassandra
注意,如果此命令无法启动 CQL Shell,而出现一个错误,指示“Unable to connect to any servers”,请稍等一两分钟,然后重试。需要确保 Cassandra 集群已完全启动,然后再启动 CQL Shell。
当 shell 准备就绪后,请按如下方式使用 create keyspace 命令:
cqlsh> create keyspace tacocloud
... with replication={'class':'SimpleStrategy', 'replication_factor':1}
... and durable_writes=true;
简单地说,这将创建一个名为 tacocloud 的键空间,并在持久化时进行简单复制。通过将复制因子设置为 2,可以让 Cassandra 为每行数据保留一个副本。复制策略决定了如何处理复制。这个 SimpleStrategy 复制策略适合于单个数据中心(或演示环境)。但是如果您的 Cassandra 集群分布在多个数据中心,可以考虑 NetworkTopologyStrategy 复制策略。请参阅 Cassandra 有关文档,以了解相关复制策略信息,以及创建键空间的其他替代方法。
现在已经创建了键空间,您需要配置 spring.cassandra.keyspace-name 属性来告诉 Spring Data Cassandra 使用该键空间:
spring:
data:
cassandra:
keyspace-name: taco_cloud
schema-action: recreate
local-datacenter: datacenter1
这里,还设置了 spring.data.cassandra.schema-action 为 recreate-drop-unused。此设置对于开发环境非常有用,因为它确保每次开始使用应用程序时,都会删除和重新创建任何表和用户定义类型。默认值 none 不执行任何操作,这在生产环境中设置是正常的,因为不会希望应用程序开始时,删除所有表。
最后,spring.data.cassandra.local-datacenter 属性标识本地数据中心,用于设置 Cassandra 的负载均衡策略。在单个节点中,设置了使用“datacenter1”这个值。有关 Cassandra 负载均衡策略的更多信息,以及如何设置本地数据中心,请参阅 DataStax Cassandra 驱动程序参考文件。
这些是使用本地运行的 Cassandra 数据库所需的唯一配置。但是,依据您自己的 Cassandra 集群配置,除了这两个属性之外,您还可以设置其他属性。
默认情况下,Spring Data Cassandra 假设 Cassandra 在本地运行并且监听端口 9042。如果你的环境中不是这样,比如在生产环境中,您可能需要设置 spring.data.cassandra.contact-points 和 spring.data.cassandra.port 属性:
spring:
data:
cassandra:
keyspace-name: tacocloud
local-datacenter: datacenter1
contact-points:
- casshost-1.tacocloud.com
- casshost-2.tacocloud.com
- casshost-3.tacocloud.com
port: 9043
注意 spring.data.cassandra.contact-points 属性用于标识 Cassandra 的主机名。每一行指定一个正在运行 Cassandra 的主机节点。默认情况下,它设置为 localhost,但可以将其设置为主机名列表。它将尝试每个节点,直到它能够连接到其实的一个。这是为了确保 Cassandra 集群中没有单点故障,应用程序将能够通过给定的某一节点连接到群集。
您还可能需要为 Cassandra 集群指定用户名和密码。这可以设置 spring.data.cassandra.username 和 spring.data.cassandra.password 属性:
spring:
data:
cassandra:
...
username: tacocloud
password: s3cr3tP455w0rd
这样您的项目中启用并配置了 Spring Data Cassandra,您就可以将实体类型映射到 Cassandra 表和编写 Repository 了。但是首先,让我们先考虑一下 Cassandra 数据建模的几个基本点。