在容器中或不在容器中部署具有微服务架构的Go应用程序?

gre*_*112 4 go kubernetes microservices devops docker-container

我是 DevOps 的新手,特别是使用 golang 和微服务架构。

我想知道 go 应用程序是否应该部署在容器(Docker)中。在这个例子中,我有一个用微服务架构构建的系统。例如,我有 2 个 Web 服务,A 和 B。此外,我还有另一个 Web 服务器,充当这两个服务前面的网关。

A 和 B 都需要访问数据库,例如 MySQL。A 处理 A 表,B 处理 B 表。

我知道在 Go 中,源代码被编译成单个可执行二进制文件。因为我这里有 3 个服务,所以我有 3 个二进制文件。所有三个都作为公开 JSON REST API 的 Web 服务器运行。

我的问题是:

  • 我可以将这些服务器一起部署在一台运行不同端口的主机上吗? 例如,如果我的主机获得 IP xxxx,则我的网关可以在 xxxx:80 中运行,A 在端口 81 中运行,B 在端口 82 中运行。A 和 B 将与同一主机外部或内部的 MySQL 服务器通信。这是一个好的做法吗?持续部署可以用于这种实践吗?

  • 为什么我应该在 Docker 等容器内部署和运行这些二进制文件? 我知道自从几年前发布以来,Docker 已经找到了轻松集成到开发工作流程中的方法。当然,使用 Docker 并不只是将代码编译成二进制文件然后将其移动到部署服务器那么简单。使用 Docker,我们必须将可执行文件放入容器中,然后将容器也移动到部署服务器。

  • 如果不使用 Docker,可扩展性和高可用性怎么样? 我可以复制我的服务并使用负载均衡器在不同的主机上同时运行它们吗?这样我应该在一台主机上部署A、B和网关,在另一台主机上部署另一个A、B和网关,然后在它们前面设置负载均衡器。A、B 和网关分别运行在 80、81、82 端口。这样,我就可以拥有数千个以虚拟机或 LXD 容器形式存在的节点,分布在数百个裸机上,使用简单的 bash 脚本和 ssh 进行部署,如果情况变得复杂,则可以使用 Ansible 进行部署。是还是不是?

  • 那么使用 Docker 的可扩展性和可用性又如何呢? 我是否应该将所有服务放入容器中并使用 Kubernetes 之类的工具来管理它们以实现高可用性?这样做确实会增加开销,对吗?因为如果团队还不了解 Kubernetes,他们就必须学习新技术。

  • 您能给我举一个部署 golang 服务的最佳实践示例吗?

Von*_*onC 5

我想知道 go 应用程序是否应该部署在容器(Docker)中
为什么我应该在 Docker 这样的容器中部署和运行这些二进制文件?

当然,前提是您将构建与实际的最终映像分开(以便不包含在所述最终映像构建依赖项中)请参阅Matteo Madeddu
的 “ Golang、Docker 和多阶段构建” 。

我可以将这些服务器一起部署在一台运行不同端口的主机上吗?

实际上,它们都可以在自己的容器中在自己的端口上运行,即使该端口是相同的。
容器内通信将使用EXPOSEd 端口进行工作。但是,如果从外部访问它们,那么它们的发布端口确实需要不同。

如果不使用 Docker,可扩展性和高可用性怎么样?
那么使用 Docker 的可扩展性和可用性又如何呢?

一旦谈到动态状态,就会涉及某种编排:请参阅Docker SwarmKubernetes以实现高效的集群管理。
两者都可以通过最新的 docker 获得

例子: