如何扩展 Spring Boot 应用程序?

How can you scale a Spring Boot application?

我了解到 Spring Boot 有一个内置的 Tomcat 服务器(或 Jetty),这有助于快速开发。但是,当由于流量增加而需要扩展应用程序时,您会怎么做?

正如评论中所指出的,这里没有灵丹妙药,这取决于您的基础架构,并且有多种工具可以帮助您,您只需要选择最适合您的即可。

对于负载平衡,您可以选择 Nginx 之类的东西,也可以将其留给 spring 云,后者还有许多其他方便的功能 scaling/clustering。 缩放应该不会很难,因为 spring 在它自己的服务器上启动 运行。

一些有助于 scaling/clustering 的工具:

Spring 启动应用程序:

  • 如果您要扩展,您的应用必须 近乎无状态(例如:您不能有计划任务或类似的东西,因为当你扩展到 x 个实例,它们被执行 x 次)。

  • 您可以使用 spring cloud 项目来获得额外的附加功能,例如服务发现和其他使扩展更容易的好东西(例如:当您启动一个新实例时,它可以获得配置轻松地从配置服务器,'register' 减轻服务之间的负载平衡,具有类似集群的行为,等等...)。

基础架构和容器:

    如果需要,
  • Docker 在这里可以轻松启动您的应用程序及其副本。如果您可以进一步利用资源并使用 Kubernetes,但这完全取决于用例。

  • 各种服务器(节点),以防其中一台出现故障并轻松分配负载。

  • 如果您还没有用 spring 云完成某些事情,那么用于负载平衡的 Ngnix 非常简单。

数据库:

  • 您真的不想在这里使用 MySQL,因为它无法像您的 spring 应用程序那样很好地扩展。您可以选择 Cassandra 或 Redis 之类的东西,但这意味着要重构您的数据模型。也许从 MySQL 到可以扩展的 NoSQL 的痛苦最小的过渡是 MongoDB(恕我直言:Cassandra 表现更好)。

记录:

  • 这可能是一场噩梦,但 spring 也有解决方案。查看 zipkin 和 spring 侦探。

另外,有很多资源 here 大谈架构,以及在尝试 运行 分布式服务时如何有必要改变思维方式。

希望对您有所帮助。

2021-02-23更新

  • 今天,当我们谈论扩展时,Kubernetes 几乎是一个事实上的标准,并且是首选,因为您将能够利用丰富的功能集并将您的应用程序完全专注于业务域逻辑,并且可以删除诸如 spring 云之类的内容以进行服务发现。如果你可以使用像 EKS 和 GKE 这样的 public 云,你最好不必自己管理集群。 它提供自动缩放和内置健康检查。从 Spring Boot 2.4 开始,运行ning Spring 在 K8s 上启动有许多额外的好处,例如用于活动和就绪探测的专用健康检查端点、正常关机等....

  • 在数据库方面,目标是易于管理和扩展的东西,例如 AWS Aurora 或类似的东西。

  • 在大规模管理 spring 引导服务时要提到的一件重要事情可能是配置管理。开箱即用的一个非常有用的解决方案是 Consul。这将使您能够热重新加载配置,当您有 50 个服务需要重新启动时,这一点很重要,只需更改一个布尔变量。根据您的应用程序有多大,启动可能会很昂贵,包括时间和 CPU/memory 资源