webflux 的使用总结
本文为博主原创,未经允许不得转载:
1. Servlet 3.0 简介
2. WebFlux 简介 及 特点
3. 基于函数式的 WebFlux 开发
4. webFlux 全局异常
5. webFlux 过滤器的使用
响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的 编程范式
1. Servlet 3.0 简介
1.1 Servlet 特点
Filter/Servlet 在生成响应之前 可能要等待一些资源的响应以完成请求处理,比如一个jdbc的查询,或者远程服务rpc调用。在Servlet中阻塞等待是一个低效的操作,这将导致受限系统资源的急剧紧张,比如线程,连接数。Servlet 3.0 引入了异步处理请求的能力,使得线程可以不用阻塞等待,提早返回到容器,从而执行更多的任务请求。把耗时的任务提交给另一个异步线程去执行,以及产生响应。
1.2 Servlet 异步原理
startAsync 方法其实就是创建了一个异步上下文 AsyncContext 对象,AsyncContext 对象的作用是保存请求的中间信息,比如 Request 和 Response 对象等上下文信息,Tomcat 的工作线程在request.startAsync调用之后,就直接结束回到线程池中了,线程本身不会保存任何信息。也就是说一个请求到服务端,执行到一半,你的 Web 应用正在处理,这个时候 Tomcat 的工作线程没了,这就需要有个缓存能够保存原始的 Request 和 Response 对象,而这个缓存就是 AsyncContext。 startAsync 还需要告诉 Tomcat 当前的 Servlet 处理方法返回时,不要把响应发到浏览器,因为这个时候,响应还没生成呢;并且不能把 Request 对象和 Response 对象销毁,因为后面 Web 应用还要用呢。
2. WebFlux 简介 及 特点
传统的Web框架,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支持函数式编程来定义路由端点处理请求。
3. 基于函数式的 WebFlux 开发
添加 maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
HandlerFunction: 相当于Controller中的具体处理方法,输入为请求,输出封装在Mono中的响应
@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> { Mono<T> handle(ServerRequest request);
}
RouterFunction: 相当于RequestMapping,将Url映射到具体的HandlerFunction,输入为请求,输出为封装在Mono中的HandlerFunction
@FunctionalInterface
public interface RouterFunction<T extends ServerResponse> {
Mono<HandlerFunction<T>> route(ServerRequest request);}
响应式编程中的Flux和Mono 使用可以看这篇文章: https://blog.csdn.net/qq_28089993/article/details/89461814
4. webFlux 全局异常
重写实现 WebExceptionHandler :
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebExceptionHandler;
import reactor.core.publisher.Mono; @Component
@Order(-2)
public class MyWebExceptionHandler implements WebExceptionHandler { @Autowired
private ObjectMapper objectMapper; @Override
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
ResultWrapper resultWrapper = ResultWrapper.builder().message("unknown").build();
if (ex instanceof RuntimeException){
resultWrapper.setMessage(ex.getMessage());
}
byte[] bytes =null;
try {
bytes= objectMapper.writeValueAsBytes(resultWrapper); } catch (JsonProcessingException e) {
e.printStackTrace();
bytes="".getBytes();
} DataBufferFactory dataBufferFactory = exchange.getResponse().bufferFactory();
DataBuffer wrap = dataBufferFactory.wrap(bytes);
return exchange.getResponse().writeWith(Mono.just(wrap));
}
}
5. webFlux 过滤器的使用:
WebFlux中过滤器的使用方法和SpringMVC中相似,都是实现接口中的filter方法。
SpringMVC中使用WebFliter接口,而在WebFlux中使用的是HandlerFilterFunction接口
@Order注解,表示过滤器会按添加的顺序进行顺序调用
@Order
@Component
public class AuthFilter implements HandlerFilterFunction { @Override
public Mono filter(ServerRequest request, HandlerFunction next) {
if (request.queryParam("token").isPresent()) {
return next.handle(request);
} else {
return ServerResponse.status(HttpStatus.BAD_REQUEST).build());
}
}
}
6. 业务应用
由于 已有业务代码开发及上手使用的熟练程度,使用webFlux 都需要一定的过度及学习时间。为了使用 webFlux 以及提高系统性能,
在网关模块中使用 webflux ,提高系统的并发以及处理的速度。
需要注意的是 webflux 启动依赖的 是 netty。 不兼容 tomcat,所以在 微服务中如果依赖 webflux ,则需要排除 tomcat 相关的依赖。
webflux 的使用总结的更多相关文章
- springboot2 webflux 响应式编程学习路径
springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑问将会成为未来技术的趋势,是必学 ...
- Spring Webflux: Kotlin DSL [片断]
原文链接:https://dzone.com/articles/spring-webflux-kotlin-dsl-snippets 作者:Biju Kunjummen 译者:Jackie Tang ...
- 一文带你了解 Spring 5.0 WebFlux 应用场景
一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...
- Spring Boot 2.0 WebFlux 教程 (一) | 入门篇
目录 一.什么是 Spring WebFlux 二.WebFlux 的优势&提升性能? 三.WebFlux 应用场景 四.选 WebFlux 还是 Spring MVC? 五.异同点 六.简单 ...
- Spring WebFlux开门迎客,却来了一位特殊客人
话说Spring WebFlux已经出现有一段时间了,但是知道他的人并不是很多.这让他很是闷闷不乐. 还有更惨的是,那些敢于吃螃蟹的人在尝试了他之后,有的竟把代码重新改回到Spring MVC的同步模 ...
- Spring Boot 2.x 系列教程:WebFlux 系列教程大纲(一)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! WebFlux 系列教程大纲 一.背景 大家都知道,Sprin ...
- Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...
- 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux
情景引入 很早之前,Java就火起来了,是因为它善于开发和处理网络方面的应用. Java有一个爱好,就是喜欢制定规范标准,但自己又不善于去实现. 反倒是一些服务提供商使用它的规范标准来制造应用服务器而 ...
- Spring WebFlux 响应式编程学习笔记(一)
各位Javaer们,大家都在用SpringMVC吧?当我们不亦乐乎的用着SpringMVC框架的时候,Spring5.x又悄(da)无(zhang)声(qi)息(gu)的推出了Spring WebFl ...
- Spring WebFlux 要革了谁的命?
Spring WebFlux 要革了谁的命? mp.weixin.qq.com 托梦 Java国王昨晚做了一个梦. 梦中有个白胡子老头儿,颇有仙风道骨, 告诉他说:“你们Java啊,实在是太弱了,连 ...
随机推荐
- 使用Mybatis自定义插件实现不侵入业务的公共参数自动追加
背景 后台业务开发的过程中,往往会遇到这种场景:需要记录每条记录产生时间.修改时间.修改人及添加人,在查询时查询出来. 以往的做法通常是手动在每个业务逻辑里耦合上这么一块代码,也有更优雅一点的做法是写 ...
- ChatGPT API来了 附调用方法及文档
3月1日,OpenAI 放出了ChatGPT API(GPT-3.5-turbo 模型),1000个tokens为$0.002美元,等于每输出 100 万个单词,价格才 2.7 美金(约 18 元人民 ...
- 神经网络优化篇:详解神经网络的权重初始化(Weight Initialization for Deep NetworksVanishing / Exploding gradients)
神经网络的权重初始化 这是一个神经单元初始化地例子,然后再演变到整个深度网络. 来看看只有一个神经元的情况,然后才是深度网络. 单个神经元可能有4个输入特征,从\(x_{1}\)到\(x_{4}\), ...
- 【OpenCV】在MacOS上源码编译OpenCV
前言 在做视觉任务时,我们经常会用到开源视觉库OpenCV,OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,它具有C++,Python,Java和MATLA ...
- Linux测试磁盘读写性能
1.安装必要的工具: 确保系统上已经安装了必要的工具,hdparm和fio.使用以下命令来安装它们: sudo yum install hdparm fio -y 2.使用hdparm测试磁盘读性能: ...
- SQL注入Fuzzing字典
需要的自取 ' " # - -- ' -- --'; ' ; = ' = ; = -- \x23 \x27 \x3D \x3B' \x3D \x27 \x27\x4F\x52 SELECT ...
- 关于向上转型以及向下转型、instanceof的一些应用。
一.前言 在Java编程中,我们常常遇到各种类型转换的情况,尤其是在处理继承关系的类时.本文将深入探讨Java中的向上转型(upcasting).向下转型(downcasting)以及instance ...
- 文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题
一.参照图6-2的方法,说明 MAX-HEAPIFY(A,3)在数组 A=(27,17,3,16,13,10,1,5,7,12,4,8,9,0)上的操作过程. 文心一言: 下面是 MAX-HEAPIF ...
- Spring Cloud Eureka 服务注册中心怎么配置
「Spring Cloud Eureka 入门系列」 Spring Cloud Eureka 入门 (一)服务注册中心详解 Spring Cloud Eureka 入门 (二)服务提供者详解 Spri ...
- 华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!
本文分享自华为云社区<华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!>,作者: 华为云头条. 2023年10月10日,华为云正式发布CodeArts API ...