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

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

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

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

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

    希望有大侠指点迷津

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

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

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

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

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