线上的项目,尤其是小项目大多数后台都只有一个服务在跑。
每次发版本的时候都要在工作群里通知,非常的麻烦,用多实例又显得大材小用。
不妨试试我的方法。
总得思路就是再发布新版本的时候,启动两个服务,先把现在的请求转到新服务上去,然后启动新的代码,最后一步把流量切回来。
话不多说,上代码,如要使用需要修改路径,不能直接用。
#!/bin/bash
JAVA_OPTIONS_INITIAL=-Xms128M
JAVA_OPTIONS_MAX=-Xmx256M
BINPATH=$(cd `dirname $0`; pwd)
RUNPATH=$(cd `dirname $0`; pwd)/run
echo "当前工作目录 ${BINPATH}"
echo 当前运行目录 ${RUNPATH}
if [ $(ls ${BINPATH%/bin*}|grep .*.jar|wc -l) -gt 1 ] ;then
echo “目录中含有多个jar文件”
exit 0
fi
_JAR_KEYWORDS=$(ls ${BINPATH%/bin*}|grep .*.jar)
_JAR_MASTER_KEYWORDS=master_${_JAR_KEYWORDS}
_JAR_SLAVE_KEYWORDS=slave_${_JAR_KEYWORDS}
if [ "$_JAR_KEYWORDS" = "" ] ;then
echo “${BINPATH%/bin*}下未找到jar包!!”
exit 0
fi
echo 开始进行灰度发布流程
MASTER_PID=$(lsof -i:9090 | awk 'NR>1{print $2}')
SLAVE_PID=$(lsof -i:9091 | awk 'NR>1{print $2}')
if [ -z "$SLAVE_PID" ]; then
echo "WAITING FOR PROCESS WITH PID: $SLAVE_PID TO START"
else
echo "KILLING PROCESS WITH PID: $SLAVE_PID"
kill -9 $SLAVE_PID
fi
echo 生成从服务文件
cp -rf $BINPATH/$_JAR_KEYWORDS $RUNPATH/$_JAR_SLAVE_KEYWORDS
nohup java -jar $RUNPATH/$_JAR_SLAVE_KEYWORDS --server.port=9091 >log_slave &
while ! lsof -i:9091 > /dev/null; do
echo "等待9091端口服务启动"
sleep 1
done
echo "9091端口服务启动成功"
echo 把9090上面的所有流量切到9091上面
iptables -t nat -A PREROUTING -p tcp --dport 9090 -j REDIRECT --to-port 9091
if [ -z "$MASTER_PID" ]; then
echo "WAITING FOR PROCESS WITH PID: $MASTER_PID TO START"
else
echo "KILLING PROCESS WITH PID: $MASTER_PID"
kill -9 $MASTER_PID
fi
echo 生成主服务文件
cp -rf $BINPATH/$_JAR_KEYWORDS $RUNPATH/$_JAR_MASTER_KEYWORDS
nohup java -Xmx2000m -Xms1000m -jar $RUNPATH/$_JAR_MASTER_KEYWORDS --server.port=9090 >log_master &
while ! lsof -i:9090 > /dev/null; do
echo "等待9090端口服务启动"
sleep 1
done
echo "9090端口服务启动成功"
echo 把9091上面的所有流量切到9090上面
iptables -t nat -D PREROUTING -p tcp --dport 9090 -j REDIRECT --to-port 9091
echo 关掉从服务
kill -9 $(lsof -i:9091 | awk 'NR>1{print $2}')