>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring》、《Spring Cloud Alibaba微服务开发零基础入门到实操》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 25715 个阅读者 刷新本主题
 * 贴子主题:  Spring 5 webflux响应式编程 - 但时间也偷换概念 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2025-09-12 08:50:05     消息  查看  搜索  好友  邮件  复制  引用

    

前言

          Spring 5 是流行的 Spring 框架的下一个重大的版本升级。Spring 5 中最重要改动是把反应式编程的思想应用到了框架的各个方面,Spring 5 的反应式编程以 Reactor 库为基础。

web flux

WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。该模块中包含了对反应式 HTTP、服务器推送事件和 WebSocket 的客户端和服务器端的支持。对于开发人员来说,比较重要的是服务器端的开发,这也是本文的重点。在服务器端,WebFlux 支持两种不同的编程模型:

1. Spring MVC 中使用的基于 Java 注解的方式;

2. 基于 Java 8 的 lambda 表达式的函数式编程模型。

这两种编程模型只是在代码编写方式上存在不同。它们运行在同样的反应式底层架构之上,因此在运行时是相同的。WebFlux 需要底层提供运行时的支持,WebFlux 可以运行在支持 Servlet 3.1 非阻塞 IO API 的 Servlet 容器上,或是其他异步运行时环境,如 Netty 和 Undertow。        

注解编程范式

先来看一下注解方式

注解方式只需要在spring web mvc/boot基础上更换依赖,替换controller、repository等模块请求&返回参数类型即可。

具体如下:

一个标准的spring web项目controller层

@RestController

?public class HelloController {

? ? ? ?@GetMapping("/hello")

? ? ? ? public String hello() {

? ? ? ? ? ? return "Welcome to reactive world ~";

? ? ? ? }

? }

              改成web flux

1.添加maven依赖

  <dependency>

? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? <artifactId>spring-boot-starter-webflux</artifactId>?

? ? </dependency>

              2.修改参数类型

     @RestController

public class HelloController {

? ? ? ? @GetMapping("/hello")

? ? ? ? public Mono<String> hello() {?  // 【改】返回类型为Mono<String>

? ? ? ? ? ? return Mono.just("Welcome to reactive world ~");? ?  // 【改】使用Mono.just生成响应式数据

? ? ? ? }

?}

              如果返回类型是集合,就使用Flux类型。

具体在官方文档描述如下:

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小                  

函数式编程范式

          我们来看一下如何使用function的形式编写一个reactive风格的spring web项目。

按照spring官方文档示例编码如下:

1.定义person类

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          2.定义PersonRepository接口&接口实现类NickPersonRepository

(成员变量map模拟redis、mongodb等存储,读者可自行更换为spring-data-jpa或者spring-data-mongodb等)

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                                  点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          3.定义PersonHandler

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          4.编写函数式服务端

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          我这里使用的是netty来运行,如果想使用其它的,可以在官方文档查阅代码。

https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          虽然我们只修改了少量的代码,整个技术栈从命令式的、同步阻塞的【spring-webmvc + servlet + Tomcat】变成了响应式的、异步非阻塞的【spring-webflux + Reactor + Netty】。

              运行main方法启动测试:

curl -v'http://localhost:8080/person'

curl -v'http://localhost:8080/person/1'

curl -d'{"name":"Bruce Lee","age":"36"}'-H'Content-Type: application/json'-v'http://localhost:8080/person'        

总结

spring 5推出响应式函数编程方式web flux,并配套data出了很多reactive风格的api,比如mongodb、redis等,现在好像还没有支持jdbc,官方鼓励的使用方式应该是netty端运行,并且是特定场景下,目前看来并不是所有场景都适合springmvc直接升级,让我们一起期待spring以及开源伙伴们新的探索,最后献上一张官方文档的图:

                         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

                       项目源码:

https://github.com/Spring5945/web-flux-sample

              undertow、tomcat、jetty等服务器性能压测对比文章:

https://www.jishuwen.com/d/2J7I

              关于springmvc升级web flux性能文章:

https://blog.lovezhy.cc/2018/12/29/webflux%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98/

----------------------------
原文链接:https://www.jianshu.com/p/6745c70ac8b2

程序猿的技术大观园:www.javathinker.net

  Java面向对象编程-->泛型
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->使用JPA和注解
  Java网络编程-->通过JDBC API访问数据库
  精通Spring-->通过Vuex进行状态管理
  Vue3开发-->CSS过渡和动画
  谈谈响应式编程
  使用Spring MVC统一异常处理实战
  vue父、子组件相关的传递
  Spring Boot、SpringMVC进行i18n国际化支持:使用MessageSou...
  超详细使用Maven 搭建 Spring MVC 本地部署Tomcat 实现 Hell...
  Spring MVC的国际化
  微服务拆分实践
  从零搭建一个基于 ELK 的日志、指标收集与监控系统
  Spring Cloud与Dubbo的完美融合之手「Spring Cloud Alibaba
  RESTful架构和RESTful API设计总结
  浓缩精华的架构演进过程,经验总结,值得收藏!
  kubernetes 中的资源
  Zabbix后端存储ES的优化实践
  Spring Boot 整合 Ehcache
  Spring Boot整合WebSocket及Spring Security实例
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 gywfind 
  
威望: 0
级别: 新手上路
魅力: 145
经验: 145
现金: 1068
发文章数: 10
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


背叛伤害不了你,能伤你的,是你太在乎。分手伤害不了你,能伤你的福彩双色球澳洲幸运20幸运飞艇
是回忆。无疾而终的恋情伤害不了你,能伤你的,是希望。你总以为是感情伤害了你,其实伤到你的人,永远是自己。
发文章时间 2025-09-12 08:50:05
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。