webmvc和webflux的一些区别

组件

执行过程

webmvc

webflux

写法(返回一个视图)

webmvc

webflux(路由式写法),webflux也支持了mvc的注解使得一般项目可以无压力替换为webflux框架

思想

webmvc(命令式编程)

1
假如有一个式子a=b+c,这就意味着a的值是由b和c计算出来的。如果b或者c后续有变化,不会影响到a的值

webflux(响应式编程)

1
2
3
式子a:=b+c,这就意味着a的值是由b和c计算出来的。但如果b或者c的值后续有变化,会影响到a的值

--变化传递

例子(3y)

1
2
3
4
5
6
7
private String createStr() {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
}
return "some string";
}

webmvc

1
2
3
4
5
6
private String get1() {
log.info("get1 start");
String result = createStr();
log.info("get1 end.");
return result;
}

webflux

1
2
3
4
5
6
private Mono<String> get2() {
log.info("get2 start");
Mono<String> result = Mono.fromSupplier(() -> createStr());
log.info("get2 end.");
return result;
}

从调用者(浏览器)的角度而言,是感知不到有什么变化的,因为都是得等待5s才返回数据。但是,从服务端的日志我们可以看出,WebFlux是直接返回Mono对象的(而不是像SpringMVC一直同步阻塞5s,线程才返回)。
这正是WebFlux的好处:能够以固定的线程来处理高并发(充分发挥机器的性能)。