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啊,实在是太弱了,连 ...
随机推荐
- Feign源码解析:初始化过程(二)
背景 上一篇介绍了Feign源码初始化的一部分,内容主要是,@EnableFeignClients.@FeignClient这些注解,都支持设置一些自定义的配置类: A custom @Configu ...
- 安装服务器提示A debugger has been found running in your system. Please, unload it from memory and restart
解决方法:运行msconfig,取消调试模式,重启电脑再安装
- BeanCurrentlyInCreationException解决当前容器创建异常、循环依赖问题
BeanCurrentlyInCreationException解决当前容器创建异常.循环依赖问题 一.什么是循环依赖呢? 类A依赖类B,类B也依赖类A,这种情况就会出现循环依赖. Bean A → ...
- Python——第四章:作用域
作用域: 变量的访问权限 全局变量 -> 全局作用域 局部变量 -> 局部作用域(比如在函数内定义的变量,只能在函数内调用) a = 10 # 全局变量 -> 全局作用域 print ...
- 技本功|统计信息对SQL执行效率的影响
在一个风和日丽的下午,奋哥哥突然接到业务方线上业务数据库CPU资源告警信息,立马放下手里的枸杞登录业务方阿里云控制台查看具体问题. 对于数据库当前正在发生中的问题,我们首先从数据库实时会话信息中尝试抓 ...
- 终于卷完了!MySQL 打怪升级进阶成神之路(2023 最新版)!
从第一篇文章开始,我们逐步详细介绍了 MySQL 数据库的基础知识,如:数据类型.存储引擎.性能优化(软.硬及sql语句),MySQL 数据库的高可用架构的部分,如:主从同步.读写分离的原理与实践.跨 ...
- f-VAEGAN-D2:VAE+GAN处理零样本学习问题
虽然f-VAEGAN-D2在题目中说"适用任意样本",但对比的Few-shot相关的实验较少,这里仅讨论零样本学习的情况. 1. 背景介绍 由于为每个对象收集足够数量的高质量带标签 ...
- 高版本jdk的访问私有成员属性的正确姿势
在jdk17+已经不能直接通过 setAccessible 来访问私有属性了 Field name = access.getClass().getDeclaredField("name&qu ...
- 3、Container容器组件
Container容器组件 代码 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( hom ...
- maven系列:POM文件总体配置说明
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...