webflux介绍
webflux是一种异步非阻塞的框架,其核心是基于Reactor相关api实现的响应式编程。
相关概念
同步和异步:调用者发送请求,如果等待对方回应之后再去做其他事情就是同步。如果不等待对方回应就去做其他事情就是异步。
阻塞(需等待)和非阻塞(不需等待):调用者收到请求之后,做完任务再反馈是阻塞。先反馈在完成任务是非阻塞。
响应式编程(reactor实现)
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
reactor概念
reactor的发布者用两个类表示:
Mono(返回0或1个元素)
Flux(返回0-n个元素)
三种数据信号:元素值、错误信号、终止信号。
操作符map和flatmap:
map:元素映射为新元素。
flatmap:元素映射为流。
springWebFlux(基于注解编程模型)
1、导包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>cn.itlym.shoulder</groupId>
<artifactId>lombok</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
2、MVC结构
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private String gender;
private int age;
}
public interface UserService {
Mono<User> findById(int id);
Flux<User> findAll();
Mono<Void> addUser(Mono<User> user);
}
@Service
public class UserServiceImpl implements UserService {
private final Map<Integer,User> users=new HashMap<>();
public UserServiceImpl() {
this.users.put(1,new User("lucy","男",15));
this.users.put(2,new User("marry","女",23));
this.users.put(3,new User("jack","男",31));
this.users.put(4,new User("tom","女",29));
}
@Override
public Mono<User> findById(int id) {
return Mono.justOrEmpty(this.users.get(id));
}
@Override
public Flux<User> findAll() {
return Flux.fromIterable(this.users.values());
}
@Override
public Mono<Void> addUser(Mono<User> userMono) {
return userMono.doOnNext(person->{
int id = users.size()+1;
users.put(id,person);
}).thenEmpty(Mono.empty());
}
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user/{id}")
public Mono<User> findId(@PathVariable Integer id){
return userService.findById(id);
}
@RequestMapping("/user")
public Flux<User> getAll(){
return userService.findAll();
}
@PostMapping("/save")
public Mono<Void> saveUser(@RequestBody User user){
Mono<User> just = Mono.just(user);
return userService.addUser(just);
}
}
3、测试
浏览器访问:https://localhost:8081/user/1
- 计划任务
- 完成任务