目录
前言
1.Weflux特点:
2.WebFlux简单集成ElasticSearch
2.1 引入基本依赖模块
3.application.yml文件的配置
4.定义Product实体类
5.定义ElasticSearch的数据访问层接口
6.定义Controller
7.启动SpringBoot程序,用postman进行接口测试
前言
WebFlux响应式开发是Spring Framework 5中引入的一个重要组件,它是Spring用于支持响应式编程的组件,提供了非阻塞,异步的Web框架。
1.Weflux特点:
非阻塞、异步、响应式流、函数式编程、高性能和高并发
1.1 非阻塞与传统的阻塞IO相比,在性能方面提升了千百倍
1.2 异步大大减少了因同步网络拥堵带来相应时间。
1.3 响应流:作为webflux的规范,提供异步流处理的接口和行为,允许开发者以声明式的方式处理数据流,同时保持了流的控制和背压管理。
1.4函数式编程:采用函数式编程规范,灵活利用lamda表达式简化编程模式,大大提高了代码的可读性和易用性。
1.5高并发和高性能:由于其本身的异步相应特点,WebFlux能够同时处理大量的并发请求,提高系统的吞吐量和响应时间,这使得其在分布式微服务架构中具有高并发和高可用的性能。
2.WebFlux简单集成ElasticSearch
2.1 引入基本依赖模块
//SpingBoot的版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
//elasticSearch依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
3.application.yml文件的配置
spring:
elasticsearch:
jest:
uris: http://localhost:9200
4.定义Product实体类
package com.example.spring.mono.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.util.Date;
/**
* 产品
*/
@Data
@TypeAlias("product")
@Document(indexName = "product")
public class Product {
//产品id
@Id
private String productId;
//产品名称
@Field(type = FieldType.Keyword)
private String productName;
//创建时间
private Date createTime;
//更新时间
private Date updateTime;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String description;
}
5.定义ElasticSearch的数据访问层接口
public interface ProductRepository extends ReactiveSortingRepository<Product, String> {
}
6.定义Controller
package com.example.spring.mono.controller;
import com.example.spring.mono.entity.Product;
import com.example.spring.mono.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Date;
import java.util.Map;
@RestController
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductRepository productRepository;
@PostMapping("/saveProduct")
public Mono<Product>save(@RequestBody Product product){
product.setCreateTime(new Date());
return productRepository.save(product);
}
@GetMapping("/list")
public Flux<Product> list(){
return productRepository.findAll();
}
}