我知道 Spring Boot 自带 Tomcat 服务器(或 Jetty),这有助于快速开发。但是当流量增加时,您该如何扩展应用程序?
提示:Spring Boot 可以轻松地集成其他的 Servlet 容器,例如 Apache Tomcat、Jetty 或者 Undertow。因此,当您需要处理更多的流量时,您可以选择使用更强大的 Servlet 容器来提高性能和可伸缩性。
我知道 Spring Boot 自带 Tomcat 服务器(或 Jetty),这有助于快速开发。但是当流量增加时,您该如何扩展应用程序?
提示:Spring Boot 可以轻松地集成其他的 Servlet 容器,例如 Apache Tomcat、Jetty 或者 Undertow。因此,当您需要处理更多的流量时,您可以选择使用更强大的 Servlet 容器来提高性能和可伸缩性。
正如评论中指出的那样,这并没有一种万能方法,这取决于您的基础设施,并有几个工具可帮助您,您只需要选择最适合您的。
对于负载平衡,您可以选择像Nginx这样的东西,或者将其留给Spring Cloud,后者还具有许多其他方便的扩展/集群功能。
因为spring boot在自己的服务器上运行,所以扩展不应该很难。
一些帮助扩展/集群的工具:
Spring boot 应用:
如果要扩展,您的应用程序必须近乎无状态(例如:您不能有定期任务之类的内容,因为当您扩展到x个实例时,它们会被执行x次)。
您可以使用spring cloud项目获取额外添加的功能,例如服务发现和其他使扩展变得更容易的好处(例如:当您启动新实例时,它可以轻松地从配置服务器获取配置,在服务之间轻松负载平衡,具有类似于群集的行为等等...)。
基础设施和容器:
在这里,Docker是一个再明显不过的选择,可以轻松地启动您的应用程序及其副本(如果需要)。如果您可以进一步使用资源并采用Kubernetes,但这完全取决于使用情况。
为了防止单点故障和方便负载分配,使用多个服务器(节点)。
如果你还没有使用spring cloud,那么使用Ngnix进行负载均衡非常简单。
数据库:
日志记录:
此外,这里有很多资源,其中讨论了架构以及在尝试运行分布式服务时改变思维方式的必要性。
希望这可以帮助您。
如今,当我们谈论扩展性时,Kubernetes 已经成为了事实上的标准,并且受欢迎的原因在于其丰富的功能集,您将能够利用这些功能,专注于业务领域逻辑并删除一些像 Spring Cloud 这样的服务发现工具。如果您可以使用像 EKS 和 GKE 这样的公共云,那么最好不要自己管理集群。
它提供自动缩放和内置的健康检查。从 Spring Boot 2.4 开始,您可以获得许多在 K8s 上运行 Spring Boot 的附加优点,例如专用的 liveness 和 readiness 探针,优雅关机等。
在数据库方面,建议选择类似 AWS Aurora 等易于管理和可扩展的解决方案。
管理规模化的 Spring Boot 服务时需要注意的一个重要问题可能是配置管理。一个非常有用的开箱即用的解决方案是 Consul。这将使您能够热加载配置,在您需要重新启动 50 个服务仅更改一个布尔变量时非常重要。根据应用程序的大小,启动可能会耗费很多时间以及 CPU/内存资源。