The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
kaxi

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

  •  
  •   kaxi · Aug 24, 2018 · 7069 views
    This topic created in 2996 days ago, the information mentioned may be changed or developed.

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

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

    希望有大侠指点迷津

    27 replies  •  2018-09-23 14:22:18 +08:00
    lfzyx
    lfzyx
    Aug 24, 2018
    1
    业务开发搞不定的请找运维开发来解决
    kaxi
    kaxi
    OP
    Aug 24, 2018
    2
    @lfzyx 主要想学习,了解一下。负载均衡切换? etcd 做服务注册与发现? 我想知道实际项目中一般是怎么做的。

    求指点!
    acmelk
    acmelk
    Aug 24, 2018
    3
    实际生产环境里有一般有发布系统可以通过单点拉入拉出实现灰度发布的。楼上说的对,这套东西一般是运维开发做的。
    janxin
    janxin
    Aug 24, 2018 via iPad
    4
    即便你什么都不会还有 SO_REUSEPORT

    至于最终怎么做,你还是听运维的吧
    yesono
    yesono
    Aug 24, 2018
    5
    注册到 zookeeper、consul、etcd 都可以 go-micro 有现成框架吧。
    服务之间 grpc。
    http 请求多几个阶段,前端 nginx upstrem。。。
    owenliang
    owenliang
    Aug 24, 2018
    6
    找运维给你搞个负载均衡就好了。
    Shakeitin
    Shakeitin
    Aug 24, 2018
    7
    kubernetes 一站式解决所有问题
    qq976739120
    qq976739120
    Aug 24, 2018
    8
    mark
    yanaraika
    yanaraika
    Aug 24, 2018 via Android
    9
    k8s
    checgg
    checgg
    Aug 24, 2018
    10
    k8s +1
    keenkiller
    keenkiller
    Aug 24, 2018 via Android
    11
    k8s
    fcten
    fcten
    Aug 24, 2018
    12
    k8s +n
    wweir
    wweir
    Aug 24, 2018 via Android
    13
    以上都是需要依赖外部服务实现的,在大多数情况下,这已经很好了。

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

    可以参考一下
    pathbox
    pathbox
    Aug 24, 2018 via iPhone
    17
    前面肯定挂 lvs 如果不影响实时请求的 不用 graceful 问题也不大
    RubyJack
    RubyJack
    Aug 25, 2018
    18
    @helloworld12 优雅退出了解一下
    conn4575
    conn4575
    Aug 25, 2018 via Android
    19
    要简单的话就在用 nginx 配好 upstream 然后一个个替换下来更新,复杂点的就是服务发现那一套,终极方案 k8s
    merin96
    merin96
    Aug 25, 2018 via iPhone
    20
    插眼
    wweir
    wweir
    Aug 25, 2018
    21
    @RubyJack 子进程直接 kill 父进程无法做到 graceful shutdown,父进程主动停止监听,并等待已经接收到的任务完成后退出,可以做到让外界的访问完全无感知
    knowckx
    knowckx
    Aug 26, 2018
    22
    微服务,consul 呀
    RubyJack
    RubyJack
    Aug 26, 2018
    23
    @wweir 所以你的看法是,父进程无法接收到 kill 然后做对应的处理?
    wweir
    wweir
    Aug 27, 2018
    24
    @RubyJack 首先,我们得确认一下所描述的是不是同一件事情。
    我这里的 kill 指的是 kill 信号,就是 kill -9 发出的那个信号,这个信号进程是无法拦截的,只会被直接干掉。
    此处父进程应该被通知,并有机会善后。通知可以是检测到子进程的 pid 文件,也可以是指定的信号,或者其它什么方式
    xfriday
    xfriday
    Aug 27, 2018
    25
    swarm/k8s 集群滚动更新
    vgmdj
    vgmdj
    Aug 28, 2018
    26
    k8s 滚动更新+1
    wwek
    wwek
    Sep 23, 2018
    27
    规模大一点的 k8s
    单机模式下还真不是太好搞。
    用 upstream 的方式比较简单直接
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1645 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 05:15 · PVG 13:15 · LAX 21:15 · JFK 00:15
    ♥ Do have faith in what you're doing.