如果要在 Spring webflux 和 Vert.x web 选一个,在不仅仅只考虑性能的情况下,选哪一个

2020-05-20 17:32:35 +08:00
 tctc4869

在 Spring webflux 和 Vert.x web 的两种都有基于 netty 的响应式 webmvc 框架选一个,在不仅仅只考虑性能的情况下,(例如灵活可扩展性,多种可能的开发方式选择)等,各位会选择哪一个?

除了 Spring webflux 和 Vert.x web,还有哪些呢?

11325 次点击
所在节点    Java
83 条回复
tctc4869
2020-05-21 11:27:03 +08:00
@yizmaoaa 大神,我还想问一下关于 vert.x 做 tcp 服务端的问题,vert.x 做 tcp 服务端要考虑哪些关键配置?除了考虑 tcp 协议本身导致的粘包拆包问题,还需要考虑或顾忌哪些配置设置?对于这方面,有资料或文档说明么?
starcraft
2020-05-21 11:43:01 +08:00
这个帖子是迄今为止,在 v2 上看到关于 vertx webflux 最靠谱的了。
itwarcraft88
2020-05-21 11:53:51 +08:00
公司的新项目,打算上 springboot 2.3, 正好 release 了,使用 java+kotlin 混编,后台系统由另一个同事负责使用 springboot 的 web+mybatis,我搞移动端的 API,打算 kotlin+webflux+jdbc(感觉暂时用不到 r2dbc,性能要求不高),所以打算使用 mybatis,保持和另一个同事共享一部分代码,算是折腾尝试一下。如果觉得爽的话,再把老项目进行升级。
yizmaoaa
2020-05-21 11:59:24 +08:00
@tctc4869 其实我本身并没有开发过 TCP 服务端的问题。。。没有啥其他配置,使用 Vert.x 的唯一问题就是不要阻塞 EventLoop 。其他都一样。。。
sagaxu
2020-05-21 12:03:38 +08:00
@hantsy 同步方式很好描述的逻辑,异步就未必直观了,比如

for (i=0,n=0; i<10; i++) {
n = test(n, i);
if (n == 0) contine;
if (n == 1) n = test2(n, i);
if (n == 3) break;
n = test3(n, i);
}

每个 test 都是调用的第三方服务,转化成异步写法比较晦涩,这还只是简单的例子,实际 context 上的局部变量有很多个,回调和 promise 写法,需要自己维护这个 context,协程是系统帮你维护。协程只是增加一个选择,并不妨碍适合 rx 的地方继续 rx 。
sagaxu
2020-05-21 12:09:28 +08:00
@tctc4869 自己实现 TCP 服务,不需要考虑“黏包”这种细节,交给 RecordParser 去解析,只要设计协议的时候别搞出 parser 不方便解析的格式。
hantsy
2020-05-21 12:13:16 +08:00
@itwarcraft88 这是我看到最奇葩的技术选型。WebFlux 用的 Reactor (也支持 Rxjava ) API,Jdbc/Mybatis 完全是遗留 老的一套 API (完全 Blocking ),你天天花时间在 Blocking 和 None Blocking 之间转 API ?

如果仅仅是需要异步,不使用 Reactive Streams API,从上到下使用传统的 Java 8 CompletableFuture 就可以了。https://github.com/hantsy/spring-reactive-sample/tree/master/java8/src/main/java/com/example/demo
qinfensky
2020-05-21 12:25:07 +08:00
上 Vert.x
tctc4869
2020-05-21 12:34:40 +08:00
@sagaxu 我才知道有 RecordParser 这个东西,有机会去试试,不过我目前已经自己解决的粘包拆包问题,借助 connectHandler 内定义字段,然后配合自定义数据格式解决粘包拆包问题的。

不过我还有辽宁一个问题,如果要用 vert.x 做 tcp 服务器,要注意什么关键的地方么?比如 NetServer 的配置设置,有哪些关键的地方么?
jin7
2020-05-21 12:53:36 +08:00
都不选 不折腾
hantsy
2020-05-21 13:30:15 +08:00
Vertx 官方有一本系统介绍开发的书,https://vertx.io/docs/guide-for-java-devs/guide-for-java-devs.pdf

Redhat 也出过一个本 Building Reactive Micorservices in Java,介绍 Vertx 为主

https://developers.redhat.com/promotions/building-reactive-microservices-in-java/
itwarcraft88
2020-05-21 13:42:53 +08:00
@hantsy 看我的前提条件,本来就是学习实验性质的,我研究了一段时间的 vertx,最终在新项目上不使用原因也是因为使用 vertx 就要放下历史包袱,这个我们现在是做不到的,包括后台管理系统要使用旧的代码,传统的 mvc 进行开发,为了节省一些代码量,结合实际情况,同时熟悉下新技术(这个项目生命周期最多就是 1-2 年吧,不必长期维护那种)。
itwarcraft88
2020-05-21 13:52:55 +08:00
@hantsy 因为是刚开始尝试,我也知道很奇葩,就是图个学习和乐子,先熟悉一点相关的东西,如果写的难受了,或者项目再催的话,我可能随时再改回 springmvc 了。
hantsy
2020-05-21 14:01:30 +08:00
@itwarcraft88 Spring 5 除了加入 WebFlux ( ReactiveStreams 标准支持),另外也是加入全新的 RouterFunction (区别于已经有的 Controller, 一种全新的开发模型)。不过这个已经 Port 到 Spring WebMvc 中,API 与 Reactive 版本类似,完全是使用传统 API,无 Reactor 那样的流式处理。

https://github.com/hantsy/spring-webmvc-functional-sample
tctc4869
2020-05-21 15:31:09 +08:00
@yizmaoaa

大佬,问一下,vert.x web 演示代码里,有一个 blockingHandler——阻塞处理,使用 vuert.x 的这个阻塞处理+传统的 jdbc 组合在性能上和使用 spring mvc+传统 jdbc 的组合是差不多的么?
yizmaoaa
2020-05-21 15:47:57 +08:00
@tctc4869 阻塞处理的测试结果可以参考 WebFlux 的。应该和 WebFlux+JDBC 在同一水准线上。我估摸着吞吐量也会比传统 SpringMVC+JDBC 高出 1-2 倍。但是我没实际测过
twogoods
2020-05-21 16:36:05 +08:00
最近在适配 webflux,api 熟悉之后这种流式操作还是很爽,不过 debug 、异常处理确实成本上升,而且 java 里没协程,复杂点的逻辑 callback 确实不好处理。之所以适配 webflux 还是看他是 spring 社区的,springboot 项目改造肯定还是 webflux 方便,毕竟全家桶;不过还是要看其他组件如 db 等的 reactive 适配情况了。很早前做过一个类 mybatis 的异步 mysql 访问工具 https://github.com/twogoods/AsyncDao,不过使用的 mysql 异步驱动现在已经不维护了,感觉现在 mysql 的异步驱动真的很少啊,我看 vertx 新出了一个不过是 preview 版本
epson3333
2020-05-21 16:36:52 +08:00
@lhx2008 那同样是异步编程,用 go 就没这种问题吗
chihiro2014
2020-05-21 16:52:38 +08:00
@twogoods webflux 个人感觉还行。Vertx 反倒生态小。出了问题难说。目前 oracle 正在推出官方的 mysql 和 oracle 的 r2dbc 的
lhx2008
2020-05-21 17:03:07 +08:00
@epson3333 go 是同步编程,做到代码阻塞(协程阻塞)操作的时候线程不阻塞,这样就不用开很多线程就可以一直处理,效率类似异步

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/673714

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX