jjzjj

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

coder 2023-06-27 原文

我是 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/

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

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  5. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  9. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  10. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

随机推荐