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

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

  •  
  •   qloog · Jun 21, 2024 · 10757 views
    This topic created in 867 days ago, the information mentioned may be changed or developed.

    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 replies  •  2024-08-09 15:55:58 +08:00
    pol
    pol
    Jun 21, 2024
    1
    我刚学 Go 也有个疑问,借楼问下,我用 gin 写一个接口后将项目通过 go build 编译成了 linux 的可执行文件后,直接放到服务器上运行。

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

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

    我的问题应该比楼主更低端一点🥺
    BeijingBaby
    BeijingBaby
    PRO
    Jun 21, 2024❤️1
    2
    大型项目,自动化。
    小型项目,手动。

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

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

    我是这样启动的

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

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

    自从会了 k8s ,啥都往里面丢,方便的不行
    Int100
    Int100
    Jun 21, 2024
    26
    @enchilada2020 #17

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

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

    如果上 k8s 也不用你自己搭建.运维负责.你推代码就是了..
    baijiahei
    baijiahei
    Jun 21, 2024❤️1
    37
    @pol pm2
    billzhuang
    billzhuang
    Jun 22, 2024 via iPhone❤️1
    38
    hpa 并不能动态扩容,还要看你的 node 怎么动态扩容。
    testcgd
    testcgd
    Jun 22, 2024 via Android❤️1
    39
    大项目打容器丢到 k8s ,小项目直接 docker 拉起就好
    B1acKy1in
    B1acKy1in
    Jun 22, 2024
    40
    @Int100 感觉 k8s 的维护太麻烦了。好奇存储后端选择的什么
    dzdh
    dzdh
    Jun 22, 2024
    41
    搭车问问,除了 k8s rollingupdate 和 systemd 的 socket 继承外还有什么“简单”的不停机部署呢?
    crackidz
    crackidz
    Jun 22, 2024❤️1
    42
    1. systemd/supervisord -> https://github.com/pioz/god
    2. Docker Container -> Nomad
    3. K8s
    julyclyde
    julyclyde
    Jun 22, 2024
    43
    @pol 因为你把 ps 错写为 pe 了所以找不到吧?
    huihuimoe
    huihuimoe
    Jun 22, 2024 via iPhone❤️1
    44
    @dzdh docker compose 就可以做
    https://github.com/Wowu/docker-rollout
    Int100
    Int100
    Jun 22, 2024 via iPhone
    45
    @B1acKy1in 存储用的 longhorn
    Hopetree
    Hopetree
    Jun 22, 2024❤️1
    46
    虚拟化的话,至少要用 systemd 管理吧,或者 supervisord 也行,这样才能做到服务随系统开机启动,也可以快速实现 start|stop|restart|status ,如果只是手动启动的话,重启虚拟机还要重新去启动一次,上容器那就无所谓了,Nginx+容器也行,企业的话有 k8s 上 k8s
    zhhmax
    zhhmax
    Jun 22, 2024❤️1
    48
    systemctl start
    Dogtler
    Dogtler
    Jun 23, 2024
    49
    k8s, 1 ,自动化推送编译打包替换 tag 拉取更新
    Dogtler
    Dogtler
    Jun 23, 2024
    50
    @Int100 同感,自从踏上云原生这个坑 后面就回不去 本地手动编译 FTP 上传 SSH 手动运行的方式。
    zjyl1994
    zjyl1994
    Jun 23, 2024
    51
    公司有 ci/cd ,k8s 容器化部署。自己 vps 内存小装不了这些,systemd 直接启动程序基本够用。
    treblex
    treblex
    Jun 24, 2024
    52
    @pol #1 直接运行的话,go 有一些自己的优雅重启的方案 https://github.com/air-verse/air
    fingerstyle
    fingerstyle
    Jun 24, 2024
    53
    方案一。对比 java 服务简直爽飞
    windcode
    windcode
    Jun 27, 2024❤️1
    54
    我维护的这个开源项目 Live Demo ( https://karpor-demo.kusionstack.io/)是部署在 ECS 中的 k3s 中,用 Helm 一键安装,后面打算 IaC 化后用 Kusion+Github Action 借助 GitOps 方式快速运维。
    whyso
    whyso
    Jul 3, 2024
    55
    Xshell Xftp
    mocococ
    mocococ
    Jul 6, 2024
    56
    makefile 脚本 部署到 rancher 管理的 k8s 方便省心。
    AlanZ1997
    AlanZ1997
    Aug 9, 2024
    57
    @pol 使用 systemctl 管理
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1914 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 141ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    ♥ Do have faith in what you're doing.