当前位置: 首页 > 知识库问答 >
问题:

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

曹茂材
2023-03-14

我是专门使用golang和微服务架构的DevOps新手。

我想知道go应用程序是否应该部署在容器中(Docker)。在这种情况下,我有一个用微服务架构构建的系统。例如,这里有两个web服务,A和B。另外,我还有另一个web服务器作为这两个服务前面的网关。

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

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

我的问题是:

>

  • 我可以将这些服务器部署在一台运行在不同端口上的主机上吗?例如,如果我的主机获得IP x.x.x.x,我的网关可以在x.x.x:80中运行,在端口81中运行A,在端口82中运行B。A和B将与MySQL服务器在外部某处通信,也可能在同一主机内。这是一种好的做法吗?连续部署是否可以与此实践配合使用?

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

    在不使用Docker的情况下,可扩展性和高可用性如何?我是否可以复制我的服务并使用负载平衡器在不同的主机上同时运行它们?这样,我应该在一台主机上部署A、B和网关,在另一台主机上部署另一个A、B和网关,然后在它们前面安装负载平衡器。A、 和网关分别在端口80、81和82中运行。通过这种方式,我可以以VMs或LXD容器的形式拥有数千个节点,可以跨越数百个裸机,使用简单的bash脚本和ssh部署,如果事情变得复杂,可以使用Ansible。是或否?

    使用Docker的可扩展性和可用性如何?我是否应该将所有服务放在容器中,并使用Kubernetes之类的工具对其进行管理,以实现高可用性?这样做会增加开销,对吗?因为如果团队还不知道的话,他们将不得不学习像Kubernetes这样的新技术。

    你能给我一个部署Gohtml" target="_blank">语言服务的最佳实践的例子吗?

  • 共有2个答案

    乐正嘉瑞
    2023-03-14

    VonCs的回答很棒。我只想补充一件事:Golang非常适合容器,因为它内置了对自我维持的二进制文件的支持。这意味着您可以构建只有几MB大小的容器,而不是典型的alpin等容器。通常是数百MB。

    看看这篇文章。

    符功
    2023-03-14

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

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

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

    实际上,他们都可以在自己的港口使用自己的集装箱,即使港口是相同的
    容器内通信将使用公开端口工作。然而,如果它们是从外部访问的,那么它们发布的端口实际上需要不同。

    在不使用Docker的情况下,可扩展性和高可用性如何
    使用Docker的可扩展性和可用性如何?

    一旦您谈到动态状态,就会涉及到某种编排:请参阅Docker Swarm或Kubernetes以了解高效的集群管理
    最新docker提供了这两种功能。

    示例:

    • “构建和测试Go应用程序monorepo速度”:或者,我们如何使用TravisCI在monorepo中测试和构建go代码,并快速轻松地部署到Docker。来自首席工程师乔纳森·哈拉普@Wattpad
    • “引入函数即服务(OpenFaaS)”,来自Alex Ellis
     类似资料:
    • 我有一个简单的应用程序构建为docker图像(ubuntu),并把它放入docker容器。它有几个卷附加到它。我想将此容器推送到Azure AppServiceLinux。我尝试了几个选择,但没有成功。 > Azure CLI创建web应用程序并将容器推送到Azure容器注册表,然后将其部署到web应用程序。 给出错误。 将容器上传到,并更新Web应用容器设置以将此容器加载到Web应用中。 给出或

    • 我正在尝试将.war、.aar、.xml和.properties文件部署到tomcat docker容器。我使用了下面的Dockerfile和基本的tomcat docker映像。 到目前为止一切正常。它提取war文件并启动容器内的应用程序。 但是现在我需要像这样添加/编辑“/usr/local/tomcat/webapps/root/web-inf//”和“/usr/local/tomcat/w

    • 在独立AEM安装中,felix OSGi容器是否存在于jetty servlet容器中?或者Jetty服务器是作为捆绑包安装在Felix OSGi容器中的? AEM启动时,哪一个将首先启动? 对于基于战争的安装,这将如何改变? 根据这个答案,两者都是可能的。但我想知道AEM采用哪种方法。

    • 我正在使用Spring Cloud创建微服务架构。 我正在使用Spring Cloud中的以下功能 Zuul–API网关服务,提供动态路由、监控、弹性、安全等功能- 功能区–客户端负载平衡器 Faign–声明性REST客户端 Eureka–服务注册和发现 Sleuth–通过日志进行分布式跟踪 Zipkin–具有请求可视化的分布式跟踪系统 Hystrix-适用于所有API的断路器、容错、Hystri

    • 我想将Redmine Docker映像部署到Azure App Services,并将其指向部署到Azure数据库for MySql服务器的MySql实例。这将为我提供一个完全管理的体系结构。我已经创建了一个MySql实例,可以使用MySql Workbench从本地PC连接到它。不幸的是,我部署到应用服务的Redmine Docker映像无法启动。日志显示:实例******上的Docker经历了

    • 我有一个使用tomcat服务器运行的java应用程序。现在我需要在jboss服务器上运行相同的应用程序。我是jboss新手,我尝试过在jboss中部署war文件,但没能做到。 我不知道应用程序要在jboss上运行需要做什么更改。任何人请引导我。 非常感谢。