zoukankan      html  css  js  c++  java
  • spring-boot之webflux简单入门

    前言

    从今天开始,我们开始学习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的一些原理。

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

  • 相关阅读:
    AtCoder Beginner Contest 184 ABCDE 题解
    Codeforces Round #685 (Div. 2) C. String Equality 思维
    Codeforces Round #682 (Div. 2) ABC 题解
    Gym 102215 & 队内训练#5
    【题解】 CF436E Cardboard Box 带悔贪心
    【题解】 「NOI2019」序列 模拟费用流 LOJ3158
    【笔记】 exlucas
    【题解】 「HNOI2018」毒瘤 树形dp+动态dp+容斥+格雷码 LOJ2496
    【笔记】 异或高斯消元方案数
    【笔记】 用生成函数推二项式反演
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/15070550.html
Copyright © 2011-2022 走看看