>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 20794 个阅读者 刷新本主题
 * 贴子主题:  Spring 5 webflux响应式编程 - 但时间也偷换概念 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2024-10-28 03:17:44     消息  查看  搜索  好友  邮件  复制  引用

    

前言

          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中使用JavaBean(Ⅱ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->客户端协议处理框架
  精通Spring-->通过Vuex进行状态管理
  Vue3开发-->绑定表单
  Marshalling在Netty中的使用
  Netty权威指南:I/O 多路复用技术
  Redis为什么单线程能够支持高并发
  git 常用指令总结
  面试官问什么是Spring循环依赖,该如何回答?
  Spring API中JAVA反射—工具类ReflectionUtils
  卫琴姐姐制作的最新视频课程:基于Spring的JavaWeb开发技术详...
  Spring MVC处理静态资源文件的方式
  Spring MVC数据验证
  探讨通过Feign配合Hystrix进行调用时异常的处理
  如何实现Git服务间同步
  Spring Security中使用的责任链模式
  Spring+JPA+ehcache开启二级本地缓存
  spring-boot-plus V1.4.0发布 集成用户角色权限部门管理 - g...
  Java核心库实现AOP过程
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 gywfind 
  
威望: 0
级别: 新手上路
魅力: 155
经验: 155
现金: 1088
发文章数: 11
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


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


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