Spring boot 使用Spring实现异步API的线程模型

Spring boot 使用Spring实现异步API的线程模型,spring-boot,Spring Boot,我正在使用Spring Boot开发微服务。我已经实现了以下层: 控制器层:当用户发送API请求时调用 服务层:处理请求。要么向第三方服务发送请求,要么向数据库发送请求 存储库层:用于与 数据库 上述所有层中的方法都返回CompletableFuture。我有以下与此设置相关的问题: 从所有层的所有方法返回可完成的未来是否是一种良好的实践 在使用CompletableFuture时是否始终建议使用@Async注释?当我使用默认的fork-join池来处理请求时会发生什么 如何为上述方法

我正在使用Spring Boot开发微服务。我已经实现了以下层:

  • 控制器层:当用户发送API请求时调用
  • 服务层:处理请求。要么向第三方服务发送请求,要么向数据库发送请求
  • 存储库层:用于与 数据库

上述所有层中的方法都返回CompletableFuture。我有以下与此设置相关的问题:

  • 从所有层的所有方法返回可完成的未来是否是一种良好的实践

  • 在使用CompletableFuture时是否始终建议使用@Async注释?当我使用默认的fork-join池来处理请求时会发生什么

  • 如何为上述方法配置线程?每层配置线程池是一个好主意吗?我可以在这里考虑什么其他的配置?

  • 在优化此微服务的性能时,我应该关注哪些指标


  • 如果应用程序正在做的工作可以在请求线程上完成,而不会有太多延迟,我建议您这样做。如果您发现您的web服务器的工作线程不足,则始终可以移动到异步模型

    @Async注释基本上有助于调度。如果可以的话,可以使用它——它可以使代码不受对线程池的引用的影响,而线程池将调度工作。至于哪个线程实际执行异步工作,这完全取决于您。如果可以,使用自己的游泳池。这将确保您可以添加检测并公开服务运行后可能需要的配置选项

    从技术上讲,你将有两个池。一个是Spring用来消耗您未来的结果的,另一个是您用来做异步工作的。如果我没记错的话,Spring Boot将在您还没有池的情况下配置它的池,如果您没有显式配置池,它将记录一条警告。对于工作线程,从简单开始。考虑使用Spring的代码> TycPoPoLtaskExcor or <代码> ./P> 关于要监控哪些指标,首先从选择监控方式开始。使用类似于Spring Sleuth的东西,再加上弹簧执行器,将为您提供大量开箱即用的信息。有很多服务可以将执行器生成的所有度量收集到基于时间的数据库中,然后您可以使用这些数据库分析性能,并了解需要调整的内容


    最后一个建议是Spring的Web流量从一开始就被设计为异步的。它肯定有一个学习曲线,因为反应式代码与通常的MVC非常不同。但是,该框架还考虑了您提出的所有问题,因此它可能更适合您的应用程序,特别是如果您希望在默认情况下使所有内容都异步。

    你好,Nick,非常感谢您分享您的想法。