webflux介绍
Spring Boot 2.0
spring.io 官网有句醒目的话是:
BUILD ANYTHING WITH SPRING BOOT
Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从搭建到开发的过程。应用开箱即用,只要通过一个指令,包括命令行 java -jar 、SpringApplication 应用启动类 、 Spring Boot Maven 插件等,就可以启动应用了。另外,Spring Boot 强调只需要很少的配置文件,所以在开发生产级 Spring 应用中,让开发变得更加高效和简易。目前,Spring Boot 版本是 2.x 版本。Spring Boot 包括 WebFlux。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0QiBq9N-1647350877518)(//upload-images.jianshu.io/upload_images/13587608-2108800ca0602799.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]
传统的以SpringMVC为代表的webmvc技术使用的是同步阻塞式IO模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-we3JkRy0-1647350877522)(//upload-images.jianshu.io/upload_images/13587608-e87cc1031dff253b.png?imageMogr2/auto-orient/strip|imageView2/2/w/891/format/webp)]
而Spring WebFlux是一个异步非阻塞式IO模型,可以用少量的容器线程支撑大量的并发访问,所以Spring WebFlux可以提升吞吐量和伸缩性,但是接口的响应时间并不会缩短,其处理结果还是得由worker线程处理完成之后在返回给请求。想学习交流HashMap,nginx、dubbo、Spring MVC,分布式、高性能高可用、MySQL,redis、jvm、多线程、netty、kafka、的加尉xin(同英):1253431195 扩列获取资料学习,无工作经验不要加哦!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rtkYH6rj-1647350877523)(//upload-images.jianshu.io/upload_images/13587608-0c9ab223c04faeb0.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]
webflux应用场景
适合IO密集型、磁盘IO密集、网络IO密集等服务场景,比如微服务网关,就可以使用webflux技术来显著的提升网关对下游服务的吞吐量,spring cloud gateway就使用了webflux这门技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3urQyoN-1647350877524)(//upload-images.jianshu.io/upload_images/13587608-371f3ac43c0227b1.png?imageMogr2/auto-orient/strip|imageView2/2/w/861/format/webp)]
Spring Boot 2.0 WebFlux
了解 WebFlux,首先了解下什么是 Reactive Streams。Reactive Streams 是 JVM 中面向流的库标准和规范:
- 处理可能无限数量的元素
- 按顺序处理
- 组件之间异步传递
- 强制性非阻塞背压(Backpressure)
Backpressure(背压)
背压是一种常用策略,使得发布者拥有无限制的缓冲区存储元素,用于确保发布者发布元素太快时,不会去压制订阅者。
Reactive Streams(响应式流)
一般由以下组成:
- publisher:发布者,发布元素到订阅者
- subscriber:订阅者,消费元素
- subscription:订阅,在发布者中,订阅被创建时,将与订阅者共享
- processor:处理器,发布者与订阅者之间处理数据,包含了发布者与订阅者的共同体
publisher接口规范
public interface Publisher<T> {
void subscribe(Subscriber<? super T> var1);
}
subscriber接口规范
public interface Subscriber<T> {
void onSubscribe(Subscription var1);
void onNext(T var1);
void onError(Throwable var1);
void onComplete();
}
subscription接口规范
public interface Subscription {
void request(long var1);
void cancel();
}
processor接口规范
public interface