13-WebFlux

Charlie

1. 异步Web框架的事件轮询机制

  • 用较少的线程处理更多请求,减少线程管理的开销
    • 很多请求的线程并不是在运行,而是在等待
    • 事件驱动

反应式编程适合请求多大部分在等待的情况

image.png

2. Spring MVC与Spring WebFlux

  • 不同
    • MVC:依赖多线程处理
    • WebFlux:在事件轮询中处理请求
      • 可以使用纯粹的函数式编程实现Controller
  • 共性
    • WebFlux也可以使用Controller、RequestMapping等注解
      • WebFlux的参数和返回值可能是流

image.png

依赖:spring-boot-starter-webflux

3. 实现

3.1. repository

  • 继承ReactiveCRUDrepository接口
  • 成员方法返回流

4. controller

  • 返回流
  • 如果方法没有返回值,需要在方法内订阅
    • 否则不会执行,不订阅就不会驱动
    • 多层嵌套流,对外围订阅不会触发内层的流

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@GetMapping(value="/mono")
public Mono<String> stringMono() {
Mono<String> from = Mono.fromSupplier(() -> {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(" in Supplier thread: " + Thread.currentThread().getName());
return "Hello, Spring Reactive data time:" + LocalDateTime.now();
});
System.out.println("thread: " + Thread.currentThread().getName() + ", time:" + LocalDateTime.now());
return from;
}
1
Hello, Spring Reactive data time:2024-01-02T20:40:46.651302900
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@GetMapping(value="/flux", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> produceFlux(){
Flux<String> stringFlux = Flux.fromStream(IntStream.range(1,6).mapToObj(i->{
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(" in Supplier thread: " + Thread.currentThread().getName());
return "java north flux:"+i+", date time: "+LocalDateTime.now();
}));
System.out.println("thread: " + Thread.currentThread().getName() + ", time:" + LocalDateTime.now());
return stringFlux;
}

image.png
image.png

4.1. 使用函数式范式定义控制器

  • 基本组件
    • HandlerFunction:
    • RouterFunction:路由和处理关系

WebClient:相当于RestTemplate

5. R2DBC

反应式关系型数据库链接
JDBC的替代方案

  • 标题: 13-WebFlux
  • 作者: Charlie
  • 创建于 : 2023-12-07 18:12:00
  • 更新于 : 2024-07-05 12:55:04
  • 链接: https://chillcharlie357.github.io/posts/bfe92605/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论