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

标签 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 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 SwarmKubernetes用于高效的集群管理。
Both are available with the latest docker .

例子:

关于go - 在容器中或不在容器中部署具有微服务架构的 Go 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48134800/

相关文章:

xml - 接口(interface)和编码/xml Unmarshal

azure - 如何将 github 中的 airflow dags 存储库与 azure 存储帐户同步?

kubernetes - 查看 Helm 图表的模板文件

java - 这个 'intermediary' 模式的名称是什么?

docker - 使用 docker 运行多个项目,每个项目都使用 docker-compose 运行

java - 两个互相隔离的顶点实例

json - 无法访问以JSON中的POST AJAX方式从服务器发送的数据

ruby - Golang 中 Ruby 的 "methods"方法的等价物是什么?

go - 如何在运行时添加命令,或定义未知命令的行为?

kubernetes - 如何使用Kubectl隐藏列