spring-boot之webflux简单入门 - 上

云中志

共 3155字,需浏览 7分钟

 · 2021-07-31


前言

从今天开始,我们开始学习spring-boot的另外一套web解决方案——webflux

webFluxspring5.0以后的版本中引入的,我们都知道,springmvc框架是基于servlet实现的,本质上他用的是传统的I/O模型,相比于传统的MVCWebFlux则是基于NIO(新IO,也叫非阻塞IO),所以在IO性能上会比传统的MVC性能要好一些。

下面是官方网站给出的对比:

下面是MVCwebFlux的架构图对比:

当然,现在我们的说法只能算是一种推理,因为我现在对webflux也知之甚少,不过根据我目前搜集到的资料来看,大家似乎并不认为webflux未来会成为一种趋势,大家诟病的缺点主要有以下几个:

  • 写法结构上和lambda表达式很像(响应式编程),所以在日常开发运维中,不利于问题排查,不便于调试(用过lambdas表达式的小伙伴也应该有此体会)
  • 写法上过于繁琐,相比于传统的MVC,过于臃肿,这一点我们等下可以对比看下
  • 打印日志、堆栈信息不方便,不利于后期运维

这些就是我目前所了解到的缺点,更多的可能还需要我们自己实际踩坑才能体会,下面我们就来通过一个简单的demo看下webflux的一些基础知识。

Webflux

创建项目

首先我们创建一个spring-boot项目,引入webflux的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

编写Handler组件

这里的handler就类似于我们之前mvc中的controller,也就是对外提供的接口。

我们可以在方法内部指定返回结果、响应类型、响应体等数据,这种写法和我们前几天写的security的配置很像,也和Netty代码中的写法很像,不过这也不奇怪,因为webFlux的底层就是基于Netty实现的。

@Component
public class HiHandler {
    public Mono<ServerResponse> sayHi(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue("Hi , this is SpringWebFlux"));
    }
}

编写路由配置

路由配置和Handler是对应的,一个Handdler对应一个路由配置

@Configuration
public class RouteConfig {
    @Bean
    public RouterFunction<ServerResponse> routSayHi(HiHandler handler) {
        return RouterFunctions
                .route(RequestPredicates.GET("webflux/hi")
                        .and(RequestPredicates.accept(MediaType.ALL)), handler::sayHi);
    }
}

测试

写完以上代码后,我们启动项目,然后访问如下地址:

http://localhost:8999/webflux/hi

服务端口如果你没有修改的话,默认应该是8080。响应结果如下:

到这里你的第一个webflux接口就写好了。

传统MVC写法

对于上面这个接口,如果我们用传统的MVC写法的话,只需要一个controller接口即可:

@RestController
@RequestMapping("/webflux")
public class WebFluxController {

    @RequestMapping("/hi")
    public Object sayHi(String name) {
        return "hi, " + name;
    }
}

启动访问:

http://localhost:8999/webflux/hi?name=syske

需要注意的是,如果controllerwebFlux接口同时存在的话,webFlux会覆盖controller,也就是说webFlux的优先级要高于controller

MVC与WebFlux对比

先抛开性能差异,我们但从代码层面看,webflux要比MVC写更多代码,而且在写法上要复杂。所以,但从现在的情况来看,我觉得webflux是没有优势的,更多差异只能等我们后面深入了解之后才能清楚。

总结

今天我就只展示webFlux的简单写法,让各位小伙伴对webflux有个最基本的认识,认识到webflux和传统MVC的基本区别,当然这些都数据特别特别基础的知识。从明天开始我们就要开始稍微深入的探讨,然后逐步深入了解webflux的一些原理。

因为我现在也和各位小伙伴一样,也是在一边学一边分享,摸着石头过河,如果那里有说的不正确的地方,还请各位小伙伴予以指正。好了,今天就先到这里吧!

- END -


浏览 39
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报