如何扩展Spring Boot应用程序?

28

我知道 Spring Boot 自带 Tomcat 服务器(或 Jetty),这有助于快速开发。但是当流量增加时,您该如何扩展应用程序?

提示:Spring Boot 可以轻松地集成其他的 Servlet 容器,例如 Apache Tomcat、Jetty 或者 Undertow。因此,当您需要处理更多的流量时,您可以选择使用更强大的 Servlet 容器来提高性能和可伸缩性。


云计算 http://docs.pivotal.io/pivotalcf/1-7/customizing/autoscale-configuration.html - AchillesVan
这在很大程度上取决于您使用的基础设施。所谓基础设施,例如负载均衡器、服务发现等。客户端必须以某种方式知道另一个节点将在哪里以及如何访问它。如果您简要概述一下您计划如何部署应用程序,那么我们可以详细说明。 - bart.s
我打算一开始保持简单。在私人拥有的Linux服务器上搭建一个Spring Boot MVC Web应用程序。该应用程序将具有较强的数据库处理能力(MySQL)。随着我的进一步考虑,该数据库可能需要通过添加其他数据库来进行扩展,并对它们进行集群。为了处理更多的Web请求,运行第二个Spring Boot MVC实例并在两者之间进行负载平衡。我不知道如何进行负载平衡。也许可以使用Linux操作系统中的组件,或者Spring有一个根节点/主节点? - progonkpa
1个回答

34

正如评论中指出的那样,这并没有一种万能方法,这取决于您的基础设施,并有几个工具可帮助您,您只需要选择最适合您的。

对于负载平衡,您可以选择像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。

    此外,这里有很多资源,其中讨论了架构以及在尝试运行分布式服务时改变思维方式的必要性。

    希望这可以帮助您。

    更新于2021-02-23

    • 如今,当我们谈论扩展性时,Kubernetes 已经成为了事实上的标准,并且受欢迎的原因在于其丰富的功能集,您将能够利用这些功能,专注于业务领域逻辑并删除一些像 Spring Cloud 这样的服务发现工具。如果您可以使用像 EKS 和 GKE 这样的公共云,那么最好不要自己管理集群。

      它提供自动缩放和内置的健康检查。从 Spring Boot 2.4 开始,您可以获得许多在 K8s 上运行 Spring Boot 的附加优点,例如专用的 liveness 和 readiness 探针,优雅关机等。

    • 在数据库方面,建议选择类似 AWS Aurora 等易于管理和可扩展的解决方案。

    • 管理规模化的 Spring Boot 服务时需要注意的一个重要问题可能是配置管理。一个非常有用的开箱即用的解决方案是 Consul。这将使您能够热加载配置,在您需要重新启动 50 个服务仅更改一个布尔变量时非常重要。根据应用程序的大小,启动可能会耗费很多时间以及 CPU/内存资源。


    1
    选择数据库也取决于个人需求,就像你所提到的那样,并没有一种万能的解决方案。 - Mebin
    只想提一下,如果使用类似于Schedlock的工具,预定的作业就不需要成为问题。此外,如果正在使用Flyway或Liquibase等迁移脚本,则也需要某种形式的锁定。 - D.Tomov

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接