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

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

  •  
  •   qloog · 7 天前 · 4415 次点击

    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 即可。

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

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

    欢迎大家畅所欲言

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

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

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

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

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

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

    我是这样启动的

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

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

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

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

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

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