Golang Go语言生产环境合理的部署方案应该是怎样的?如何解决热更新的问题?

发布于 1周前 作者 wuwangju 来自 Go语言

golang 的跨平台性非常好,编译成二进制文件后,直接扔到服务器上执行即可。单机环境测试环境怎么玩都 OK。可是对于生产环境实时处理访问请求,并且是非单机服务,这种场景的部署方案是怎样的?服务升级应该怎么处理比较合理?

是否会用到服务发现相关中间件?

希望有大侠指点迷津


Golang Go语言生产环境合理的部署方案应该是怎样的?如何解决热更新的问题?
28 回复

业务开发搞不定的请找运维开发来解决

更多关于Golang Go语言生产环境合理的部署方案应该是怎样的?如何解决热更新的问题?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


主要想学习,了解一下。负载均衡切换? etcd 做服务注册与发现? 我想知道实际项目中一般是怎么做的。

求指点!

实际生产环境里有一般有发布系统可以通过单点拉入拉出实现灰度发布的。楼上说的对,这套东西一般是运维开发做的。

即便你什么都不会还有 SO_REUSEPORT

至于最终怎么做,你还是听运维的吧

注册到 zookeeper、consul、etcd 都可以 go-micro 有现成框架吧。
服务之间 grpc。
http 请求多几个阶段,前端 nginx upstrem。。。

找运维给你搞个负载均衡就好了。

kubernetes 一站式解决所有问题

以上都是需要依赖外部服务实现的,在大多数情况下,这已经很好了。

说个通过服务自身实现的,思路来自 facebook 一个 graceful net 库。
此处语境里的服务可以简单理解为监听一个 tcp 或 udp 的端口。Linux 中,这对应一个监听 socket 文件,也有对应的文件描述符,在父子进程中传递文件描述符再简单不过。
剩下我们要做的就是:
1、更新二进制文件
2、给进程一个信号,开启 graceful shutdown 流程
3、进程启动子进程,并传递文件描述符及其他必要信息
4、子进程从文件描述符开启监听服务
5、父进程感知到子进程正常服务,停止监听端口,并等待合适时机退出
6、必要的话,可以在子进程设个定时器,启动一段时间父进程还在,给父进程发 kill 信号

5 这一步有问题,一般是子进程正常启动后去 kill 掉父进程

长连接了解下

Gracefully Restarting a Go Program Without Downtime
https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/

可以参考一下

前面肯定挂 lvs 如果不影响实时请求的 不用 graceful 问题也不大

优雅退出了解一下

要简单的话就在用 nginx 配好 upstream 然后一个个替换下来更新,复杂点的就是服务发现那一套,终极方案 k8s

子进程直接 kill 父进程无法做到 graceful shutdown,父进程主动停止监听,并等待已经接收到的任务完成后退出,可以做到让外界的访问完全无感知

微服务,consul 呀

所以你的看法是,父进程无法接收到 kill 然后做对应的处理?

首先,我们得确认一下所描述的是不是同一件事情。
我这里的 kill 指的是 kill 信号,就是 kill -9 发出的那个信号,这个信号进程是无法拦截的,只会被直接干掉。
此处父进程应该被通知,并有机会善后。通知可以是检测到子进程的 pid 文件,也可以是指定的信号,或者其它什么方式

swarm/k8s 集群滚动更新

k8s 滚动更新+1

规模大一点的 k8s
单机模式下还真不是太好搞。
用 upstream 的方式比较简单直接

针对Golang在生产环境的部署方案及热更新问题,以下是我的专业建议:

部署方案

  1. 编译:使用Go编译器(如go build命令)编译Go应用程序,生成可执行文件。
  2. 配置服务器:选择适合的服务器(物理服务器、虚拟机或云服务器),并配置好操作系统和依赖项。
  3. 传输文件:利用FTP、SCP等工具将编译好的可执行文件传输到服务器上。
  4. 设置环境变量:配置如数据库连接信息、端口号等必要的环境变量。
  5. 启动应用:通过SSH登录服务器,运行可执行文件启动应用。
  6. 监控与日志:实施监控和日志记录,确保及时发现和解决问题。
  7. 配置反向代理与负载均衡:根据需求配置Nginx等反向代理服务器,以及负载均衡器以提高性能和可用性。

热更新解决策略

  • Go语言本身不支持热更新,但可通过第三方库(如facebookgo/grace、fvbock/endless)实现。
  • 热更新可能带来内存泄漏、状态不一致等问题,需谨慎使用,并在测试环境中充分验证。

总之,合理的部署方案应确保应用稳定、高效地运行,而热更新则需根据实际需求权衡利弊。

回到顶部