在 Spring WebFlux 中调用 Cassandra,主要依赖 Spring Data Reactive Cassandra 模块。这种方式能够实现从 Web 层到数据持久层的全链路非阻塞(Non-blocking)响应式流。
- 核心依赖
在 pom.xml 中引入响应式 Cassandra 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
- 基础配置
在 application.yml 中配置连接信息:
spring:
data:
cassandra:
contact-points: localhost
port: 9042
keyspace-name: my_keyspace
local-datacenter: datacenter1
- 定义实体与 Repository
使用 @Table 注解定义数据模型,并继承 ReactiveCassandraRepository 以获得响应式操作能力:
@Table("users")
public class User {
@PrimaryKey
private String id;
private String username;
// Getters and Setters
}
@Repository
public interface UserRepository extends ReactiveCassandraRepository<User, String> {
// 自动返回 Mono (单个) 或 Flux (多个)
Flux<User> findByUsername(String username);
}
- 在 WebFlux Controller 中调用
由于 Repository 返回的是 Mono 或 Flux,你可以直接在控制器中返回这些类型,WebFlux 会自动处理订阅:
@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@GetMapping("/{id}")
public Mono<User> getUserById(@PathVariable String id) {
return userRepository.findById(id);
}
@PostMapping
public Mono<User> createUser(@RequestBody User user) {
return userRepository.save(user);
}
}
关键点总结
- 全链路异步 :确保从数据库驱动到 Controller 都不存在阻塞调用(如
block())。 - Reactive Template :如果 Repository 无法满足复杂查询,可以使用
ReactiveCassandraTemplate进行更灵活的操作。 - 背压支持:WebFlux 会根据下游(如浏览器)的处理能力自动控制从 Cassandra 读取数据的速率。