V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mengjisang
V2EX  ›  Java

请教一下,大家如何部署 springboot 后端程序,请给出您的建议。ありがとうございます。

  •  
  •   mengjisang · 2023-05-04 13:01:31 +08:00 · 5069 次点击
    这是一个创建于 570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ,我知道可以 java -jar xxx.jar 跑程序,但是感觉太散装了,tmux 方便调试,却不是合理的运维方式

    46 条回复    2023-05-12 17:51:09 +08:00
    nba2k9
        1
    nba2k9  
       2023-05-04 13:06:40 +08:00
    这个主题为什么会有一个 [散装] 的标签
    xhldtc
        2
    xhldtc  
       2023-05-04 13:07:57 +08:00
    看你部署环境,一般虚拟机就是 java -jar 启动跑的,还能怎么跑。如果是 k8s 环境的话就是打包成容器镜像再部署。看看官网的 prod 环境部署最佳实践吧
    zliea
        3
    zliea  
       2023-05-04 13:15:38 +08:00
    1. nohup+java -jar
    2. 模拟写一个 systemd 的 service 文件
    3. docker
    FreeEx
        4
    FreeEx  
       2023-05-04 13:18:44 +08:00
    建议使用系统服务的方式启动,这样挂了自动拉起,开机自启动啥的都搞定了。
    voidmnwzp
        5
    voidmnwzp  
       2023-05-04 13:19:19 +08:00 via iPhone
    ?日本人?
    cookii
        6
    cookii  
       2023-05-04 13:21:19 +08:00 via Android
    宿主机启动,service 启动,docker 启动最后本质不都是 Java -jar 吗,除非你打成 native 包
    deadlyn
        7
    deadlyn  
       2023-05-04 13:21:23 +08:00
    部署 VM 一般就打包:
    1 、整个 jar
    2 、利用诸如 assembly 打包成 zip ,分离自己的业务 jar 、三方 sdk 、外置资源配置(后续根据变动情况,可仅替换变动的部分,如常变动的业务 jar )

    容器化部署:打包成 image

    按需编写启动的 shell 脚本
    OysterQAQ
        8
    OysterQAQ  
       2023-05-04 13:23:12 +08:00
    @nba2k9 散装日语
    iloveayu
        9
    iloveayu  
       2023-05-04 13:25:01 +08:00   ❤️ 1
    @nba2k9 因为楼主的日语是散装的。
    sensuzu
        10
    sensuzu  
       2023-05-04 13:30:22 +08:00
    日本人???
    LeegoYih
        11
    LeegoYih  
       2023-05-04 13:32:38 +08:00
    # Dockerfile

    FROM openjdk
    COPY *.jar /app.jar
    EXPOSE 8080
    ENTRYPOINT ["sh","-c","java -Dspring.profiles.active=prod -jar /app.jar"]
    siweipancc
        12
    siweipancc  
       2023-05-04 13:43:45 +08:00 via iPhone   ❤️ 3
    包它哥一百层,启动参数还是土的一行,要不转行销售吧
    blankmiss
        13
    blankmiss  
       2023-05-04 13:46:05 +08:00
    你是霓虹人🐎 为什么不用 docker 部署
    superedlimited
        14
    superedlimited  
       2023-05-04 13:47:36 +08:00 via iPhone
    我竟然看懂了前面的阿里嘎多😹
    salmon5
        15
    salmon5  
       2023-05-04 14:01:24 +08:00   ❤️ 1
    vm 部署:java -jar test.jar ,通过 supervisor 或者 systemd 包一层也行
    容器部署:打包成容器镜像
    就这 2 种方式
    mengjisang
        16
    mengjisang  
    OP
       2023-05-04 14:03:29 +08:00
    谢谢大家的建议,OP 颇受启发
    cslive
        17
    cslive  
       2023-05-04 14:13:52 +08:00
    tomcat
    SuperShuYe
        18
    SuperShuYe  
       2023-05-04 14:20:32 +08:00
    from chatgpt
    当您部署 SpringBoot 后端程序时,以下是一些建议:

    使用开发环境中的配置文件 - SpringBoot 包含了一些内置的配置文件,可以方便开发者对基础配置项进行设置,例如 application.properties 或者 application.yaml 这些文件。其中,application.properties 支持 key-value 键值对的方式,并且是默认使用的配置文件。如果您需要更复杂的配置,可以使用 application.yaml ,这是使用 YAML 文件格式的配置文件。

    在生产环境中使用外部配置文件 - 要部署 SpringBoot 应用程序到生产环境中,可以使用外部配置文件来配置应用程序的选项。这样可以更方便地进行部署和更新操作,因为外部配置文件可以在应用程序启动之前进行更改。

    使用系统变量来配置应用程序 - 很多应用程序的配置选项是可以通过系统变量进行配置的。这样可以更方便地进行修改和部署,同时也可以避免一些机密信息暴露在配置文件中。

    使用 Docker 部署 - Docker 是一个流行的容器化平台,可以帮助您更轻松地进行部署和管理。使用 Docker 部署 SpringBoot 应用程序可以帮助您在不同环境中保持应用程序的稳定性和可靠性。

    使用自动化工具进行持续集成和部署 - 自动化工具可以帮助您更快速地进行持续集成和部署。一些流行的自动化工具包括 Jenkins 、CircleCI 和 Travis CI 等。这些工具可以帮助您自动化构建、测试和部署应用程序,以及自动化修改和合并代码。

    希望以上建议能帮助您更好地部署 SpringBoot 后端程序。
    hengyunabc
        19
    hengyunabc  
       2023-05-04 14:39:45 +08:00   ❤️ 6
    spring boot 其实自带一套 service 机制,jar 本身就是一个脚本,打包时配置下就好: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment.installing

    原理: https://hengyun.tech/spring-boot-executable-jar/
    clf
        20
    clf  
       2023-05-04 14:41:42 +08:00
    docker 本质是打包成 jar

    我们会用 jib 来打包上传 docker 镜像。
    cheng6563
        21
    cheng6563  
       2023-05-04 14:55:29 +08:00
    不还是老办法老办法,docker ,systemd ,service 啊。
    zhiyu1998
        22
    zhiyu1998  
       2023-05-04 14:59:45 +08:00
    @superedlimited #14 阿里嘎多 3Q 思密达,我太喜欢白嫖了
    deorth
        23
    deorth  
       2023-05-04 15:15:29 +08:00 via Android
    君日本語本当上手
    mengjisang
        24
    mengjisang  
    OP
       2023-05-04 15:33:55 +08:00
    @deorth 君の日本語は上手ですね
    mengjisang
        25
    mengjisang  
    OP
       2023-05-04 15:36:08 +08:00
    @hengyunabc 谢谢老哥,这是我一直以来忽略的官方文档
    shanghai1943
        26
    shanghai1943  
       2023-05-04 15:43:10 +08:00
    java service wrapper. 也是你们日本人开发的。
    Arumoh
        27
    Arumoh  
       2023-05-04 15:54:47 +08:00
    直接写了个脚本管理部署、更新、运行、回滚
    RRRoger
        28
    RRRoger  
       2023-05-04 17:02:04 +08:00
    打个 jar 包 使用 pm2 管理进程
    DosLee
        29
    DosLee  
       2023-05-04 17:14:17 +08:00
    @zliea 关于第二点。我记得 springboot 是支持把我自己注册为一个服务的,不过需要新增一个同 jar 名一样的配置文件,然后直接 jar 名称+start 就能启动了
    fivesmallq
        30
    fivesmallq  
       2023-05-04 17:45:19 +08:00
    xuanbg
        31
    xuanbg  
       2023-05-04 18:44:18 +08:00
    做一个有 JDK 的 docker 镜像,然后把 jar 包放进去再生成一个镜像上传镜像仓库,或者上传 jar 包到服务器上生成镜像都是可以的。
    Narcissu5
        32
    Narcissu5  
       2023-05-04 18:51:42 +08:00
    springboot 的官方文档专门有一章讲部署的。包含部署到云,部署为 linux 服务等等
    cbdyzj
        34
    cbdyzj  
       2023-05-04 19:05:45 +08:00
    systemd 方案
    screen/temux 方案
    supervisor/pm2 方案
    docker/k8s 方案

    主流的四种方案
    adoal
        35
    adoal  
       2023-05-04 19:40:15 +08:00 via iPhone
    以上都是 fat jar 的方法。还可以 build 成 war ,用传统的 tomcat 方法启动。
    cquan
        36
    cquan  
       2023-05-04 20:29:31 +08:00
    我一般用宝塔
    wdlth
        37
    wdlth  
       2023-05-04 23:51:38 +08:00
    我们这边是用 Docker 分层
    OutOfMemoryError
        38
    OutOfMemoryError  
       2023-05-05 00:02:50 +08:00
    @nba2k9 标签是啥插件啊
    zu1y
        39
    zu1y  
       2023-05-05 00:22:34 +08:00
    用 gradle application plugin ,可以生成个启动脚本
    Dlin
        40
    Dlin  
       2023-05-05 10:02:23 +08:00
    我目前有使用三种方式打包 docker ,
    1 、直接 mvn package 打一个胖包后配合 dockerfile 生成镜像
    2 、使用 spring-boot 官方的 maven 插件中的构建镜像,使用的是 paketobuild ,这个比较方便,但是国内的高墙让整个团队使用是不太友好的。
    3 、因此第三种是使用谷歌的 jib 插件,这个打包也很方便,不需要写 dockerfile ,生成的也不是一个单独的胖包,方便查看和

    以上 2 和 3 因为通过 maven 插件打包,可以很好的利用 maven 得 profile 来激活一些配置或者参数,2 也自带一些优化项(具体我也没有去了解有哪些优化项)
    dif
        41
    dif  
       2023-05-05 11:33:00 +08:00
    Jenkins 配合 shell 脚本,或者直接打成 docker 镜像部署。
    yodhcn
        42
    yodhcn  
       2023-05-05 15:23:56 +08:00 via Android
    @Dlin [胖包] 是什么意思?
    LXGMAX
        43
    LXGMAX  
       2023-05-05 15:50:24 +08:00
    哟西,大大滴干活
    mengjisang
        44
    mengjisang  
    OP
       2023-05-05 16:07:46 +08:00
    @LXGMAX  良し
    Dlin
        45
    Dlin  
       2023-05-05 16:52:54 +08:00
    @yodhcn fat jar
    zengyufei
        46
    zengyufei  
       2023-05-12 17:51:09 +08:00
    第一次没啥经验

    maven package
    进入 target 复制 jar 包
    上传到 linux 服务器
    安装 k3s
    执行 k3s 的 deployment.yaml

    第二次是个老手

    docker 运行 jenkins
    jenkins 帮我拉代码
    jenkins 帮我 maven package
    jenkins 上传 jar 包到 linux 服务器(其他目标机器)
    jenkins 帮我执行 deployment.yaml

    第三次你自己动

    让 jenkins 定时拉代码,自己重复第二次的动作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2741 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:19 · PVG 19:19 · LAX 03:19 · JFK 06:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.