当前位置: 首页 > 知识库问答 >
问题:

Spring MVC到Spring Webflux迁移-块与订阅

梁马鲁
2023-03-14

让我们设想一个场景,其中有一个使用Servlet堆栈编写的旧应用程序,您决定将其迁移到Spring Webflux。我们还可以说,要迁移的第一件事是将RestTemplate迁移到WebClient。

什么是处理WebClient返回MonoFlux的首选方式?调用block似乎是可以的解决方案,因为应用程序使用RestTemboard无论如何都会阻塞。订阅应该更好一点,因为它有回调,但也许您必须等待才能继续。此外,使用订阅,我们是否需要处理Disposable,如果是,如何处理,因为我不确定在哪里是调用dispose的最佳位置?

还有一个关于JDBC的问题。使用Schedulers.boundedElastic()有多危险?根据我的理解,拥有一个单独的线程池应该会有所帮助,尤其是在使用Netty的情况下。这并不理想,但在R2DBC驱动程序达到1.0.0之前,这可能是一个临时解决方案吗?如果应用程序使用Tomcat怎么办?因为Tomcat默认有更多线程,情况会更好吗?

共有1个答案

龚征
2023-03-14

处理WebClient返回的Mono或Flux的首选方式是什么?

鉴于您的目标是使用Webflow,最终首选的方法是在您的反应链的整个过程中与这些发布者打交道。这意味着您最终不会直接调用订阅任何内容,因为您的控制器本身将返回一个Mono(并且所有内容,包括WebClient调用,都将通过链中的一系列反应操作合并到该Mono中。)

然而,正如您所指出的,您不可能同时迁移所有内容。

如果现在只迁移网络客户端,那么只需调用block(),以与RestController相同的方式处理它。调用subscribe()然后等待订阅完成没有任何好处,这只是一种不太明显、更冗长的阻塞方式。

一旦您将越来越多的堆栈迁移到反应式,您就可以以反应式的方式执行越来越多的操作,然后开始“移动”您的块()调用,从而使调用链进一步向上移动(直到块处于控制器级别,然后您可以切换到返回单声道)

此外,使用subscribe,我们是否需要处理一次性

仅当您需要潜在地取消订阅服务器(并且它支持它)时这在我的经验中是很罕见的。

还有一个关于JDBC的问题。使用调度程序有多危险。boundedElastic()?

boundedElastic()被设计成一个用于阻塞IO的包装器,因此在Reactor侧使用它本身并没有什么问题。唯一的“危险”是JDBC/应用程序端是否符合您的要求:

  • 它的上限是CPU内核数量的10倍
  • 排队任务的数量上限为100K

如果您有足够长时间运行的DB查询,这还不够,那么您可以考虑使用newBoundedElastic(),并手动指定threadCap和queuedTaskCap。

如果应用程序使用Tomcat呢?由于Tomcat默认有更多的线程,情况会更好吗?

我不建议依赖它。Tomcat仍然每个请求使用一个线程(即使使用Webflux),因此存在的危险是,您最终会阻塞一个不应该阻塞的线程,并且最终没有意识到并依赖于该行为(当您切换到Netty时,这一切都会崩溃)

 类似资料:
  • Angular 是使用 TypeScript 构建的,并且支持向 Angular 提供元信息的装饰器。 TypeScript 的装饰器会让语法感觉更加“自然”,尽管有可能使用 Angular 没有的功能。

  • 问题内容: 我目前正在使用Dep,并且想开始使用Go模块。 我该如何迁移? 问题答案: 从Dep迁移到Go Modules非常容易。 运行并确保您使用的是Go 1.11版或更高版本。 将代码移到GOPATH或set之外。 :这将从Gopkg.lock导入依赖项。 :这将删除不必要的导入,并添加间接导入。 (可选)删除您的供应商文件夹(或移至回收站) :进行测试构建以查看其是否有效。 :删除用于De

  • Redux 不是一个单一的框架,而是一系列的约定和一些让他们协同工作的函数。你的 Redux 项目的主体代码甚至不需要使用 Redux 的 API,大部分时间你其实是在编写函数。 这让到 Redux 的双向迁移都非常的容易。 我们可不想把你限制得死死的! 从 Flux 项目迁移 Reducer 抓住了 Flux Store 的本质,因此,将一个 Flux 项目逐步到 Redux 是可行的,无论你使

  • 我正试图迁移到AndroidX,我们在我们的项目中使用这个库。然而,这目前在我们的项目中引起了一个问题: 无法解析对“module @ build type/compile class path”的依赖项:无法使用转换JetifyTransform转换文件“localytics-1.3.0.aar”以匹配属性{artifactType=processed-aar} 删除库会使此问题消失。在这个库被

  • 如果你现在有一个正在使用其他 VCS 的代码库,但是你已经决定开始使用 Git,必须通过某种方式将你的项目迁移至 Git。 这一部分会介绍一些通用系统的导入器,然后演示如何开发你自己定制的导入器。 你将会学习如何从几个大型专业应用的 SCM 系统中导入数据,不仅因为它们是大多数想要转换的用户正在使用的系统,也因为获取针对它们的高质量工具很容易。 Subversion 如果你阅读过前面关于 git

  • 对于 iOS 自动化,Appium 依赖苹果提供的系统框架。对于 iOS 9.2 及更低版本,苹果唯一的自动化技术被称为UIAutomation,它运行在 “Instruments” 中。从 iOS 10 开始,苹果已经完全删除了 UIAutomation 工具,因此 Appium 不可能按照以前的方式进行测试。同时,苹果推出了一款名为 XCUITest 的新型自动化技术,从 iOS 9.3 到