Spring 5 webflux响应式编程

前言


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类型。

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



函数式编程范式


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

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

1.定义person类


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

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



3.定义PersonHandler


4.编写函数式服务端


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

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


虽然我们只修改了少量的代码,整个技术栈从命令式的、同步阻塞的【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以及开源伙伴们新的探索,最后献上一张官方文档的图:



项目源码:

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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 张红云 平顶山 坚持分享第225天( 原创总第393天 2018年1月2日 星期二) 新年伊始,焦点团队的老...
    红云_杨柳清风阅读 430评论 0 0
  • 想想开头也不知道写什么主题,算了,随便写写。 之前总是以为男孩子和女孩子的区别就只是身体上的,但忽然发现,不止,这...
    22岁的天才阿坤阅读 175评论 1 2
  • 那天早晨 我看见 绿皮火车穿山而过 行进地缓慢 隐藏一段 又显露一段 距离有些远 听不见车轮摩擦轨道的声音 但我却...
    然落夕里阅读 215评论 0 3