美文网首页BATJ架构IT@程序员猿媛
SpringWebflux 快速入门和WebFlux框架

SpringWebflux 快速入门和WebFlux框架

作者: 裘马轻狂大帅 | 来源:发表于2019-04-17 15:15 被阅读3次

    SpringWebflux是SpringFramework5.0添加的新功能,WebFlux本身追随当下最火的Reactive Programming而诞生的框架,那么本篇就来简述一下这个框架到底是做什么?

    关于WebFlux

    什么是反应式编程?简而言之,反应式编程是关于非阻塞应用程序,它们是异步和事件驱动的,需要少量线程垂直扩展(即在JVM内)而不是水平扩展(即通过集群)。

    反应式应用的一个关键方面是背压的概念,这是一种确保生产者不会压倒消费者的机制。例如,当HTTP连接太慢时,在从数据库扩展到HTTP响应的反应组件的管道中,数据存储库也可以减速或完全停止,直到网络容量释放。

    反应式编程也导致从命令式到声明式异步逻辑组合的重大转变。它与编写阻塞代码相比,使用 CompletableFuturefrom Java 8通过lambda表达式组成后续操作。

      我们知道传统的Web框架,比如说:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的,在Servlet3.1之后才有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上,因此它的运行环境的可选择行要比传统web框架多的多。

      根据官方的说法,webflux主要在如下两方面体现出独有的优势:

      1)非阻塞式

        其实在servlet3.1提供了非阻塞的API,WebFlux提供了一种比其更完美的解决方案。使用非阻塞的方式可以利用较小的线程或硬件资源来处理并发进而提高其可伸缩性

      2) 函数式编程端点

        老生常谈的编程方式了,Spring5必须让你使用java8,那么函数式编程就是java8重要的特点之一,而WebFlux支持函数式编程来定义路由端点处理请求。

    服务器端

    在服务器端,WebFlux支持2种不同的编程模型:

    @ControllerSpring MVC也支持 基于注释和其他注释

    功能,Java 8 lambda样式的路由和处理

    两种编程模型都在相同的反应基础上执行,该基础使非阻塞HTTP运行时适应Reactive Streams API。下图显示了服务器端堆栈,包括spring-webmvc模块左侧的传统,基于Servlet的Spring MVC以及模块右侧的反应堆栈spring-webflux。

    WebFlux可以在Servlet容器上运行,支持Servlet 3.1 Non-Blocking IO API以及其他异步运行时,如Netty和Undertow。每个运行时适于反应性ServerHttpRequest和ServerHttpResponse暴露所述请求和响应的身体Flux<DataBuffer>,而不是 InputStream和OutputStream,具有反应性的背压。REST风格的JSON和XML序列化和反序列化作为一个顶部支持Flux<Object>,HTML视图呈现和服务器发送事件也是如此。

    二、SpringMVC与SpringWebFlux

    我们先来看官网的一张图:

      它们都可以用注解式编程模型,都可以运行在tomcat,jetty,undertow等servlet容器当中。但是SpringMVC采用命令式编程方式,代码一句一句的执行,这样更有利于理解与调试,而WebFlux则是基于异步响应式编程,对于初次接触的码农们来说会不习惯。对于这两种框架官方给出的建议是:

      1)如果原先使用用SpringMVC好好的话,则没必要迁移。因为命令式编程是编写、理解和调试代码的最简单方法。因为老项目的类库与代码都是基于阻塞式的。

      2)如果你的团队打算使用非阻塞式web框架,WebFlux确实是一个可考虑的技术路线,而且它支持类似于SpringMvc的Annotation的方式实现编程模式,也可以在微服务架构中让WebMvc与WebFlux共用Controller,切换使用的成本相当小

      3)在SpringMVC项目里如果需要调用远程服务的话,你不妨考虑一下使用WebClient,而且方法的返回值可以考虑使用Reactive Type类型的,当每个调用的延迟时间越长,或者调用之间的相互依赖程度越高,其好处就越大

      我个人意见是:官网明确指出,SpringWebFlux并不是让你的程序运行的更快(相对于SpringMVC来说),而是在有限的资源下提高系统的伸缩性,因此当你对响应式编程非常熟练的情况下并将其应用于新的系统中,还是值得考虑的,否则还是老老实实的使用WebMVC吧

    三、Reactive Spring Web

      在这里定义了最基本的服务端接口:HttpHandler和WebHandler

     WebHandler

    WebHandler定义了Web请求必要一些处理行为,大家不妨想想看:WebFlux已经脱离了Servlet API,那么使用WebFlux时遇到会话机制怎么办,想要对请求过滤处理怎么办或者想要处理静态资源怎么办等等,那么WebHandler就是做这个事情的。其实在HttpHandler的基本实现类通过适配器模式及装饰模式也间接的实现了WebHandler接口:

      WebHandler常见的实现类,我在这里列举一下:

       WebHandlerDecorator:WebHandler的装饰器,利用装饰模式实现相关功能的扩展

       HttpWebHandlerAdapter: 进行Http请求处理,同时也是HttpHandler的实现类

       FilteringWebHandler:通过WebFilter进行过滤处理的类,类似于Servlet中的Filter

       ExceptionHandlingWebHandler: 针对于异常的处理类

       ResourceWebHandler:用于静态资源请求的处理类

       DispatcherHandler:请求的总控制器,类似于WebMVC中的DispatcherServlet

    实现WebFlux示例

    相关文章

      网友评论

        本文标题:SpringWebflux 快速入门和WebFlux框架

        本文链接:https://www.haomeiwen.com/subject/nsrnwqtx.html