【全套换新还在用mvn构建SpringBoot? 新项目都在用java17+gradle+k8s(5000字附源码)

2023年 8月 23日 61.2k 0

  大家好,我是Coder哥,最近比较忙,在做新的项目,之前一直用的 jdk 1.8 + maven 的方式构建的项目,虽然还是用的Java,但是全套都换新了,java 升级到17,项目构建也换成了gradle 7.4,打包镜像及发布两套环境 Docker+k8s,本篇文章比较全面,建议收藏!

  俗话说万事开头难,网上教程也很多,但大多都不是很全面,这次基于公司的项目来总结一下整体的构建流程,包括,gradle项目的创建,依赖管理,jar包的生成,gradle Task 自定义jar目录, dockerfile 编写,docker 运行发布,k8s springboot项目yaml编写及k8s部署,对于初学者来讲,能少走18个弯路。绝对是纯干货。

我们从以下几个步骤来看,如果都会直接退出返回就行,如果觉得有帮助记得帮忙点个赞!!!或者收藏一下回头用上的时候再看,^_^

一、环境信息

二、IntelliJ IDEA 创建springboot+gradle项目及启动流程

  • IntelliJ IDEA 创建gradle项目
  • Springboot Gradle 配置&依赖实现
  • 运行&测试
  • Gradle 配置打包
  • 三、基于Docker部署

  • Dockerfile编写及镜像打包
  • 一键部署
  • 四、基于k8s部署

  • yaml文件编写
  • k8s部署&测试
  • 五、总结

    一、环境信息

    软件 版本
    MacOS 11.6
    IntelliJ IDEA 2023.1.1
    JDK 17.0.3
    Gradle 7.4
    Springboot 3.0.1
    Docker 19.03.13

    以上是本次安装的所有涉及到的环境及版本信息

    温馨提示:

    建议JDK,Gradle,Springboot 这三个保持一致,避免版本不兼容的问题 其他的软件版本无需关注

    二、Springboot+gradle项目的创建及启动流程

    1.创建gradle项目

  • 打开 IDEA
  • 菜单选择 File > New > Project...
  • 然后选择GradleSDK版本,以及Java库,如下:
  • gradle1.png

  • 查看项目目录结构及版本信息
  • gradle2.png

    创建完项目了,IDEA帮我们自动创建了3个文件:gradle-wrapper.propertiesbuild.gradlesettings.gradle

    gradle-wrapper.properties: 用来进行gradle版本控制的

    build.gradle: 这个文件是项目的gradle文件,里面可以添加依赖包,或者写一些自定义的任务脚本等。

    settings.gradle: 这个文件可以控制多module

    2.Springboot Gradle 配置&依赖实现

    如果我们想构建一个springboot项目,需要配置springboot的相关依赖,通过上面的文件介绍我们可以知道,这些依赖是在 build.gradle 中来配置,内容如下:

    plugins {
        // springboot 插件及版本
        id 'org.springframework.boot' version '3.0.1'
        id 'java'
    }
    ​
    allprojects {
        ext {
            springVersion = '3.0.1'
        }
    }
    ​
    // 设置编码格式
    tasks.withType(JavaCompile) {
        options.encoding = "UTF-8"
    }
    ​
    group = 'com.todocoder.gradle'
    version = '1.0-SNAPSHOT'
    ​
    ​
    //编译后的.class文件的jdk版本
    sourceCompatibility = 17
    //项目运行版本
    targetCompatibility = 17
    ​
    /*
     * 指定所使用的仓库
     */
    repositories {
        // Gradle没有自己的中央仓库
        // 先从本地maven仓库寻找依赖的jar包,存在则直接使用本地maven仓库的jar
        mavenLocal()
        // 本地maven仓库没有则从远程仓库下载jar包,并保存到 环境变量GRADLE_USER_HOME 配置的路径下
        // 设置maven仓库阿里镜像地址
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        // 配置使用Maven的中央仓库
        mavenCentral()
    }
    ​
    dependencies {
        // springboot web starter
        implementation "org.springframework.boot:spring-boot-starter-web:${springVersion}"
        testImplementation platform('org.junit:junit-bom:5.9.1')
        testImplementation 'org.junit.jupiter:junit-jupiter'
    }
    ​
    test {
        useJUnitPlatform()
    }
    

    上面是可以运行起来springboot的最小配置

    3. 运行&测试

  • 基于上面的配置我们简单的写个接口测试一下
  • 代码如下图,从左到右依次是 配置文件Springboot启动入口类Controller

    gradle3.png

  • 在主类main函数上点击右键 -> 启动,或者直接在类上点击右键找到运行选项
  • gradle4.png

    看到如下的日志,表示启动成功,端口号是8080.

  • 调用接口测试
  • # http://127.0.0.1:8080/api/todocoder/helloword
    curl -XGET http://127.0.0.1:8080/api/todocoder/helloword -H "Content-Type: application/json"
    helloword
    

    可以看到,输出了结果,上面是简单的一个接口。

    4. Gradle 配置打包

    那么接口代码都写完了,就需要打包发布了,来看一下最基本的build命令。

  • 默认打包命令 bootJar
  • 运行 ./gradlew bootJar 后,在项目目录下会有个 ./build/libs 目录,jar包在这个目录下,名字是 todocoder-gradle-1.0-SNAPSHOT.jar,如图

    gradle5.png

    bootJar 是springboot插件提供的打包springboot项目的命令

  • 自定义打包命令
  • 如果我们不想用这个版本号,我们想换个名字,换个目录要怎么编写脚本呢?

    比如: 我想打包到 项目目录下的 app/ 目录下,名字是 ${projectName}.jar,可以在 build.gradle文件下添加如下打包脚本:

    def jarname = String.format("%s-%s.jar",project.name,version)
    // 拷贝文件 dependsOn: bootJar 依赖springboot 插件的 bootJar打包命令
    task copyConfigFile(type: Copy, dependsOn: bootJar) {
        // 清除app目录的历史文件
        delete "app/"
        // copy jar包 从 build/libs/ 目录到 app/ 目录
        from('build/libs/' + jarname)
        into 'app/'
        // 重命名成我们要的名字
        rename(jarname, project.name + '.jar')
    }
    // 依赖 clean 任务
    task buildTodoCoderJar(dependsOn: clean) {
        dependsOn copyConfigFile
    }
    

    如上脚本,我们先清除一下目录 -> copy jar包到目标目录 -> 重命名jar

    运行打包命令:

    # 后面的 task是我们上面自定义的任务名
    ./gradlew buildTodoCoderJar
    

    gradle6.png

    可以看到,重命名后的jar包,已经复制到 app/ 目录下面了。

    上面我们 创建项目 -> 编写接口 -> 运行项目 -> 测试接口 -> 打包项目 开发期的流程已经打通了,那么我们开发完成后需要发布,我们下面把项目发布到

    三、基于Docker部署

    1. Dockerfile编写及镜像打包

    dockerfile如下:

    # jre 17 的镜像
    FROM todocoder/jre:17
    MAINTAINER todocoder
    WORKDIR /todocoder
    # jvm启动参数
    ENV APP_ARGS="-XX:+UseG1GC -Xms1024m -Xmx1024m -Xss256k -XX:MetaspaceSize=128m"
    ADD app/todocoder-gradle.jar /todocoder/app.jar
    # 镜像启动后运行的脚本
    ENTRYPOINT ["java","-jar","/todocoder/app.jar","${APP_ARGS}","--spring.profiles.active=dev","-c"]
    

    Docker run

    docker run -d -p 8080:8080 todocoder/todocoder-gradle:v1.0.0 --name=todocoder-gradle
    

    2. 一键打包部署

    在项目根目录下创建个build.sh,内容如下:

    #!/bin/bash
    # 打jar包
    ./gradlew buildTodoCoderJar
    # 构建docker镜像
    docker build -t todocoder/todocoder-gradle:v1.0.0 .
    # 运行镜像
    docker run --name=todocoder-gradle -d -p 8080:8080 todocoder/todocoder-gradle:v1.0.0
    

    直接执行命令 :bash build.sh

    查看 docker ps | grep gradle, 并测试接口

    gradle7.png

    curl -XGET http://127.0.0.1:8080/api/todocoder/helloword -H "Content-Type: application/json"
    helloword
    

    四、基于k8s部署

    在k8s中部署,首先得写个deployment的yaml文件,然后部署

    1. yaml文件编写

    这里有四个yaml,分别是 创建namespace,创建deployment, 创建两个service(这两个的区别一个是内部集群IP访问,一个暴露了NodePort端口用来外部访问),具体用的话根据你自己的环境修改一下

    cat  运行项目 -> 测试接口 -> 打包项目 流程,到运维部署 dockerfile编写&Docker发布 -> k8s yaml编写 -> k8s部署,除了你们公司业务的代码没写,其他的一应俱全,虽然也不是什么高难度的东西,但是也能让各位避免走很多没必要的弯路,后面也会基于此项目把一些常见的业务功能以文章的方式记录下来,欢迎大家关注。

    感谢各位能看到这里,觉得文章有用的话记得关注一下,别忘了点赞收藏哦,最后打个小广告

    微信工号搜: TodoCoder

    会不定时分享 Java,Go,Docker,k8s等 技术文章,公号无广告,无推荐,纯分享

    本项目代码还在整理中,后面会补充到本文,如想提前要一些代码,可以公众号私聊我。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论