golang 的跨平台性非常好,编译成二进制文件后,直接扔到服务器上执行即可。单机环境测试环境怎么玩都 OK。可是对于生产环境实时处理访问请求,并且是非单机服务,这种场景的部署方案是怎样的?服务升级应该怎么处理比较合理?
是否会用到服务发现相关中间件?
希望有大侠指点迷津
![]() | 1 lfzyx 2018-08-24 15:25:52 +08:00 业务开发搞不定的请找运维开发来解决 |
3 acmelk 2018-08-24 16:05:02 +08:00 实际生产环境里有一般有发布系统可以通过单点拉入拉出实现灰度发布的。楼上说的对,这套东西一般是运维开发做的。 |
![]() | 4 janxin 2018-08-24 16:40:23 +08:00 via iPad 即便你什么都不会还有 SO_REUSEPORT 至于最终怎么做,你还是听运维的吧 |
5 yesono 2018-08-24 17:02:46 +08:00 注册到 zookeeper、consul、etcd 都可以 go-micro 有现成框架吧。 服务之间 grpc。 http 请求多几个阶段,前端 nginx upstrem。。。 |
![]() | 6 owenliang 2018-08-24 17:07:47 +08:00 找运维给你搞个负载均衡就好了。 |
7 Shakeitin 2018-08-24 17:09:41 +08:00 kubernetes 一站式解决所有问题 |
![]() | 8 qq976739120 2018-08-24 17:11:51 +08:00 mark |
![]() | 9 yanaraika 2018-08-24 17:14:36 +08:00 via Android k8s |
![]() | 10 checgg 2018-08-24 17:24:29 +08:00 k8s +1 |
11 tairan2006 2018-08-24 19:10:39 +08:00 via Android k8s |
![]() | 12 fcten 2018-08-24 19:15:41 +08:00 k8s +n |
![]() | 13 wweir 2018-08-24 20:59:20 +08:00 via Android 以上都是需要依赖外部服务实现的,在大多数情况下,这已经很好了。 说个通过服务自身实现的,思路来自 facebook 一个 graceful net 库。 此处语境里的服务可以简单理解为监听一个 tcp 或 udp 的端口。Linux 中,这对应一个监听 socket 文件,也有对应的文件描述符,在父子进程中传递文件描述符再简单不过。 剩下我们要做的就是: 1、更新二进制文件 2、给进程一个信号,开启 graceful shutdown 流程 3、进程启动子进程,并传递文件描述符及其他必要信息 4、子进程从文件描述符开启监听服务 5、父进程感知到子进程正常服务,停止监听端口,并等待合适时机退出 6、必要的话,可以在子进程设个定时器,启动一段时间父进程还在,给父进程发 kill 信号 |
15 helloworld12 2018-08-24 22:20:51 +08:00 @RubyJack 长连接了解下 |
![]() | 16 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/ 可以参考一下 |
![]() | 17 pathbox 2018-08-24 23:01:55 +08:00 via iPhone 前面肯定挂 lvs 如果不影响实时请求的 不用 graceful 问题也不大 |
![]() | 18 RubyJack 2018-08-25 12:36:42 +08:00 @helloworld12 优雅退出了解一下 |
19 conn4575 2018-08-25 13:48:44 +08:00 via Android 要简单的话就在用 nginx 配好 upstream 然后一个个替换下来更新,复杂点的就是服务发现那一套,终极方案 k8s |
![]() | 20 merin96 2018-08-25 20:54:33 +08:00 via iPhone 插眼 |
![]() | 21 wweir 2018-08-25 21:01:36 +08:00 @RubyJack 子进程直接 kill 父进程无法做到 graceful shutdown,父进程主动停止监听,并等待已经接收到的任务完成后退出,可以做到让外界的访问完全无感知 |
![]() | 22 knowckx 2018-08-26 00:36:25 +08:00 微服务,consul 呀 |
![]() | 24 wweir 2018-08-27 11:05:54 +08:00 @RubyJack 首先,我们得确认一下所描述的是不是同一件事情。 我这里的 kill 指的是 kill 信号,就是 kill -9 发出的那个信号,这个信号进程是无法拦截的,只会被直接干掉。 此处父进程应该被通知,并有机会善后。通知可以是检测到子进程的 pid 文件,也可以是指定的信号,或者其它什么方式 |
![]() | 25 xfriday 2018-08-27 12:01:14 +08:00 swarm/k8s 集群滚动更新 |
26 vgmdj 2018-08-28 17:42:03 +08:00 k8s 滚动更新+1 |
![]() | 27 wwek 2018-09-23 14:22:18 +08:00 规模大一点的 k8s 单机模式下还真不是太好搞。 用 upstream 的方式比较简单直接 |