欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

SpringGateway + WebFlux 异步非阻塞开发学习

最编程 2024-05-26 13:49:27
...

1、什么是WebFlux?WebFlux与MVC区别?

官方网站:docs.spring.io/spring-fram…

SpringWebflux的介绍

(1)、SpringWebflux是Spring5中添加的新模块,用于web开发,功能和SpringMVC相似,Webflux使用的是响应式编程方式

(2)、Webflux是一种异步非阻塞的框架

(3)、非阻塞和阻塞、异步和同步

异步和同步是针对调用者的,调用者发送请求。如果调用者等待对方回应之后才去做其他事情,就是同步;如果发送请求之后不等待对方的回应,而是接着做其他的事情,就是异步。

阻塞和非阻塞是针对被调用者的,被调用者在接收到请求之后,在完成请求任务之后才给出反馈的,就是阻塞;如果收到请求之后先给出反馈,然后再去完成请求任务的,就是非阻塞

(4)、Webflux的特点:

第一,非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程

第二,函数式编程:webflux使用函数式编程方式实现路由请求

(5)、SpringWebflux和SpringMVC的比较

SpringMVC方式实现:

同步阻塞,基于SpringMVC+Servlet+Tomcat

SpringWebflux方式实现:

异步非阻塞,基于SpringWebflux+Reactor+Netty

clipboard.png

备注:1、想了解其他更多信息,可自行搜索,网上资料很多也很详细

           2、访问量200以上,WebFLux才能体现出性能优势;200以下与MVC差别不大

           3、不能和spring-cloud-stater-web同时引入,否则就是MVC的项目了

2、Webflux基本知识学习

Webflux是基于Reactor的,所以推荐几个网站仅供参考学习

Reactor的学习网站推荐:

(1)WebFlux 教程 | 入门篇:www.exception.site/webflux

(2)响应式编程:www.jianshu.com/nb/46654683

(3)Mono和Flux的用法详解:blog.****.net/lz710117239…

3、SpringGateWay+WebFlux搭建项目

(1)开发环境

开发工具: idea 2021.3

JDK:11  Oracle OpenJDK version 11.0.15

SpringCloudAlibaba相关依赖:

管理依赖包:com.alibaba.cloud:spring-cloud-alibaba-dependencies:2021.0.1.0

nacos:com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2021.0.1.0

config:com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0'

gateway:org.springframework.cloud:spring-cloud-starter-gateway:3.1.2

webflux:org.springframework.boot:spring-boot-starter-webflux:2.6.7

reativefeign:com.playtika.reactivefeign:feign-reactor-spring-configuration:3.2.0

reativefeign:com.playtika.reactivefeign:feign-reactor-webclient:3.2.0

reativefeign:com.playtika.reactivefeign:feign-reactor-cloud:3.2.0

seacurity:org.springframework.cloud:spring-cloud-starter-security:2.2.5.RELEASE

oauth2:org.springframework.cloud:spring-cloud-starter-oauth2:2.2.5.RELEASE

jwt:org.springframework.security:spring-security-jwt:1.1.1.RELEASE

bootstrap:org.springframework.cloud:spring-cloud-starter-bootstrap:3.1.2

hutool工具类包:cn.hutool:hutool-all:5.7.22

备注:1、因为open-feign暂时暂时不支持reactor异步非阻塞,所以官方推荐com.playtika.reactivefeign,github地址:github.com/Playtika/fe…

          2、如果项目不需要用Security+OAuth2.0+JWT实现统一登录权限认证功能。如不需要可以删除相关依赖

          3、bootstrap这个依赖包单独添加一下,具体原因看问题及解决方案4.3。

          4、hutool工具类包是第三方的一个工具类库。参考地址:www.hutool.cn/

(2)、新建启动类,进行项目的测试及扩展,可自行搜索。

4、开发中遇到的一些问题及解决方案

1、问题描述:当前端请求的传参格式是fomedata或者是x-www-form-urlencoded(content-type是application/x-www-form-urlencoded或者是multipart/form-data),controller是获取不到参数值的。

原因:在spring官方文档中,有提及对fromdata表单数据的获取,如下图

4-1.png

fromdata表单数据需要通过ServerWebExchange 的getFormData()获取【也可以通过getMultipartData()方法获取数据】。

解决方法:自定义注解统一处理参数接受。参考地址:

webflux 支持formdata获取参数(包括文件),以及formdata参数封装

blog.****.net/qq_37044686…

2、问题描述:在微服务架构中,例如你的当前服务A是基于WebFLux搭建,你需要发送请求请求B,而B是基于MVC搭建的服务,请求参数是Object对象。B的接口服务会出现接受不到对象参数的情况。

解决方法:在B服务对应方法接受参数的时候 对象参数名前加@RequestBody注解

例如:public String XXX(@RequestBody User user) {}

3、问题描述:因拉取不到nacos配置文件,启动后直接报错

4-3.png

原因:在用webflux方式搭建项目时,gateway内部依赖的spring-cloud-starter这个包在拉去nacos的配置文件时候的问题,具体原因未详查。

解决方案:根据自己需要重新依赖一下与自己项目相匹配的bootstrap依赖版版本就可以。

4、使用WebFLux如何通过嵌套来实现同步的顺序执行

主要用到的操作符是flatMap

4-4.png

5、问题描述:循环依赖

4-5.png

原因:SpringBoot2.6.X以后已经禁止循环依赖

解决方法:applcation.yml中设置允许循环依赖

spring:

  main:

    allow-circular-references: true

推荐阅读