我为Spring Boot Docker容器添加负载平衡的选项是什么 Spring Cloud Kubernetes

问题描述

我有一个关于弹簧靴和尖头的项目。该项目也被dockerzied。

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

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

谢谢。

解决方法

简短答案

  • 使用Zuul作为您的API网关
  • 使用Eureka作为服务发现并在Zuul中启用它。因此,现在Zuul可以获取已注册到Eureka的其他服务信息
  • 在Zuul中启用功能区负载平衡。通常,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的直接竞争对手,仍然可以很好地看到它们彼此分离提供的一些解决方案。

Spring Cloud

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

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

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

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

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

运行服务-手册

想象一下,我们使用Zuul,Eureka,Ribbon等开发结构。现在我们需要部署服务,您可以使用docker启动服务,或者也可以将其中的多个服务与docker-compose结合使用(但不能自动扩展,此步骤不可用)。一切准备就绪,我们有一些服务;

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

但是在人流量大的情况下,我们需要启动另一个。到目前为止,我们的应用程序堆栈在Spring Cloud中尚不提供此功能,但您也可以在此步骤中以不同的方式实现它。您甚至可以使用docker-compose命令扩大规模。现在,让我们快速概述业务流程解决方案; Kubernetes,泊坞窗群等。

运行服务-容器编排

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

Kubernetes

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

摘要

一个不是彼此替代的,您应该知道某些功能重叠。因此,您应该基于这一事实来设计基础架构。

,

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...