3. Reactive NoSQL
上面我们的Repository是非响应式的,而响应式编程要求全栈技术都是响应式,所以这节我们讨论响应式的Spring Data。目前Spring Data支持的响应式的NoSQL有:
- MongoDB:使用
spring-boot-starter-data-mongodb-reactive
依赖; - Redis:使用
spring-boot-starter-data-redis-reactive
依赖; - Cassandra:使用
spring-boot-starter-data-cassandra-reactive
依赖; - Couchbase:使用
spring-boot-starter-data-couchbase-reactive
依赖; - Elasticsearch:使用
spring-boot-starter-data-elasticsearch
依赖;
3.1 响应式Elasticsearch
本节依然使用Elasticsearch作为演示:
新建应用,信息如下:
Group:top.wisely
Artifact:learning-reactive-nosql
Dependencies:Spring Reactive Web
、Spring Data Elasticsearch
、Lombok
build.gradle
文件中的依赖如下:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//...
}
3.1.1 Spring Boot的自动配置
Spring Boot自2.2.0版本开始支持响应式Elasticsearch的自动配置,自动配置文件为:
-
ReactiveElasticsearchRepositoriesAutoConfiguration
:通过@EnableReactiveElasticsearchRepositories
开启响应式Elasticsearch Repository的支持; -
ElasticsearchDataAutoConfiguration
:通过导入lasticsearchDataConfiguration.ReactiveRestClientConfiguration
来配置响应式操作模板ReactiveElasticsearchTemplate
的Bean; -
ReactiveRestClientAutoConfiguration
:通过ReactiveRestClientProperties
,以spring.data.elasticsearch.client.reactive.*
开头来配置响应式Elasticsearch客户端ReactiveElasticsearchClient
的Bean。
3.1.2 示例
首先我们配置连接Elasticsearch:
spring:
data:
elasticsearch:
client:
reactive:
endpoints: localhost:9200
下面我们的工作和Spring Data的其它项目是类似的,我们先定义领域模型:
//...
import org.springframework.data.elasticsearch.annotations.Document;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "person")
public class Person {
@Id
private String id;
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
}
然后我们再进行Repository的定义,此处我们继承的是ReactiveElasticsearchRepository
。
//...
import org.springframework.data.elasticsearch.repository.ReactiveElasticsearchRepository;
public interface PersonRepository extends ReactiveElasticsearchRepository