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

2018-08-24 14:54:17 +08:00
 kaxi

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

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

希望有大侠指点迷津

5625 次点击
所在节点    Go 编程语言
27 条回复
lfzyx
2018-08-24 15:25:52 +08:00
业务开发搞不定的请找运维开发来解决
kaxi
2018-08-24 15:33:31 +08:00
@lfzyx 主要想学习,了解一下。负载均衡切换? etcd 做服务注册与发现? 我想知道实际项目中一般是怎么做的。

求指点!
acmelk
2018-08-24 16:05:02 +08:00
实际生产环境里有一般有发布系统可以通过单点拉入拉出实现灰度发布的。楼上说的对,这套东西一般是运维开发做的。
janxin
2018-08-24 16:40:23 +08:00
即便你什么都不会还有 SO_REUSEPORT

至于最终怎么做,你还是听运维的吧
yesono
2018-08-24 17:02:46 +08:00
注册到 zookeeper、consul、etcd 都可以 go-micro 有现成框架吧。
服务之间 grpc。
http 请求多几个阶段,前端 nginx upstrem。。。
owenliang
2018-08-24 17:07:47 +08:00
找运维给你搞个负载均衡就好了。
Shakeitin
2018-08-24 17:09:41 +08:00
kubernetes 一站式解决所有问题
qq976739120
2018-08-24 17:11:51 +08:00
mark
yanaraika
2018-08-24 17:14:36 +08:00
k8s
checgg
2018-08-24 17:24:29 +08:00
k8s +1
tairan2006
2018-08-24 19:10:39 +08:00
k8s
fcten
2018-08-24 19:15:41 +08:00
k8s +n
wweir
2018-08-24 20:59:20 +08:00
以上都是需要依赖外部服务实现的,在大多数情况下,这已经很好了。

说个通过服务自身实现的,思路来自 facebook 一个 graceful net 库。
此处语境里的服务可以简单理解为监听一个 tcp 或 udp 的端口。Linux 中,这对应一个监听 socket 文件,也有对应的文件描述符,在父子进程中传递文件描述符再简单不过。
剩下我们要做的就是:
1、更新二进制文件
2、给进程一个信号,开启 graceful shutdown 流程
3、进程启动子进程,并传递文件描述符及其他必要信息
4、子进程从文件描述符开启监听服务
5、父进程感知到子进程正常服务,停止监听端口,并等待合适时机退出
6、必要的话,可以在子进程设个定时器,启动一段时间父进程还在,给父进程发 kill 信号
RubyJack
2018-08-24 21:48:40 +08:00
@wweir 5 这一步有问题,一般是子进程正常启动后去 kill 掉父进程
helloworld12
2018-08-24 22:20:51 +08:00
@RubyJack 长连接了解下
silverfox
2018-08-24 22:51:38 +08:00
Gracefully Restarting a Go Program Without Downtime
https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/

可以参考一下
pathbox
2018-08-24 23:01:55 +08:00
前面肯定挂 lvs 如果不影响实时请求的 不用 graceful 问题也不大
RubyJack
2018-08-25 12:36:42 +08:00
@helloworld12 优雅退出了解一下
conn4575
2018-08-25 13:48:44 +08:00
要简单的话就在用 nginx 配好 upstream 然后一个个替换下来更新,复杂点的就是服务发现那一套,终极方案 k8s
merin96
2018-08-25 20:54:33 +08:00
插眼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/482889

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX