学习笔记:微服务-24 spring boot WebFlux初探-响应式非阻塞web框架
响应式、非阻塞、事件驱动型web框架是另外一种编程模式和处理思维,相关概念及入门参见了如下几篇文章:
https://blog.****.net/Message_lx/article/details/81075766 Springboot2.0中webflux到底优秀在哪里
https://blog.****.net/get_set/article/details/79480233 Spring WebFlux快速上手——响应式Spring的道法术器
https://blog.****.net/yanchunling1981/article/details/84768985 Spring webflux--响应式、非阻塞、事件驱型web框架
以下就借鉴上面文章的例子体验一下
1.创建一个spring starter project,注意选 Reactive Web支持
其实就是会在pom.xml中加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
2. Reactive编程方法一:基于WebMVC注解的方式,增加类HelloController
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() { // 【改】返回类型为Mono<String>
return Mono.just("Welcome to reactive world ~"); // 【改】使用Mono.just生成响应式数据
}
}
3.Reactive编程方法二:WebFlux的函数式开发模式
(1)增加类定义
import static org.springframework.web.reactive.function.server.ServerResponse.ok;
@Component
public class TimeHandler {
public Mono<ServerResponse> getTime(ServerRequest serverRequest) {
return ok().contentType(MediaType.TEXT_PLAIN).body(Mono.just("Now is " + new SimpleDateFormat("HH:mm:ss").format(new Date())), String.class);
}
public Mono<ServerResponse> getDate(ServerRequest serverRequest) {
return ok().contentType(MediaType.TEXT_PLAIN).body(Mono.just("Today is " + new SimpleDateFormat("yyyy-MM-dd").format(new Date())), String.class);
}
public Mono<ServerResponse> sendTimePerSec(ServerRequest serverRequest) {
return ok().contentType(MediaType.TEXT_EVENT_STREAM).body(
Flux.interval(Duration.ofSeconds(1)). // 保持连接状态,每隔1秒发送一次时间
map(l -> new SimpleDateFormat("HH:mm:ss").format(new Date())),
String.class);
}
}
(2)增加 RouterConfig类
@Configuration
public class RouterConfig {
@Autowired
private TimeHandler timeHandler;
@Bean
public RouterFunction<ServerResponse> timerRouter() {
return route(GET("/time"), req -> timeHandler.getTime(req))
.andRoute(GET("/date"), timeHandler::getDate) // 这种方式相对于上一行更加简洁
.andRoute(GET("/times"), timeHandler::sendTimePerSec); // 增加这一行发送流数据,不断发送时间信息
}
}
4.测试
好吧,踏上了webflux编程第一个台阶...