现在有公司在使用 Spring Boot 2.0 的 WebFlux 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EXChen
V2EX    Java

现在有公司在使用 Spring Boot 2.0 的 WebFlux 吗?

  •  
  •   EXChen
    itren 2018 年 11 月 14 日 18902 次点击
    这是一个创建于 2719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    22 条回复    2019-08-31 08:09:02 +08:00
    shazh520
        1
    shazh520  
       2018 年 11 月 14 日
    想用呢
    FanError
        2
    FanError  
       2018 年 11 月 14 日 via iPhone
    简单的瞟了几眼,没搞明白这玩意儿的使用场景是怎么样的?
    cyhulk
        3
    cyhulk  
       2018 年 11 月 14 日   1
    终于可以回答问题了,正好看到你这个问题,reactive stream 我一直在看,总结下来,就像上面的老兄说的,第一次看看不太懂,所以说学习成本还是有的,你要从原来的 servlet 体系过度到 reactive stream 体系,要去理解 reactive 的含义确实需要时间,尤其 reactor 里面有很多的操作需要理解。除此之外,spring 还有很多的工作要做,比如 security 以前是基于拦截器实现的验证,要对 reactive 进行适配,而且 db 这块,除了 mongodb 有 reactive client 外,jdbc 没有 reactive client,而且好多变量都是 threadlocal 的,servlet-worker 的还好用,reactive 的线程就比较乱了,不好梳理,所以现在漫漫长路啊。
    lhx2008
        4
    lhx2008  
       2018 年 11 月 14 日
    我的个人项目 www.jinrishici.com 的 API 使用 Webflux,在公司里面用,要看领导同不同意了,如果不管就用呗。不过一般是不行的,有一点学习壁垒,别人看不懂你写的代码。
    lhx2008
        5
    lhx2008  
       2018 年 11 月 14 日   1
    好处的话,就是可以吃到 Netty 的性能优势,而且项目布局遵循 Spring MVC 的风格,也可以和 Spring Cloud,Spring security 整合。
    说到学习成本,其实只要不是 硬盘 /网络 IO 操作,完全可以按照原来的同步方法写,最后返回的时候包装一下就行了。如果涉及到 IO 操作就必须要用 Webflux 的异步 /线程池处理,或者用 Spring Data Reactive,最后整个性能还是不错的。
    最大缺点是不支持异步 Mysql,不过这个 Netty 的程序都不支持,没有异步 JDBC

    如果还没入坑的同学,我可以普及一下,就是 Stream 一把梭到底,没有 终结操作,然后 Stream to List 之后,不会退出 Stream,而是单个元素再套一个 Stream,然后可以随时转回正常 Stream,然后 Webflux 就把你写的这一坨 Stream 丢到 Netty 那边找条线程一起消费了,就是这么简单。

    比 Stream 的优势是可以异步提交任务( EventBus ),可以控制某段代码在某个线程池执行,可以切分任务流到多个线程,串并行切换等等。
    waising
        6
    waising  
       2018 年 11 月 14 日
    @cyhulk 配套的服务很多没有支持的都需要修改
    EXChen
        7
    EXChen  
    OP
       2018 年 11 月 15 日 via iPhone
    @cyhulk #3 我以前写过 Android,用过 RxAndroid 所以语法上并无明显障碍,听你这么一说这个技术的生态还不够完善,我们的系统主要是跟数据库打交道的,感觉提现不出它的优势之处。
    cyhulk
        8
    cyhulk  
       2018 年 11 月 15 日
    @waising 所以说还是任重道远,短期内不适合生产,需要 spring 好好打磨
    cyhulk
        9
    cyhulk  
       2018 年 11 月 15 日   1
    @EXChen RxJava 是基于 Observe 设计模式设计的,reactive-stream 则不是,个人观点认为 reactive-stream 是一套严格意义上的 API,不管是 Observe 还是 reactive-stream 都是 event 驱动模式
    EXChen
        10
    EXChen  
    OP
       2018 年 11 月 15 日
    @cyhulk 是不是和事件总线很类似?
    cyhulk
        11
    cyhulk  
       2018 年 11 月 15 日
    @lhx2008 我觉得这个难度不在于 netty,而在于 stream 是如何反应的,从原来的 servlet-container 到现在的从 reactor-netty 在到上层的 webhandler,这整个流的贯穿是如何控制和流转的,这个思维转变才是最难的
    cyhulk
        12
    cyhulk  
       2018 年 11 月 15 日
    @EXChen 事件总线模型的含义是不是所有人都关注总线,但是只对总线上自己关注的特定类型的时间感兴趣?如果你说的总线是这个样子的,那两者是有区别的
    EXChen
        13
    EXChen  
    OP
       2018 年 11 月 15 日
    @cyhulk 对的,我对事件总线的认识是这样的,因为以前 Android 中的事件总线有用过,但不知道为什么后来 Android 开发中不推荐使用事件总线了,给出的原因是注册太多的事件会造成逻辑的混乱。不过现在主要做后端了,很少接触这类框架。
    lhx2008
        14
    lhx2008  
    /div>   2018 年 11 月 15 日
    @cyhulk
    @EXChen
    我觉得要和 总线模型 区别开来,我更愿意把他理解成一个加强版的 Stream,就是组装一串鞭炮,然后直接找一个地方点了,然后点的时候,Stream 会自动选择和切换合适的线程。
    而总线的重点是中心负责注册、消费和线程调度。消费者和生产者严格的分开,通过 key 解耦,比如 Vert.x 的解决方案,优势是可以跨语言调度,缺点是增加了使用成本。
    godoway
        15
    godoway  
       2018 年 11 月 15 日
    想用但有一个问题,现在大部分关系型数据库都不支持异步啊。
    于是 webflux 的异步优势就又被数据库 io 阻塞弄没了。
    另外 oracle 貌似在搞一个 ADBA(Asynchronous Database Access API), 而 pqsql 好像是支持异步但没官方的支持异步的 driver(第三方有一个 reactive-pg-client)
    cyhulk
        16
    cyhulk  
       2018 年 11 月 15 日
    @godoway 这也是部分原因,但是可以使用 publishon 处理,关键是 pagehelper 这种常用的插件是几月 threadlocal 的
    godoway
        17
    godoway  
       2018 年 11 月 15 日
    @cyhulk 之前有看到一个 Mono.fromCallable(callable).publishOn(schedule)封装成异步,不过提供方案的人说这样会使用不了事务。
    cyhulk
        18
    cyhulk  
       2018 年 11 月 15 日
    @godoway 是的,原因可能也是 threadlocal 变量的引用导致的,servlet-container 所有的操作都是在一个 worker 中,但是 reactor 是有线程应该取决于你的 subscriber 的
    godoway
        19
    godoway  
       2018 年 11 月 15 日   1
    @cyhulk 本想说用不了事务就没什么意义了,不过想到 mongo 原本也不支持事务...
    感觉 webflux 还是等非阻塞的 jdbc 出现了才能大面积推广吧。
    gz911122
        20
    gz911122  
       2018 年 11 月 16 日
    用这个我还不如用 vert.x 呢 起码比较成熟
    cweijan
        21
    cweijan  
       2018 年 12 月 21 日
    没必要用,
    hangszhang
        22
    hangszhang  
       2019 年 8 月 31 日
    那种业务聚合型的代码可以使用,不过业务聚合型的代码用 node 更好...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2631 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 50ms UTC 10:30 PVG 18:30 LAX 03:30 JFK 06:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86