大家好,我是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...
- 然后选择
Gradle
和SDK
版本,以及Java
库,如下:
- 查看项目目录结构及版本信息
创建完项目了,IDEA
帮我们自动创建了3个文件:gradle-wrapper.properties
、build.gradle
和settings.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
- 在主类main函数上点击右键 -> 启动,或者直接在类上点击右键找到运行选项
看到如下的日志,表示启动成功,端口号是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
,如图
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
可以看到,重命名后的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
, 并测试接口
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
可以看到,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等 技术文章,公号无广告,无推荐,纯分享