前言
Spring 5 是流行的 Spring 框架的下一个重大的版本升级。Spring 5 中最重要改动是把反应式编程的思想应用到了框架的各个方面,Spring 5 的反应式编程以 Reactor 库为基础。
web flux
WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。该模块中包含了对反应式 HTTP、服务器推送事件和 WebSocket 的客户端和服务器端的支持。对于开发人员来说,比较重要的是服务器端的开发,这也是本文的重点。在服务器端,WebFlux 支持两种不同的编程模型:
1. Spring MVC 中使用的基于 Java 注解的方式;
2. 基于 Java 8 的 lambda 表达式的函数式编程模型。
这两种编程模型只是在代码编写方式上存在不同。它们运行在同样的反应式底层架构之上,因此在运行时是相同的。WebFlux 需要底层提供运行时的支持,WebFlux 可以运行在支持 Servlet 3.1 非阻塞 IO API 的 Servlet 容器上,或是其他异步运行时环境,如 Netty 和 Undertow。
注解编程范式
先来看一下注解方式
注解方式只需要在spring web mvc/boot基础上更换依赖,替换controller、repository等模块请求&返回参数类型即可。
具体如下:
一个标准的spring web项目controller层
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Welcome to reactive world ~";
}
}
改成web flux
1.添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2.修改参数类型
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() { // 【改】返回类型为Mono<String>
return Mono.just("Welcome to reactive world ~"); // 【改】使用Mono.just生成响应式数据
}
}
如果返回类型是集合,就使用Flux类型。
具体在官方文档描述如下:
函数式编程范式
我们来看一下如何使用function的形式编写一个reactive风格的spring web项目。
按照spring官方文档示例编码如下:
1.定义person类
2.定义PersonRepository接口&接口实现类NickPersonRepository
(成员变量map模拟redis、mongodb等存储,读者可自行更换为spring-data-jpa或者spring-data-mongodb等)
3.定义PersonHandler
4.编写函数式服务端
我这里使用的是netty来运行,如果想使用其它的,可以在官方文档查阅代码。
https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html
虽然我们只修改了少量的代码,整个技术栈从命令式的、同步阻塞的【spring-webmvc + servlet + Tomcat】变成了响应式的、异步非阻塞的【spring-webflux + Reactor + Netty】。
运行main方法启动测试:
curl -v'http://localhost:8080/person'
curl -v'http://localhost:8080/person/1'
curl -d'{"name":"Bruce Lee","age":"36"}'-H'Content-Type: application/json'-v'http://localhost:8080/person'
总结
spring 5推出响应式函数编程方式web flux,并配套data出了很多reactive风格的api,比如mongodb、redis等,现在好像还没有支持jdbc,官方鼓励的使用方式应该是netty端运行,并且是特定场景下,目前看来并不是所有场景都适合springmvc直接升级,让我们一起期待spring以及开源伙伴们新的探索,最后献上一张官方文档的图:
项目源码:
https://github.com/Spring5945/web-flux-sample
undertow、tomcat、jetty等服务器性能压测对比文章:
https://www.jishuwen.com/d/2J7I
关于springmvc升级web flux性能文章:
https://blog.lovezhy.cc/2018/12/29/webflux%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98/