12.2.1 开启 Spring Data Cassandra

要开始使用 Spring Data Cassandra 的响应式 Repository 支持,您需要为 Spring Boot 添加 Spring Data Cassandra 依赖。实际上有两个独立的 Spring Data Cassandra 依赖项可供选择。

如果您不打算为 Cassandra 编写响应式 Repository,那么可以使用以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>

通过勾选 Cassandra 复选框,也可以在 Initializr 中获得此依赖项。

然而在本章中,我们将重点放在编写响应式 Repository 上,因此您应该使用另一个依赖项,以启用响应式 Cassandra Repository:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>
        spring-boot-starter-data-cassandra-reactive
    </artifactId>
</dependency>

如果您使用 Spring Initializr 来创建项目,那么您可以通过勾选 Reactive Cassandra 复选框,来添加依赖项。

现在,重要的是理解这种依赖关系是代替了 Spring Data JPA 依赖项的。因为我们不是将 Taco Cloud 数据使用 JPA 持久化到关系数据库,而是使用 Spring Data 将数据持久化到 Cassandra 数据库。因此,您要移除 Spring Data JPA 以及任何关系数据库的依赖项(例如 JDBC 驱动程序或 H2 依赖项)。

响应式 Spring Data Cassandra 的依赖会带来一些下层依赖,其中包括 Spring Data Cassandra 的包和 Reactor。由于这些包位于运行时类路径中,响应性 Cassandra 会自动配置。这意味着可以用很少的显式配置来编写响应式 Cassandra Repository。

不过,您也需要提供一些必要配置。至少,您需要配置一个键空间的名称, Repository 将在该空间中进行操作。为此,首先需要创建这样一个键空间。

注意在 Cassandra 中,键空间是 Cassandra 节点中的一组表。它大致类似于关系数据库中的一个库。

尽管可以配置 Spring Data Cassandra 自动地创建键空间,但手动创建通常要容易得多(或者使用现有键空间)。使用 Cassandra CQL(Cassandra Query Language),您可以为 Taco Cloud 应用程序创建键空间,命令如下:

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: tacocloud
      schema-action: recreate-drop-unused

这里,还设置了 spring.data.cassandra.schema-action 为 recreate-drop-unused。此设置对于开发环境非常有用,因为它确保每次开始使用应用程序时,都会删除和重新创建任何表和用户定义类型。默认值 none 不执行任何操作,这在生产环境中设置是正常的,因为不会希望应用程序开始时,删除所有表。

这些是使用本地运行的 Cassandra 数据库所需的唯一配置。但是,依据您自己的 Cassandra 集群配置,除了这两个属性之外,您还可以设置其他属性。默认情况下,Spring Data Cassandra 假设 Cassandra 在本地运行并且监听端口 9092。如果你的环境中不是这样,比如在生产环境中,您可能需要设置 spring.data.cassandra.contact-points 和 spring.data.cassandra.port 属性:

spring:
  data:
    cassandra:
      keyspace-name: tacocloud
      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 数据建模的几个基本点。

最后更新于