spring-boot - 为 Spring Boot Docker 容器添加负载平衡的选项是什么
问题描述
我有一个弹簧靴和角度的项目。该项目也是dockerzied。
现在我想为我的后端添加负载平衡,那么我有什么选择。我应该使用 Zuul Proxy 和 Eureka、docker swarm 还是 k8s 还是其他什么?
根据我对 docker swarm 和 k8s 的了解,它们可以运行任意数量的容器,但是没有像 API-gateway(入口点)这样的东西来路由传入的请求并在特定微的不同容器之间分配负载-服务。也许我错了。
提前致谢。
解决方案
简答
- 使用 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 还提供扩展、部署、资源管理等。
概括
一个不能相互替代,您应该注意某些功能重叠。所以你应该根据这个事实来设计你的基础设施。
推荐阅读
- python-3.x - Query Oracle database from Cloud Foundry using Python
- r - Pivot_longer 6 列到 3 列
- c++ - 尝试在 C++ 中将节点添加到链接列表的末尾时出现分段错误(核心转储)错误
- python - 编写循环:Beautifulsoup 和 lxml 用于在逐页跳过设置中获取页面内容
- c++ - 将指针传递给 std::thread 时的数据竞争
- r - R 组成 n 个子群的群(超群)
- google-api - 来自 html 的谷歌文档 - 不一致地包括图像
- c++ - 使用 qt-faststart 和“ffmpeg -movflags +faststart”的不同结果
- wpf - 对 WPF 和 Winform 中“Screen.Bounds”的返回感到困惑
- embedded-linux - Beaglebone dcan0 和 dcan1