如何扩展 Spring Boot 应用程序?

Posted

技术标签:

【中文标题】如何扩展 Spring Boot 应用程序?【英文标题】:How can you scale a Spring Boot application? 【发布时间】:2016-12-31 23:37:59 【问题描述】:

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

【问题讨论】:

云docs.pivotal.io/pivotalcf/1-7/customizing/… 这在很大程度上取决于您使用的基础架构。我所说的基础设施是指负载均衡器、服务发现等。客户端必须以某种方式知道另一个节点将在哪里以及如何访问它。如果您简要概述了您计划如何部署应用程序,那么我们可能会详细说明。 我想为初学者保持简单。私有 Linux 服务器上的 spring-boot MVC Web 应用程序。该应用程序将是数据库密集型 (mysql)。当我更多地考虑它时,可能应该通过添加数据库并将它们集群来扩展数据库。要处理更多 web 请求,请运行第二个 spring-boot MVC 实例并在两者之间进行负载平衡。我不知道负载平衡会如何进行。也许是 Linux 操作系统中的一个组件,或者 Spring 有一个根节点/主节点? 【参考方案1】:

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

对于负载平衡,您可以选择 nginx 之类的东西,也可以将其留给 Spring Cloud,后者还具有许多其他方便的扩展/集群功能。 扩展应该不是很难,因为 Spring Boot 在它自己的服务器上运行。

一些有助于扩展/集群的工具:

Spring Boot 应用:

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

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

基础设施和容器:

Docker 在这里可以轻松启动您的应用程序及其副本(如果需要)。如果您可以更进一步地使用资源并使用 Kubernetes,但这一切都取决于用例。

各种服务器(节点),以防其中一个发生故障并轻松分配负载。

如果您还没有使用 Spring Cloud 做任何事情,那么用于负载平衡的 Ngnix 非常简单。

数据库:

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

日志记录:

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

此外,还有很多资源 here 谈论了很多关于架构的一般性以及在尝试运行分布式服务时如何改变思维方式的必要性。

希望这会有所帮助。

2021 年 2 月 23 日更新

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

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

在大规模管理 Spring Boot 服务时要提到的重要一点可能是配置管理。您可以开箱即用的一个非常有用的解决方案是Consul。这将使您能够热重载配置,当您有 50 个服务需要重新启动以更改一个布尔变量时,这一点很重要。根据您的应用程序有多大,启动成本可能会很高,无论是时间还是 CPU/内存资源

【讨论】:

选择数据库也取决于自己的需要,也没有你提到的灵丹妙药。

以上是关于如何扩展 Spring Boot 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot - 如何在 rest 应用程序中验证 Multipartfile

Angular 和 Spring Boot:使它们有效协同工作的配置

如何利用Spring Boot框架开发一个全球化的应用程序

有没有办法在 Spring Boot 应用程序配置中使用 Spring Cloud cipher?

java spring boot在启动之前从db中获取值

当我将 Spring Boot 应用程序部署到 AWS Elastic Beanstalk 并且无法从本地 Spring Boot 连接到 RDS 时出现 502 错误网关