我为 spring 引导 docker 容器添加负载平衡的选项是什么

What are my options for adding load balancing for spring boot docker container

我在 spring 引导和 angular 中有一个项目。该项目也 dockerzied。

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

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

提前致谢。

简答

  • 使用 Zuul 作为你的 API 网关
  • 使用 Eureka 作为服务发现并在 Zuul 中启用它。所以现在Zuul可以获取注册到Eureka
  • 的其他服务信息
  • 在 Zuul 中启用 Ribbon 负载平衡。通常 Ribbon 使 client-side 负载平衡,但由于 client/server 术语可以互换,当你从 Angular 向后端发出请求时,Zuul 在你的情况下是你的服务器,所以 Zuul 将是你的反向代理。

使用 k8s 或 docker swarm(甚至 none)取决于您的应用程序 运行 在生产中的方式以及您如何维护它们。此外,这些编排已经可以提供您在 Spring 云应用程序堆栈中拥有的一些功能。例如;如果你设置了 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[的请求 pods。因此,对于服务到服务的通信负载均衡器,Kubernetes 已经完成了。您仍然可以 client-side 负载平衡,Ribbon Kubernetes 附带。 Ingress、nginx 配置、external/internal 负载平衡还有更多内容,但这个主题对于您的问题来说很大,您可以根据您的基础设施搜索更多内容。

长答案

您的问题中有很多概念交织在一起,可能会导致混淆。我们应该首先将它们按不同的 microservice-based 体系结构划分为主题;在 start-up、spring 云不是 Kubernetes 或 Docker Swarm 的直接竞争对手之前,仍然很高兴看到它们分开,它们各自提供的一些解决方案重叠。

Spring云

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

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

中提供的

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

  • 如何在高流量下扩展我的服务?
  • 如何在失败的情况下提供self-recovery我的服务?
  • 如何提供高可用性? 等等。当你意识到我们的问题主要是关于 orchestration.

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

运行 您的服务 - 手册

假设我们使用 Zuul、Eureka、Ribbon 等开发我们的结构。现在我们需要部署我们的服务,你可以用 docker 启动你的服务,或者你也可以用 docker-compose 组合多个服务(但不会自动扩展,这在这一步不可用) .所以一切准备就绪,我们有一些服务;

  • 注册尤里卡
  • 从eureka获取其他服务信息
  • 实现client-side负载平衡(因为每个客户端现在都从 eureka 获取其他服务位置,这是 server-side/central 负载平衡器的有效方式)
  • 等等。

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

运行 您的服务 - 容器编排

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

Kubernetes

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

总结

一个不能替代另一个,您应该知道一些功能重叠。所以你应该设计你的红外线基于这个事实的结构。

你可以使用docker swarm ,其中集群中的主节点可以充当负载均衡器