V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
qloog
V2EX  ›  Go 编程语言

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

  •  
  •   qloog · 165 天前 · 6759 次点击
    这是一个创建于 165 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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  
       165 天前
    我刚学 Go 也有个疑问,借楼问下,我用 gin 写一个接口后将项目通过 go build 编译成了 linux 的可执行文件后,直接放到服务器上运行。

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

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

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

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

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

    我是这样启动的

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

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

    自从会了 k8s ,啥都往里面丢,方便的不行
    Int100
        26
    Int100  
       165 天前
    @enchilada2020 #17

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

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

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