背景
- 一个负责数据清洗的项目,以Kafka消费者的方式接受数据并处理。当消费数据数量过多时,要对项目进行性能优化。
- 优化方式:服务器通过部署多个项目增加项目进程的方式增加Kafka消费者的数量。每个进程里使用线程池异步做业务处理。
环境
- Ubuntu18
- Java8
- Jenkins
前置条件
- Jenkins安装完成
Jenkins配置关键点
- 上传项目jar包及Dockerfile文件到服务器
- 上传文件后,自动执行脚本文件
步骤
- 打开Jenkins页面,选择项目进行部署配置,基本配置网上一大把,这里只会详细说明Jenkins构建后操作,如下图
- 发送服务器文件(Source files): 项目打包完成,所有文件都会存在target目录下
- 项目jar包:项目构建的jar包
- Dockerfile文件:Docker构建镜像基本配置,这个文件位置,你可以自己决定,Dockerfile文件内容如下
# 该镜像需要依赖的基础镜像
FROM java:8
# COPY: 将应用的配置文件复制到docker容器的/目录下
# 此处作用:将当前目录下所有jar合并打包到docker根目录下,并重命名 app.jar
# 此处名称自定义即可,如果只是使用一个jar包,那么*.jar 可以指定自己上传的jar包
COPY *.jar /app.jar
# EXPOSE:声明端口
EXPOSE 8551
# 指定docker容器启动时运行jar包
# 此处运行的jar包名称,需要和上面重命名名称一致
ENTRYPOINT ["java", "-jar","/app.jar"]
# 指定维护者的名字
MAINTAINER jingguoliang
- 上传文件后,服务器执行脚本(Exec Command),脚本内容如下
#!/bin/bash
echo "上传远程服务器成功"
#镜像名:自定义
imageNAME="cmms-receiver"
#该端口为Docker宿主机端口:自定义
PORT=8551
#容器1:使用镜像包启动的容器名称,数量自定义,我是使用一个镜像启动3个容器
CONNAME1="cmms-receiver-2.0-RELEASE-1"
#容器2
CONNAME2="cmms-receiver-2.0-RELEASE-2"
#容器3
CONNAME3="cmms-receiver-2.0-RELEASE-3"
pwd
ls -l
#切换到 /home/ubuntu/cmms/lib 目录
#此目录为jenkins打包后发送文件目录,目录结构如下
#cmms-receiver-2.0-RELEASE.jar
#classes/Dockerfile
cd /home/ubuntu/cmms/lib/receiver
ls -l
#复制Dockerfile到lib目录下
cp ./classes/Dockerfile ./Dockerfile
echo "复制Dockerfile成功"
ls -l
#强制删除已有容器1
{ # try
docker rm -f ${CONNAME1}
} || { # catch
echo "容器1不存在"
}
#强制删除已有容器2
{ # try
docker rm -f ${CONNAME2}
} || { # catch
echo "容器2不存在"
}
#强制删除已有容器3
{ # try
docker rm -f ${CONNAME3}
} || { # catch
echo "容器3不存在"
}
#强制删除镜像
{ # try
docker image rm -f ${imageNAME}
} || { # catch
echo "镜像不存在"
}
#构建镜像
echo "开始构建镜像文件"
docker build -t ${imageNAME} .
echo "构筑镜像结束"
#创建并运行容器1:参数-p 8111:{port} 其中8111是容器暴露端口,自定义即可
docker run --name ${CONNAME1} -d -p 8111:${PORT} -e "SPRING_PROFILES_ACTIVE=uat" ${imageNAME}
echo "创建容器$CONNAME1成功"
#创建并运行容器2
docker run --name ${CONNAME2} -d -p 8112:${PORT} -e "SPRING_PROFILES_ACTIVE=uat" ${imageNAME}
echo "创建容器$CONNAME2成功"
#创建并运行容器3
docker run --name ${CONNAME3} -d -p 8113:${PORT} -e "SPRING_PROFILES_ACTIVE=uat" ${imageNAME}
echo "创建容器$CONNAME3成功"