大家线上的 Go 服务都是如何部署的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
qloog
V2EX    Go 编程语言

大家线上的 Go 服务都是如何部署的?

  •  
  •   qloog 2024-06-21 17:37:50 +08:00 8807 次点击
    这是一个创建于 487 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT, Go 服务如何部署到线上环境,包括如何发布、回滚。

    我先说说我知道的

    前提:会对 go 应用进行打 tag

    方案一:

    1 、把 go 应用要上线的 release tag 打包成 docker 镜像 2 、然后在 k8s 进行部署, 回滚的话直接回滚到上一个 tag 3 、域名直接解析到 k8s 的 ingress 解析到对应的 service 中,服务也可以 HPA 动态扩容

    方案二:

    1 、直接把 go 的二进制文件+配置文件 放到对应的线上的机器上,如果是多台就部署到多台服务器 2 、前面加一层 nginx ,然后通过 proxy_pass + upstream 解析到对应的 go 服务器上 3 、域名直接解析到 nginx 即可。

    想知道除了这两种方式,还有什么方式?

    相比而言,你认为哪种方式更好?

    欢迎大家畅所欲言

    57 条回复    2024-08-09 15:55:58 +08:00
    pol
        1
    pol  
       2024-06-21 17:45:38 +08:00
    我刚学 Go 也有个疑问,借楼问下,我用 gin 写一个接口后将项目通过 go build 编译成了 linux 的可执行文件后,直接放到服务器上运行。

    目前还没用到 k8s 这样的东西的情况下,启服务都是这样的吗,因为我在更新版本后 不能像 java 一样通过 pe -ef 找到对应的进程 kill , 目前我是通过端口找的进程 kill 后 重新执行新的包。

    我感觉这样不对,但是不知道大佬们以及企业级是怎样的

    我的问题应该比楼主更低端一点
    BeijingBaby
        2
    BeijingBaby  
       2024-06-21 17:47:57 +08:00   1
    大型项目,自动化。
    小型项目,手动。

    至于是 docker 还是直接 bin 看情况,都在用。
    Shijamlin
        3
    Shijamlin  
       2024-06-21 17:52:17 +08:00
    @pol ps -ef | grep 可以的呀
    body007
        4
    body007  
       2024-06-21 17:53:30 +08:00   1
    直接部署: https://github.com/ochinchina/supervisord
    docker 部署:那当然就是 docker-compose 或者你提到的 k8s 咯
    或者用 systemctl 也行,这个库 github.com/kardianos/service ,支持把自身可执行程序以服务方式部署,window 就是服务,Linux 会根据系统安装的管理工具自动挑选 systemctl 或 service 。上面的 supervisord 也用到这个库,因此 supervisord 也直接能以服务方式部署。
    kumoocat
        5
    kumoocat  
       2024-06-21 17:53:51 +08:00
    @pol pgrep
    fruitmonster
        6
    fruitmonster  
       2024-06-21 17:54:33 +08:00   1
    小型接收数据的服务有几个接口,我比较懒,最开始是本机编译之后二进制直接上传,后来感觉好麻烦,还得找一个支持 rz 的终端,后来干脆就写完代码直接 git push 提交,然后服务器上写了一个脚本,内容包括,备份、编译、清理内存数据等操作,反正每次上线后也得连服务器看日志,索性直接在服务器执行这个脚本,就更新了。
    ji76289
        7
    ji76289  
       2024-06-21 17:55:00 +08:00
    @pol 用 systemd
    povsister
        8
    povsister  
       2024-06-21 17:55:05 +08:00   2
    @pol
    大企业:有 discovery+API 网关,一停一启/蓝绿梯度,rolling update ,南北向流量逐渐调度至新应用容器上
    小作坊无网关(笑): https://github.com/cloudflare/tableflip
    whoosy
        9
    whoosy  
       2024-06-21 17:55:39 +08:00
    k8s
    dzdh
        10
    dzdh  
       2024-06-21 17:57:08 +08:00   1
    - k8s 容器部署 滚动发布 无所谓
    - 蓝绿发布(nginx proxy old -new port)
    - systemd+socket+reuseport

    目前就知道这仨
    coderxy
        11
    coderxy  
       2024-06-21 17:57:36 +08:00   1
    有 k8s 就用 k8s 。 没有的话,应该要用类似于 supervisor 这样的进程守护程序,或者用 docker 。
    ZeekChatCom
        12
    ZeekChatCom  
       2024-06-21 17:58:52 +08:00
    @povsister 谢谢学习了 2 个新名词。南北流量。东西流量。
    cqu1980
        13
    cqu1980  
       2024-06-21 18:00:20 +08:00   1
    supervisor
    perfectlife
        14
    perfectlife  
       2024-06-21 18:01:06 +08:00
    如果有 k8s 选第一种,简单省事,横向扩容也方便
    pol
        15
    pol  
       2024-06-21 18:01:53 +08:00
    @Shijamlin
    @kumoocat
    @ji76289

    我是这样启动的

    nohup ./run > output.log 2> error.log &

    ps -ef | grpe 和 pgrep 都查不到, 我还没尝试用 systemctl
    ZeekChatCom
        16
    ZeekChatCom  
       2024-06-21 18:02:34 +08:00
    @pol 怎么可能查不到。
    KMpAn8Obw1QhPoEP
        17
    KMpAn8Obw1QhPoEP  
       2024-06-21 18:04:43 +08:00 via Android
    佬们都是专业运维吗…后端开发也要操心 k8s 之类的东西吗
    dislazy2023
        18
    dislazy2023  
       2024-06-21 18:05:40 +08:00   1
    我用阿里云的 folw 自动打包成 docker 镜像,然后推送到阿里云个人镜像仓库,然后提前把阿里云 agent 部署到服务器上连接,后面就是阿里云自动部署了 docker-compose
    povsister
        19
    povsister  
       2024-06-21 18:09:19 +08:00
    @enchilada2020
    曾经遇到过只会写代码的研发,他对于自己的程序是如何接到来自用户请求的全链路是完全不知道,也不知道自己的程序是怎么运行/编排/多活 or 单元化的。
    所以,有客诉反馈,结果查问题,怎么查,查什么,完全一抹黑。
    系统设计和改进方向也是一问三不知。
    coderxy
        20
    coderxy  
       2024-06-21 18:15:30 +08:00
    @enchilada2020 后端都要会的, 不会的最多到中级开发止步。
    pkoukk
        21
    pkoukk  
       2024-06-21 18:17:16 +08:00
    @enchilada2020 学会怎么用顶多就是个把星期的事
    cctv6
        22
    cctv6  
       2024-06-21 18:58:35 +08:00 via Android   2
    简单的项目直接 systemd
    中等项目 有条件的用 k8s
    复杂的项目,在不适合 k8s 的情况下继续用 systemd 。
    haiku
        23
    haiku  
       2024-06-21 19:19:05 +08:00 via Android   1
    Systemd/docker compose/k8s
    changepll
        24
    changepll  
       2024-06-21 19:29:34 +08:00   1
    至少 6 年前,直接编译成可执行文件。 还觉得挺高端的。
    Int100
        25
    Int100  
       2024-06-21 20:22:10 +08:00   2
    选择 k8s

    自从会了 k8s ,啥都往里面丢,方便的不行
    Int100
        26
    Int100  
       2024-06-21 20:23:27 +08:00
    @enchilada2020 #17

    > 佬们都是专业运维吗…后端开发也要操心 k8s 之类的东西吗

    不是,就单纯好玩,跟玩具一样,每天睡觉前折腾几下
    FightPig     27
    FightPig  
       2024-06-21 22:00:59 +08:00
    小项目直接编译后丢上去,更新的话覆盖重启。大一些的,docker
    Judoon
        28
    Judoon  
       2024-06-21 22:07:04 +08:00
    你这个属于部署方式,和 go 语言有什么关系。任何语言写的程序基本都能用你说的两种方式来部署
    caola
        29
    caola  
       2024-06-21 22:07:23 +08:00
    一部分用 systemd ,一部分用 docker compose
    mshadow
        30
    mshadow  
       2024-06-21 22:20:33 +08:00 via Android   1
    有 k8s 的上 k8s 。自己玩儿的小项目,ci 自动 build docker 镜像,然后 WatchTower 检测镜像更新了自动更新容器
    qloog
        31
    qloog  
    OP
       2024-06-21 22:37:31 +08:00
    @mshadow WatchTower 听起来不错,可以试试
    kneo
        32
    kneo  
       2024-06-21 22:43:17 +08:00 via Android
    怎么部署是根据业务需求来的。Go 的部署已经很简单了,刻意学太多姿势没必要。
    Hellert
        33
    Hellert  
       2024-06-21 23:11:51 +08:00 via Android
    windows 下 winsw
    linux 下 systemd
    zhenjiachen
        34
    zhenjiachen  
       2024-06-21 23:24:32 +08:00 via iPhone   1
    k8s 我们用 helm ,自己写了个 chrt ,回滚直接 helm rollback
    viger
        35
    viger  
       2024-06-21 23:28:05 +08:00   1
    小项目,目前 ngx proxy + docker + shell 自动部署。
    version
        36
    version  
       2024-06-21 23:40:02 +08:00   1
    dockerfile 源码编译 最终镜像只丢二进制文件 tag 打上版本...ssh 推到远程服务.重启 dc
    任何项目都是.复制下 gitlab-ci 设置改下 cidc 变量.
    而且上服务器.可以查看运行 docker 镜像版本.方便知道啥时候写的 bug
    以上适合个人项目..外包项目.小型项目

    如果上 k8s 也不用你自己搭建.运维负责.你推代码就是了..
    baijiahei
        37
    baijiahei  
       2024-06-21 23:40:57 +08:00   1
    @pol pm2
    billzhuang
        38
    billzhuang  
       2024-06-22 09:16:44 +08:00 via iPhone   1
    hpa 并不能动态扩容,还要看你的 node 怎么动态扩容。
    testcgd
        39
    testcgd  
       2024-06-22 10:50:14 +08:00 via Android   1
    大项目打容器丢到 k8s ,小项目直接 docker 拉起就好
    B1acKy1in
        40
    B1acKy1in  
       2024-06-22 11:30:16 +08:00
    @Int100 感觉 k8s 的维护太麻烦了。好奇存储后端选择的什么
    dzdh
        41
    dzdh  
       2024-06-22 12:26:50 +08:00
    搭车问问,除了 k8s rollingupdate 和 systemd 的 socket 继承外还有什么“简单”的不停机部署呢?
    crackidz
        42
    crackidz  
       2024-06-22 12:27:45 +08:00   1
    1. systemd/supervisord -> https://github.com/pioz/god
    2. Docker Container -> Nomad
    3. K8s
    julyclyde
        43
    julyclyde  
       2024-06-22 16:25:36 +08:00
    @pol 因为你把 ps 错写为 pe 了所以找不到吧?
    huihuimoe
        44
    huihuimoe  
       2024-06-22 17:16:22 +08:00 via iPhone   1
    @dzdh docker compose 就可以做
    https://github.com/Wowu/docker-rollout
    Int100
        45
    Int100  
       2024-06-22 17:42:01 +08:00 via iPhone
    @B1acKy1in 存储用的 longhorn
    Hopetree
        46
    Hopetree  
       2024-06-22 18:04:16 +08:00   1
    虚拟化的话,至少要用 systemd 管理吧,或者 supervisord 也行,这样才能做到服务随系统开机启动,也可以快速实现 start|stop|restart|status ,如果只是手动启动的话,重启虚拟机还要重新去启动一次,上容器那就无所谓了,Nginx+容器也行,企业的话有 k8s 上 k8s
    SparrowHe1
        47
    SparrowHe1  
       2024-06-22 18:23:36 +08:00   1
    zhhmax
        48
    zhhmax  
       2024-06-22 20:57:34 +08:00   1
    systemctl start
    Dogtler
        49
    Dogtler  
       2024-06-23 16:26:18 +08:00
    k8s, 1 ,自动化推送编译打包替换 tag 拉取更新
    Dogtler
        50
    Dogtler  
       2024-06-23 16:30:55 +08:00
    @Int100 同感,自从踏上云原生这个坑 后面就回不去 本地手动编译 FTP 上传 SSH 手动运行的方式。
    zjyl1994
        51
    zjyl1994  
       2024-06-23 20:22:03 +08:00
    公司有 ci/cd ,k8s 容器化部署。自己 vps 内存小装不了这些,systemd 直接启动程序基本够用。
    treblex
        52
    treblex  
       2024-06-24 10:10:49 +08:00
    @pol #1 直接运行的话,go 有一些自己的优雅重启的方案 https://github.com/air-verse/air
    fingerstyle
        53
    fingerstyle  
       2024-06-24 14:31:02 +08:00
    方案一。对比 java 服务简直爽飞
    windcode
        54
    windcode  
       2024-06-27 15:21:36 +08:00   1
    我维护的这个开源项目 Live Demo ( https://karpor-demo.kusionstack.io/)是部署在 ECS 中的 k3s 中,用 Helm 一键安装,后面打算 IaC 化后用 Kusion+Github Action 借助 GitOps 方式快速运维。
    whyso
        55
    whyso  
       2024-07-03 18:23:39 +08:00
    Xshell Xftp
    mocococ
        56
    mocococ  
       2024-07-06 11:59:58 +08:00
    makefile 脚本 部署到 rancher 管理的 k8s 方便省心。
    AlanZ1997
        57
    AlanZ1997  
       2024-08-09 15:55:58 +08:00
    @pol 使用 systemctl 管理
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5795 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 97ms UTC 03:07 PVG 11:07 LAX 20:07 JFK 23:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86