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

5,364 阅读5分钟

  大家好,我是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项目及启动流程

  1. IntelliJ IDEA 创建gradle项目
  2. Springboot Gradle 配置&依赖实现
  3. 运行&测试
  4. Gradle 配置打包

三、基于Docker部署

  1. Dockerfile编写及镜像打包
  2. 一键部署

四、基于k8s部署

  1. yaml文件编写
  2. k8s部署&测试

五、总结

一、环境信息

软件版本
MacOS11.6
IntelliJ IDEA2023.1.1
JDK17.0.3
Gradle7.4
Springboot3.0.1
Docker19.03.13

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

温馨提示:

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

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

1.创建gradle项目

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

gradle1.png

  1. 查看项目目录结构及版本信息

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. 运行&测试

  1. 基于上面的配置我们简单的写个接口测试一下

代码如下图,从左到右依次是 配置文件Springboot启动入口类Controller

gradle3.png

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

gradle4.png

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

  1. 调用接口测试
# 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命令。

  1. 默认打包命令 bootJar

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

gradle5.png

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

  1. 自定义打包命令

如果我们不想用这个版本号,我们想换个名字,换个目录要怎么编写脚本呢?

比如: 我想打包到 项目目录下的 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和k8s中。

三、基于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 <<EOF | kubectl apply -f -
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: todocoder
---
# deployment 构建
apiVersion: apps/v1
kind: Deployment
metadata:
  name: todocoder-gradle
  namespace: todocoder
spec:
  replicas: 1
  selector:
    matchLabels:
      app: todocoder-gradle
  template:
    metadata:
      labels:
        app: todocoder-gradle
    spec:
      containers:
        - image: todocoder/todocoder-gradle:v1.0.0
          imagePullPolicy: Always
          name: todocoder-gradle
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: "1"
              memory: 2Gi
---
# service
apiVersion: v1
kind: Service
metadata:
  name: todocoder-gradle
  namespace: todocoder
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 8080
      targetPort: 8080
  selector:
    app: todocoder-gradle
---
# node service
apiVersion: v1
kind: Service
metadata:
  name: todocoder-gradle-nodeport
  namespace: todocoder
spec:
  type: NodePort
  ports:
    - name: http
      port: 8080
      targetPort: 8080
      nodePort: 38080
  selector:
    app: todocoder-gradle
EOF

2. k8s部署&测试

可以直接执行步骤1中的命令,yaml文件和命令我写到一起了。

执行完毕后,查看资源信息 kubectl get deploy,pod,svc -n todocoder

gradle8.png

可以看到,deployment, pod, svc 都创建好了,并且NodePort暴露的外部端口为 38080,我这边的 节点ip 是 192.168.100.100,所以接口地址为,这个IP换成你自己的k8s节点IP

curl -XGET http://192.168.100.100:38080/api/todocoder/helloword -H "Content-Type: application/json"
helloword

五、总结

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

源码地址: gitee.com/todocoder/t…

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

微信工号搜: TodoCoder

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