我是 DevOps 的新手,特别是使用 golang 和微服务架构。
我想知道 go 应用程序是否应该部署在容器 (Docker) 中。在这种情况下,我有一个使用微服务架构构建的系统。例如,我有 2 个 Web 服务,A 和 B。我还有另一个 Web 服务器充当这两个服务前面的网关。
A 和 B 都需要访问数据库,例如 MySQL。 A处理A表,B处理B表。
我知道在 Go 中,源代码被编译成一个可执行的二进制文件。因为我这里有 3 个服务,所以我有 3 个二进制文件。这三个都作为公开 JSON REST API 的 Web 服务器运行。
我的问题是:
我可以将这些服务器一起部署在一台主机上,该主机在不同端口上运行吗? 例如,如果我的主机获得 IP x.x.x.x,我的网关可以在 x.x.x.x:80 中运行,A 在端口 81 中运行,B 在端口 82 中运行。 A 和 B 将与外部或同一主机内部某处的 MySQL 服务器通信。这是一个好习惯吗?持续部署能否适用于这种做法?
为什么我应该在 Docker 等容器中部署和运行这些二进制文件? 我知道自几年前发布以来,Docker 已经找到了轻松集成到开发工作流程中的方法。但是当然,使用 Docker 并不像将代码编译成二进制文件然后将其移动到部署服务器那么简单。使用 Docker,我们必须将可执行文件放入容器中,然后将容器也移动到部署服务器。
如果不使用 Docker,可扩展性和高可用性如何? 我可以只复制我的服务并使用负载均衡器在不同的主机上同时运行它们吗?这样我应该在一台主机上部署 A、B 和网关,在另一台主机上部署另一个 A、B 和网关,然后在它们前面设置负载均衡器。 A、B、网关分别运行在80、81、82端口。通过这种方式,我可以以 VM 或 LXD 容器的形式拥有数千个节点,分布在数百个裸机上,使用简单的 bash 脚本和 ssh 进行部署,如果事情变得复杂,则使用 Ansible 进行部署。是还是不是?
使用 Docker 的可扩展性和可用性如何? 我是否应该将所有服务放在容器中并使用 Kubernetes 之类的东西来管理它们以实现高可用性?这样做确实会增加开销,对吗?因为如果团队还不知道 Kubernetes 等新技术,他们将不得不学习它。
您能否举例说明部署 golang 服务的一些最佳实践?
最佳答案
I'm wondering if go applications should or should not be deployed in containers (Docker)
Why should I deploy and run those binaries inside containers like Docker?
当然,如果您将构建与实际的最终图像分开(以便不包含在所说的最终图像构建依赖项中)
请参阅 Golang, Docker and multistage build 中的“Matteo Madeddu” .
Can I deploy these servers together in one host running on different ports?
实际上,它们都可以在自己的容器中运行在自己的端口上,即使那个端口是相同的。
使用 EXPOSEd port 容器内通信将起作用强>。
但是,如果从外部访问它们,那么它们的 published port确实需要有所不同。
What about scalibility and high availability without using Docker?
And what about the scalability and availability of using Docker?
一旦您谈论动态状态,就会涉及某种编排:参见 Docker Swarm或 Kubernetes用于高效的集群管理。
Both are available with the latest docker .
例子:
- "Building and testing Go apps + monorepo + speed ":或者,我们如何使用 TravisCI 在 monorepo 中测试和构建 go 代码,并快速轻松地部署到 Docker。来自 Jonathan Harlap ,首席工程师@Wattpad
- "Introducing Functions as a Service (OpenFaaS) ",来自 Alex Ellis
关于go - 在容器中或不在容器中部署具有微服务架构的 Go 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48134800/