API部署
安装常用工具
sudo yum install -y yum-utils wget vim mtr curl telent lsof git
安装jdk
下载jdk
mkdir -p /opt
cd /opt
wget https://shoptnt-statics.oss-cn-beijing.aliyuncs.com/jdk-8u281-linux-x64.tar.gz
解压缩并重命名:
tar -xzvf jdk-8u281-linux-x64.tar.gz
mv jdk1.8.0_281/ jdk8
配置环境变量:
vi /etc/profile
在文件的最后配置如下内容:
JAVA_HOME=/opt/jdk8
JRE_HOME=/opt/jdk8/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
注意可能存在已有配置,请修改为正确的路径
使配置文件生效:
source /etc/profile
验证
java -version
如果不正确,可能需要退出重新登录
安装maven
cd /opt
wget http://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
yum install -y vim
tar -xzvf apache-maven-3.8.8-bin.tar.gz
配置环境变量:
vi /etc/profile
在文件的最后配置如下内容(增加MAEN_HOME并修改path):
#其它略
MAVEN_HOME=/opt/apache-maven-3.8.8
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
#其它略
注意可能存在已有配置,请修改为正确的路径
使配置文件生效:
source /etc/profile
验证
mvn -v
配置maven私服
vim /opt/apache-maven-3.8.8/conf/settings.xml
在mirrors节点中新增mirror节点:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
在profiles节点中新增一个profile节点:
<profile>
<id>alimaven</id>
<repositories>
<repository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
</profile>
在activeProfiles节点中新增一个activeProfile 节点:
<activeProfiles>
<activeProfile>alimaven</activeProfile>
</activeProfiles>
注意:以上代码不要写到注释里,请仔细检查!
clone源码
作为规范,我们约定源码全部放在 /opt/source目录中,jar放在/opt/server中
mkdir -p /opt/server
mkdir -p /opt/source
cd /opt/source
clone我们需要的源码:
git clone https://gitee.com/bbc-se/api.git --branch 5.2.3
下载config配置文件
git clone https://gitee.com/bbc-se/config.git
进行初次编译
cd /opt/source/api
mvn clean install -DskipTests -f pom.xml
运行API
配置config-server
配置config-server
vim /opt/source/config/application-dev.yml
如果是生产环境则修改 application-prod.yml
具体请参考:配置中心指南
请配置好数据库、elasticsearch、redis、rabbitmq等这些基础设施
建立其它配置文件
mkdir -p /opt/server/{config,logs}
vim /opt/server/config/bootstrap.yml
粘贴如下配置
spring:
cloud:
config:
uri: http://localhost:8888
profile: dev
server:
tomcat:
basedir: /home/temp
上述配置将api的配置中心指为本机
目录必须为实际存在且不会被自动删除的路径
建立执行脚本
vim /opt/source/application.properties
粘贴如下配置
#默认采用本地配置
server.port=8888
spring.profiles.active=native
spring.cloud.config.server.native.search-locations=/opt/source/config
建立如下脚本
vim /opt/server/start.sh
粘贴如下内容(注意更改branch参数):
#!/bin/bash
#版本
verson=7.2.3
#要部署的分支
branch=5.2.3
#源文件存储目录
source_dir=/opt/source/api
#程序运行时目录
server_dir=/opt/server
mkdir -p $server_dir"/logs/"
#要运行的api
apis=("sba-server" "base-api" "buyer-api" "seller-api" "manager-api" "consumer")
# 杀死进程
killone(){
ps -ef |grep java |grep $1 |grep -v 'grep'|awk '{print $2}' | xargs kill -9
echo '停止'$1
}
# 启动程序
startone(){
nohup java -Xmx512m -Xms256m -Xss1024k -jar $1"-"$verson.jar > $server_dir"/logs/"$1".out" 2>&1 &
echo '启动'$1
}
# 默认全部启动
startall="yes"
for api_name in ${apis[@]}
do
if [[ "$1" != "" && "$1" = $api_name && "$1" != "dontbuild" ]]
then
startall="no"
break
fi
done
echo "startall is "$startall
if [[ "$startall" = "yes" ]]; then
#杀死进程
for api_name in ${apis[@]}
do
killone "$api_name"
echo "$api_name stop success"
done
else
killone "$1"
fi
#启动config server
cd $server_dir
#检测端口状态
checkPort(){
r=`netstat -ntlp | awk '{print $4}' | grep :$1`
if [ "$r" == "" ]
then
return 0
else
return 1
fi
}
#检测config server状态
checkPort 8888
#读取状态
res=`echo $?`
#判断config server 是否启动,如果未启动则启动
if [ "$res" == "0" ]
then
mv $source_dir"/config-server/target/config-server-"$verson.jar $source_dir
nohup java -Xmx512m -Xms256m -Xss1024k -jar -Dspring.config.location=/opt/source/application.properties $source_dir"/"config-server-$verson.jar > $server_dir"/logs/config-server.out" 2>&1 &
echo "等待 config server 启动"
while [ "$res" == "0" ]
do
checkPort 8888
res=`echo $?`
echo -n "."
sleep 1s
done
echo "config server start success"
sleep 1s
else
echo ""
echo "config-server 已经启动"
fi
sleep 1s
if [ "$1" != "dontbuild" ]
then
#更新源码
cd $source_dir
git reset --hard $branch
git pull
mvn install -DskipTests -f pom.xml
rm -rf $server_dir"/*.jar"
for api_name in ${apis[@]}
do
mv $source_dir"/"$api_name"/target/"$api_name"-"$verson.jar $server_dir
done
else
echo "不构建,直接重启"
fi
cd $server_dir
if [[ "$startall" == "yes" ]]; then
for api_name in ${apis[@]}
do
startone "$api_name"
done
else
startone "$1"
fi
#进度条
progressBar(){
label=('|' '/' '-' '\')
per=$1
ii=0
str=''
myTimes=$2
text=$3
let index=myTimes%4
#拼接#字
while [ $ii -le $per ]
do
str=#$str
let ii++
done
printf "[%-100s]%d%% %s %s\r" $str $per ${label[$index]} $text
if [[ $per == 100 ]]; then
echo
fi
}
#声明所有的服务和端口号,以便检测
serviceMap["7000"]="base-api"
serviceMap["7002"]="buyer-api"
serviceMap["7003"]="seller-api"
serviceMap["7004"]="admin-api"
serviceMap["6000"]="consumer"
serviceMap["7006"]="sba-server"
totalPer=0
#是否全部启动成功的标识
all_is_ok=""
last_text=''
times=0
processNum=0
processItem=100/6 #六个任务中每个任务所占进度
while :
do
all_is_ok="yes"
progressBar $totalPer $times $last_text
#100次检查一下
checked=$(($times%100))
if [[ $checked == 0 ]]; then
for key in ${!serviceMap[*]};do
checkPort "$key"
started_result=`echo $?`
if [ "$started_result" == "1" ]
then
processNum=$(($processNum+1))
#每启动一个服务进度
totalPer=$(($processNum*$processItem))
#显示启动成功的程序
printf "%-57s%57s\n" ${serviceMap[$key]} '已启动' | sed 's/[ ]/-/g'
#将启动成功的服务移除掉
unset serviceMap["$key"]
fi
done
fi
sleep 0.1
let times++
if [[ ${#serviceMap[*]} == 0 ]]; then
progressBar 100 6 "全部启动完成"
break
fi
done
进入脚本文件夹中:
cd /opt/server
更新源码并且部署执行如下脚本:
sh start.sh
不更新源码直接重启执行如下脚本
sh start.sh dontbuild
更新源码并且重启单个API执行如下脚本
sh start.sh base-api
更新源码并且重启单个API启动参数分别为:base-ap/buyer-api/seller-api/mamager-api/consumer
验证
当配置中心启动成功后,需要访问以下网址查看配置文件是否有误,(ip替换为物理机IP)
http://ip:8888/a/dev
全部启动成功后,通过以下网址检查API是否成功。
http://ip:7000/swagger-ui/
http://ip:7002/swagger-ui/
http://ip:7003/swagger-ui/
http://ip:7004/swagger-ui/
监控检查各服务节点状态
http://ip:7006
默认用户名密码:admin/admin