Webflux核心

什么是WebFlux? Spring WebFlux 是一套全新的 Reactive Web 栈技术,实现完全非阻塞,支持 Reactive Streams 背压等特性,并且运行环境不限于 Servlet 容器(Tomcat、Jetty、Undertow),如 Netty 等。Spring WebFlux 与 Spring MVC 可共存,在 Spring Boot 中,Spring MVC 优先级更高。为什么优先级高,大家可以看看我之前的文章https://blog.csdn.net/mikezzmeric/article/details/87209555

我们为什么要使用web flux呢?Spring官方讲了两个主要原因,第一点是servlet API部分是阻塞式的,而且Listner和Filter是同步的方式。这个原因其实是错误的,我们早就知道Servlet在3.1的时候就已经可以异步的方式返回结果了。第二点原因是函数式编程的出现,这个原因可以算,但是不完全。所以个人觉得原因如下:从 Spring MVC 注解驱动的时代开始,Spring 官方有意识地去 Servlet 化。不过在 Spring MVC 的时代,Spring扔拜托不了 Servlet 容器的依赖,然而 Spring 借助 Reactive Programming 的势头,WebFlux 将 Servlet 容器从必须项变为可选项,并且默认采用 Netty Web Server 作为基础,从而组件地形成 Spring 全新技术体系,包括数据存储等技术栈:

Webflux的实现可以是函数式的实现也可以是注解式的实现,我们看一个例子:

函数映射:

RouterFunction<ServerResponse> route =
route(GET("/person/{id}").and(accept(APPLICATION_JSON)), handler::getPerson)
.andRoute(GET("/person").and(accept(APPLICATION_JSON)), handler::listPeople)
.andRoute(POST("/person"), handler::createPerson);


对应的注解映射如下:

@GetMapping(value="/person/{id}",consumes=APPLICATION_JSON)
public void getPerson(HttpServletRequest request,HttpServletResponse) {
}
@GetMapping(value="/person",consumes=APPLICATION_JSON)
public void listPeople(HttpServletRequest request,HttpServletResponse) {
}
@PostMapping(value="/person")
public void createPerson(HttpServletRequest request,HttpServletResponse) {
}


实现的功能一样,方式呢有所区别。

Spring MVC 和 Spring WebFlux 均能使用注解驱动 Controller,然而不同点在于并发模型和阻塞特性。Spring MVC 通常是Servlet 应用,因此,可能被当前线程阻塞。以远程调用为例,由于阻塞的缘故,导致 Servlet容器使用较大的线程池处理请求。Spring WebFlux 通常是非阻塞服务,不会发生阻塞,因此该阻塞服务器可使用少量、固定大小的线程池处理请求。

接下来介绍一下WebFlux的核心组件:

1.HttpHandler

是一种带有处理 HTTP 请求和响应方法的简单契约。

2.WebHandler


webHandler显得有一些抽象,我们可以通过对比SpringMVC的一些组件帮助大家理解一下在WebFlux中各个组件的作用:

接下来我们看一下采用函数式的方式编写的时候,一个请求的处理流程是怎样的:

 

RouterFunctionMapping中有private RouterFunction<?> routerFunction;这里面表面看起来只有一个Bean,其实它里面组合了非常多的RouterFunction,它是如何根据用户的请求找到对应的Function的呢?

@Override
	protected Mono<?> getHandlerInternal(ServerWebExchange exchange) {
		if (this.routerFunction != null) {
			ServerRequest request = ServerRequest.create(exchange, this.messageReaders);
			return this.routerFunction.route(request)
					.doOnNext(handler -> setAttributes(exchange.getAttributes(), request, handler));
		}
		else {
			return Mono.empty();
		}
	}


关键部分就是通过它的成员变量routerFunction的route方法来找,其实就是通过用户写的predicate来判断请求是否相符合,如果符合就返回一个Mono<HandlerFunction<T>>

WebFlux的使用场景,我们根据一些测试报告来看看:

1.性能考虑:

1.1WebFlux提升的其实往往是系统的伸缩性,对于速度的提升没有太多的明显。所以它不适合注入RPC这类对RT(响应时间)要求较高的应用。
1.2关注编程用户友好性,Reactive 编程尽管没有新增大量的代码,然而编码(和调试)却是变得更为复杂
1.3现在面临的最大问题是缺少文档。在生成测试应用中,它已经给我们造成了最大障碍,并使得我们可能已经缺少了关键点。因此,我们并不会太快地投入 Reactive 编程,同时等待关于它的更多反馈。因此,Spring WebFlux 尚未证明自身明显地优于Spring MVC。

2.编程模型

注解驱动编程模型

函数式编程模型

到底选择哪一个呢?

如果SpringMVC应用工作的挺好的,就没必要切换成webflux。

如果你想使用非阻塞的技术栈,可以考虑使用WebFlux。当然也不一定非要webflux,servlet3.1之后我们也知道提供了非阻塞的方式。

如果想使用轻量级的函数式编程,可以考虑使用函数式编程模型。

 

3.并发模型适用性

如果你的请求不需要实时的返回,那么可以使用异步的方式。

如果RT敏感,不要使用异步模型,因为涉及到线程切换或者等待可能引发超时。

 

--------------------- 
作者:光贤 
来源:CSDN 
原文:https://blog.csdn.net/mikezzmeric/article/details/88075658 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring WebFlux是Spring Framework的一个模块,它提供了一种响应式编程的方式来构建基于事件驱动的应用程序。它的执行过程与Spring MVC的DispatchServlet相似,但核心控制器是DispatchHandler,实现了WebHandler接口。要使用Spring WebFlux,首先需要添加相关的依赖,例如在pom.xml文件中添加spring-boot-starter-webflux依赖。接着,在代码中创建一个RestController,并使用@RequestMapping注解指定URL路径,然后在方法中使用@GetMapping注解指定处理GET请求的方法,并返回一个Mono对象。在主类中使用@SpringBootApplication注解标记应用程序入口,并在main方法中使用SpringApplication.run方法启动应用程序。最后,使用curl命令或浏览器访问http://localhost:8080/webflux/hello可以得到"Hello Spring Webflux"的响应。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring的Webflux](https://blog.csdn.net/weixin_44895829/article/details/123509954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [一文弄懂 Spring WebFlux 的来龙去脉](https://blog.csdn.net/m0_38017860/article/details/126590395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Spring学习(六):WebFlux](https://blog.csdn.net/a1275302036/article/details/116492120)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值