# wiki
**Repository Path**: Liu_K_ai/wiki
## Basic Information
- **Project Name**: wiki
- **Description**: 毕设开发中的关键说明以及注意事项
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-10-30
- **Last Updated**: 2022-01-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 目录结构
application.name
--application.name-api
--application.name-server
--application.name-po
--deploy.sh(需要打成jar包发布需要添加)
--.gitignore
--pom.xml
## 云效构建规范
构建命令:mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip
构建物上传的打包路径:
* application.name-server/target/application.name.jar
* deploy.sh
部署脚本:
> ${APP_NAME} ${SERVER_NAME} 是阿里云效流水线中配置的两个变量(项目名,服务名)(eg:cloud-demo,cloud-demo-server)
```shell
mkdir -p /home/admin/cloud-demo
tar zxvf /home/admin/app/package.tgz -C /home/admin/cloud-demo/
sh /home/admin/cloud-demo/deploy.sh restart ${APP_NAME} ${SERVER_NAME}
```
## deploy.sh
> 使用随机端口部署 目前能够成功部署到nacos中,一次部署两个服务,此文件必须位于项目根目录
```shell
#!/bin/bash
echo '--------------------【begin】---------------------'
export PROG_NAME=$(echo PROG_NAME | base64 -d)
export APP_NAME=$(echo APP_NAME | base64 -d)
export SERVER_NAME=$(echo SERVER_NAME | base64 -d)
export ACTION=$(echo ACTION | base64 -d)
export APP_START_TIMEOUT=$(echo APP_START_TIMEOUT | base64 -d)
export SERVER_PORT1=$(echo SERVER_PORT1 | base64 -d)
export SERVER_PORT2=$(echo SERVER_PORT2 | base64 -d)
export HEALTH_CHECK_URL1=$(echo HEALTH_CHECK_URL1 | base64 -d)
export HEALTH_CHECK_URL2=$(echo HEALTH_CHECK_URL2 | base64 -d)
export HEALTH_CHECK_FILE_DIR=$(echo HEALTH_CHECK_FILE_DIR | base64 -d)
export APP_HOME=$(echo JAR_NAME | base64 -d)
export JAR_NAME=$(echo JAR_NAME | base64 -d)
export JAVA_OUT1=$(echo JAVA_OUT1 | base64 -d)
export JAVA_OUT2=$(echo JAVA_OUT2 | base64 -d)
SERVER_PORT1=0
SERVER_PORT2=0
#判断当前端口是否被占用,没被占用返回0,反之1
function Listening {
TCPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
UDPListeningnum=`netstat -an | grep ":$1 " | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
(( Listeningnum = TCPListeningnum + UDPListeningnum ))
if [ $Listeningnum == 0 ]; then
echo "0"
else
echo "1"
fi
}
#指定区间随机数
function random_range {
shuf -i $1-$2 -n1
}
#得到随机端口
function get_random_port1 {
echo -e '\n\n\n------------------------------------------------'
templ=0
while [ $SERVER_PORT1 == 0 ]; do
temp1=`random_range $1 $2`
if [ `Listening $temp1` == 0 ] ; then
SERVER_PORT1=$temp1
fi
done
echo -e "随机端口号:\t$SERVER_PORT1"
echo -e '------------------------------------------------\n\n\n'
}
#得到随机端口
function get_random_port2 {
echo -e '\n\n\n------------------------------------------------'
templ=0
while [ $SERVER_PORT2 == 0 ]; do
temp1=`random_range $1 $2`
if [ `Listening $temp1` == 0 ] ; then
SERVER_PORT2=$temp1
fi
done
echo -e "随机端口号:\t$SERVER_PORT2"
echo -e '------------------------------------------------\n\n\n'
}
get_random_port1 55555 60000; #这里指定了1~10000区间,从中任取一个未占用端口号
get_random_port2 60001 65535; #这里指定了1~10000区间,从中任取一个未占用端口号
PROG_NAME=$0
echo "PROG_NAME:${PROG_NAME}"
ACTION=$1
# 修改APP_NAME为云效上的应用名(application.name)
APP_NAME=$2 #######需要修改
#APP_NAME=cloud-demo #######需要修改
SERVER_NAME=$3 #######需要修改
#SERVER_NAME=cloud-demo-server #######需要修改
APP_START_TIMEOUT=20 # 等待应用启动的时间
HEALTH_CHECK_URL1=http://127.0.0.1:${SERVER_PORT1}/actuator/health # 应用健康检查URL
HEALTH_CHECK_URL2=http://127.0.0.1:${SERVER_PORT2}/actuator/health # 应用健康检查URL
HEALTH_CHECK_FILE_DIR=/home/admin/status # 脚本会在这个目录下生成nginx-status文件
APP_HOME=/home/admin/${APP_NAME}/${SERVER_NAME}/target # 从package.tgz中解压出来的jar包放到这个目录下
JAR_NAME=${APP_HOME}/${APP_NAME}.jar # jar包的名字
JAVA_OUT1=${APP_HOME}/logs/start1.log #应用的启动日志
JAVA_OUT2=${APP_HOME}/logs/start2.log #应用的启动日志
# 创建出相关目录
mkdir -p ${HEALTH_CHECK_FILE_DIR}
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
echo -e '\n\n\n------------------------------------------------'
echo -e "service-name:\t${APP_NAME}"
echo -e "健康检查地址:\t${HEALTH_CHECK_URL1} | ${HEALTH_CHECK_URL2}"
echo -e "jar包的路径:\t${JAR_NAME}"
echo -e "应用的启动日志路径:\t${JAVA_OUT1} | ${JAVA_OUT2}"
echo -e '------------------------------------------------\n\n\n'
usage() {
echo "Usage: $PROG_NAME {start|stop|restart}"
exit 2 #执行restart
}
health_check1() {
exptime=0
echo -e '\n\n\n--------------------[健康检查1]---------------------'
echo -e "checking\t${HEALTH_CHECK_URL1}"
while true
do
status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL1}`
echo -e "健康检查状态码\t${status_code}"
if [ "$?" != "0" ]; then
echo -n -e "\rapplication not started"
else
echo "code is $status_code"
if [ "$status_code" == "200" ];then
break
fi
fi
sleep 1
((exptime++))
echo -e "\rWait app to pass health check: $exptime..."
if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
echo 'app start failed'
exit 1
fi
done
echo -e "健康检查 ${HEALTH_CHECK_URL1} 成功"
echo -e '------------------------------------------------\n\n\n'
}
health_check2() {
exptime=0
echo -e '\n\n\n--------------------[健康检查2]---------------------'
echo -e "checking\t${HEALTH_CHECK_URL2}"
while true
do
status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL2}`
echo -e "健康检查状态码\t${status_code}"
if [ "$?" != "0" ]; then
echo -n -e "\rapplication not started"
else
echo "code is $status_code"
if [ "$status_code" == "200" ];then
break
fi
fi
sleep 1
((exptime++))
echo -e "\rWait app to pass health check: $exptime..."
if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
echo 'app start failed'
exit 1
fi
done
echo -e "健康检查 ${HEALTH_CHECK_URL2} 成功"
echo -e '------------------------------------------------\n\n\n'
}
start_application1() {
echo -e '\n\n\n---------------------[启动应用1]--------------------'
echo -e "正在启动Java程序"
echo -e "APP_HOME:\t${APP_HOME}"
echo -e "SERVER_NAME:\t${SERVER_NAME}"
echo -e "jar包的名字:\t${JAR_NAME}"
echo -e "程序启动的端口:\t${SERVER_PORT1}"
# nohup java -jar ${JAR_NAME} --server.port=${SERVER_PORT1} > ${JAVA_OUT1} 2>&1 &
nohup java -Dserver.port=${SERVER_PORT1} -jar ${JAR_NAME} > ${JAVA_OUT1} 2>&1 &
echo "Java程序启动完成"
echo -e '------------------------------------------------\n\n\n'
}
start_application2() {
echo -e '\n\n\n---------------------[启动应用2]--------------------'
echo -e "正在启动Java程序"
echo -e "APP_HOME:\t${APP_HOME}"
echo -e "SERVER_NAME:\t${SERVER_NAME}"
echo -e "jar包的名字:\t${JAR_NAME}"
echo -e "程序启动的端口:\t${SERVER_PORT2}"
nohup nohup java -Dserver.port=${SERVER_PORT2} -jar ${JAR_NAME} > ${JAVA_OUT2} 2>&1 &
echo "Java程序启动完成"
echo -e '------------------------------------------------\n\n\n'
}
stop_application() {
echo -e '\n\n\n---------------------[停止应用]---------------------'
checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
echo "checkjavapid${checkjavapid}"
if [[ ! $checkjavapid ]];then
echo -e "\r此应用未运行"
echo -e '------------------------------------------------\n\n\n'
return
fi
echo "停止已存在的应用"
times=60
for e in $(seq 60)
do
sleep 1
COSTTIME=$(($times - $e ))
checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ $checkjavapid ]];then
kill -9 $checkjavapid
echo -e "\r -- stopping java lasts `expr $COSTTIME` seconds."
else
echo -e "\rJava程序已经被关闭"
break;
fi
done
echo "停止完毕"
echo -e "------------------------------------------------\n\n\n"
}
start() {
start_application1
health_check1
start_application2
health_check2
echo '---------------------【end】----------------------'
}
stop() {
stop_application
}
case "$ACTION" in
start)
echo "<<>>"
start
;;
stop)
echo "<<>>"
stop
;;
restart)
echo "<<>>"
stop
start
;;
*)
echo "<<>>"
usage
;;
esac
```
## redis搭建集群:
```shell
redis-cli -c -a liukaibrysj --cluster create 1.14.47.196:6379 1.14.47.196:6380 1.14.47.196:6381 1.14.47.196:6382 1.14.47.196:6383 1.14.47.196:6384 --cluster-replicas 1
redis-cli -c -a 1234 --cluster create 172.20.0.2:6379 172.20.0.3:6380 172.20.0.4:6381 172.20.0.5:6382 172.20.0.6:6383 172.20.0.7:6384 --cluster-replicas 1
docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6379
docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6380
docker create --name redis-node3 --net host -v /data/redis-data/node3:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6381
docker create --name redis-node4 --net host -v /data/redis-data/node4:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-4.conf --port 6382
docker create --name redis-node5 --net host -v /data/redis-data/node5:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-5.conf --port 6383
docker create --name redis-node6 --net host -v /data/redis-data/node6:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-6.conf --port 6384
redis-cli --cluster create 1.14.47.196:6379 1.14.47.196:6380 1.14.47.196:6381 1.14.47.196:6382 1.14.47.196:6383 1.14.47.196:6384 --cluster-replicas 1
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
```