首页 > 解决方案 > 为 Spring Boot Docker 容器添加负载平衡的选项是什么

问题描述

我有一个弹簧靴和角度的项目。该项目也是dockerzied。

现在我想为我的后端添加负载平衡,那么我有什么选择。我应该使用 Zuul Proxy 和 Eureka、docker swarm 还是 k8s 还是其他什么?

根据我对 docker swarm 和 k8s 的了解,它们可以运行任意数量的容器,但是没有像 API-gateway(入口点)这样的东西来路由传入的请求并在特定微的不同容器之间分配负载-服务。也许我错了。

提前致谢。

标签: spring-bootdockerload-balancingentry-point

解决方案


简答

  • 使用 Zuul 作为你的 API 网关
  • 使用 Eureka 作为服务发现并在 Zuul 中启用它。所以现在Zuul可以获取注册到Eureka的其他服务信息
  • 在 Zuul 中启用 Ribbon 负载平衡。通常 Ribbon 会进行客户端负载平衡,但由于客户端/服务器术语是可互换的,因此当您从 Angular 向后端发出请求时,Zuul 就是您的服务器,因此 Zuul 将成为您的反向代理。

使用 k8s 或 docker swarm(甚至不使用)取决于您的应用程序在生产中的运行方式以及您如何维护它们。此外,这些编排已经可以提供 Spring Cloud 应用程序堆栈中的一些功能。例如; 如果您设置了 k8s 环境,您将进行如下配置;

kind: Service
apiVersion: v1
metadata:
  name: foo
spec:
  selector:
    app: spring-foo-service
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 9102

您的服务调用/foo,Kubernetes 将其与其选择器匹配并重定向到标有spring-foo-service 的请求 pod 。因此,对于您的服务到服务通信,负载均衡器已经由 Kubernetes 完成。您仍然可以拥有客户端负载平衡,Ribbon随 Kubernetes 一起提供。Ingress、nginx 配置、外部/内部负载平衡还有更多内容,但这个主题对您的问题来说非常重要,您可以根据您的基础设施进行更多搜索。

长答案

您的问题中有很多概念交织在一起,可能会导致混淆。我们首先应该通过不同的基于微服务的架构将它们划分为主题;在启动之前,spring cloud 并不是 Kubernetes 或 Docker Swarm 的直接竞争对手,仍然很高兴看到它们分别提供的一些解决方案重叠。

春云

  • API 网关 - Zuul。它还可以启用负载平衡功能,但在幕后它使用功能区。
  • 服务发现 - 尤里卡。您的服务可以注册到 Eureka,也可以从 eureka 获取其他服务信息(取决于您如何使用 Eureka 配置服务)
  • 客户端负载均衡器 - 功能区

此结构中还有其他元素,例如;配置管理、身份验证、日志记录、监控,我不会详细介绍,因为您的问题是关于负载平衡的。但不要忘记,这些是在您的微服务堆栈中作为单独的 Java应用程序提供的。

但除了上述服务之外,我们的结构中仍然缺少 Spring Cloud 未提供的元素。让我们问一些问题;

  • 如何在高流量下扩展我的服务?
  • 如果出现故障,如何提供我的服务的自我恢复?
  • 如何提供高可用性?等等。当您意识到我们的问题主要是关于编排的。

到目前为止,我们在 Spring Cloud 中描述的服务使我们能够开发微服务。但是由于我们使用的是微服务,我们可能会有很高的需求,这意味着我们也需要操作编排/自动化。但是为了清楚起见,让我们通过将其与上面的 Spring Cloud 解决方案结合起来,将其划分为不同的主题;人工维护和自动化

运行您的服务 - 手册

想象一下,我们使用 Zuul、Eureka、Ribbon 等开发我们的结构。现在我们需要部署我们的服务,您可以使用 docker 启动您的服务,也可以使用 docker-compose 组合多个服务(但不会自动扩展,这在此步骤中不可用)。所以一切都准备好了,我们有一些服务;

  • 注册到尤里卡
  • 从 eureka 获取其他服务信息
  • 进行客户端负载平衡(因为每个客户端现在都从 eureka 获得其他服务位置,这是服务器端/中央负载平衡器的有效方式)
  • 等等。

但是在高流量下,我们需要启动另一个。到目前为止,这在 Spring Cloud 中的应用程序堆栈中不可用,但您也可以在此步骤中以不同的方式实现它。您甚至可以使用 docker-compose 命令进行扩展。现在让我们快速概述一下编排解决方案;Kubernetes、docker swarm 等。

运行您的服务 - 容器编排

Kubernetes 和 Docker swarm 都为您的容器提供编排。此外,它们为微服务需求提供了编程语言之上的抽象。

Kubernetes

正如简短回答中已经提到的,Kubernetes 已经涵盖了一些开箱即用的 Spring Cloud Application 功能。例如; 您不再需要将服务注册表作为结构中的应用程序。除了代替您的应用程序堆栈提供的这些服务之外,Kubernetes 还提供扩展、部署、资源管理等。

概括

一个不能相互替代,您应该注意某些功能重叠。所以你应该根据这个事实来设计你的基础设施。


推荐阅读