V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EXChen
V2EX  ›  Java

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

  •  
  •   EXChen ·
    itren · 2018-11-14 17:08:03 +08:00 · 18222 次点击
    这是一个创建于 2201 天前的主题,其中的信息可能已经有所发展或是发生改变。
    22 条回复    2019-08-31 08:09:02 +08:00
    shazh520
        1
    shazh520  
       2018-11-14 18:47:05 +08:00
    想用呢
    FanError
        2
    FanError  
       2018-11-14 19:01:06 +08:00 via iPhone
    简单的瞟了几眼,没搞明白这玩意儿的使用场景是怎么样的?
    cyhulk
        3
    cyhulk  
       2018-11-14 21:22:59 +08:00   ❤️ 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 21:25:26 +08:00
    我的个人项目 www.jinrishici.com 的 API 使用 Webflux,在公司里面用,要看领导同不同意了,如果不管就用呗。不过一般是不行的,有一点学习壁垒,别人看不懂你写的代码。
    lhx2008
        5
    lhx2008  
       2018-11-14 21:35:04 +08:00   ❤️ 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 22:20:00 +08:00
    @cyhulk 配套的服务很多没有支持的都需要修改
    EXChen
        7
    EXChen  
    OP
       2018-11-15 09:10:43 +08:00 via iPhone
    @cyhulk #3 我以前写过 Android,用过 RxAndroid 所以语法上并无明显障碍,听你这么一说这个技术的生态还不够完善,我们的系统主要是跟数据库打交道的,感觉提现不出它的优势之处。
    cyhulk
        8
    cyhulk  
       2018-11-15 09:50:37 +08:00
    @waising 所以说还是任重道远,短期内不适合生产,需要 spring 好好打磨
    cyhulk
        9
    cyhulk  
       2018-11-15 09:52:49 +08:00   ❤️ 1
    @EXChen RxJava 是基于 Observe 设计模式设计的,reactive-stream 则不是,个人观点认为 reactive-stream 是一套严格意义上的 API,不管是 Observe 还是 reactive-stream 都是 event 驱动模式
    EXChen
        10
    EXChen  
    OP
       2018-11-15 09:54:28 +08:00
    @cyhulk 是不是和事件总线很类似?
    cyhulk
        11
    cyhulk  
       2018-11-15 09:55:38 +08:00
    @lhx2008 我觉得这个难度不在于 netty,而在于 stream 是如何反应的,从原来的 servlet-container 到现在的从 reactor-netty 在到上层的 webhandler,这整个流的贯穿是如何控制和流转的,这个思维转变才是最难的
    cyhulk
        12
    cyhulk  
       2018-11-15 09:57:03 +08:00
    @EXChen 事件总线模型的含义是不是所有人都关注总线,但是只对总线上自己关注的特定类型的时间感兴趣?如果你说的总线是这个样子的,那两者是有区别的
    EXChen
        13
    EXChen  
    OP
       2018-11-15 10:01:35 +08:00
    @cyhulk 对的,我对事件总线的认识是这样的,因为以前 Android 中的事件总线有用过,但不知道为什么后来 Android 开发中不推荐使用事件总线了,给出的原因是注册太多的事件会造成逻辑的混乱。不过现在主要做后端了,很少接触这类框架。
    lhx2008
        14
    lhx2008  
       2018-11-15 10:22:39 +08:00
    @cyhulk
    @EXChen
    我觉得要和 总线模型 区别开来,我更愿意把他理解成一个加强版的 Stream,就是组装一串鞭炮,然后直接找一个地方点了,然后点的时候,Stream 会自动选择和切换合适的线程。
    而总线的重点是中心负责注册、消费和线程调度。消费者和生产者严格的分开,通过 key 解耦,比如 Vert.x 的解决方案,优势是可以跨语言调度,缺点是增加了使用成本。
    godoway
        15
    godoway  
       2018-11-15 11:41:03 +08:00
    想用但有一个问题,现在大部分关系型数据库都不支持异步啊。
    于是 webflux 的异步优势就又被数据库 io 阻塞弄没了。
    另外 oracle 貌似在搞一个 ADBA(Asynchronous Database Access API), 而 pqsql 好像是支持异步但没官方的支持异步的 driver(第三方有一个 reactive-pg-client)
    cyhulk
        16
    cyhulk  
       2018-11-15 13:41:34 +08:00
    @godoway 这也是部分原因,但是可以使用 publishon 处理,关键是 pagehelper 这种常用的插件是几月 threadlocal 的
    godoway
        17
    godoway  
       2018-11-15 15:25:07 +08:00
    @cyhulk 之前有看到一个 Mono.fromCallable(callable).publishOn(schedule)封装成异步,不过提供方案的人说这样会使用不了事务。
    cyhulk
        18
    cyhulk  
       2018-11-15 15:37:16 +08:00
    @godoway 是的,原因可能也是 threadlocal 变量的引用导致的,servlet-container 所有的操作都是在一个 worker 中,但是 reactor 是有线程应该取决于你的 subscriber 的
    godoway
        19
    godoway  
       2018-11-15 16:52:01 +08:00   ❤️ 1
    @cyhulk 本想说用不了事务就没什么意义了,不过想到 mongo 原本也不支持事务...
    感觉 webflux 还是等非阻塞的 jdbc 出现了才能大面积推广吧。
    gz911122
        20
    gz911122  
       2018-11-16 18:10:56 +08:00
    用这个我还不如用 vert.x 呢 起码比较成熟
    cweijan
        21
    cweijan  
       2018-12-21 15:17:41 +08:00
    没必要用,
    hangszhang
        22
    hangszhang  
       2019-08-31 08:09:02 +08:00
    那种业务聚合型的代码可以使用,不过业务聚合型的代码用 node 更好...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1823 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 16:32 · PVG 00:32 · LAX 08:32 · JFK 11:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.