跳到主要内容

API部署

安装常用工具

sudo yum install  -y  yum-utils wget vim mtr curl telent lsof git

安装jdk

下载jdk

mkdir -p /opt
cd /opt
wget https://mirrors.javamall.com.cn/jdk/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 https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz --no-check-certificate
yum install -y vim
tar -xzvf apache-maven-3.6.3-bin.tar.gz

配置环境变量:

vi /etc/profile

在文件的最后配置如下内容(增加MAEN_HOME并修改path):

#其它略
MAVEN_HOME=/opt/apache-maven-3.6.3
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
#其它略

注意可能存在已有配置,请修改为正确的路径

使配置文件生效:

source /etc/profile

验证

mvn -v

配置maven私服

vim /opt/apache-maven-3.6.3/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源码

在这之前,请您参考"git部署公钥指南"

作为规范,我们约定源码全部放在 /opt/source目录中,jar放在/opt/server中

mkdir -p /opt/server
mkdir -p /opt/source
cd /opt/source

clone我们需要的源码:

git clone git@codeup.aliyun.com:javashop/product/bbc/standalone/api.git --branch 分支名称

或者

git clone https://codeup.aliyun.com/javashop/product/bbc/standalone/api.git --branch 分支名称

进行初次编译

cd /opt/source/api
mvn clean install -DskipTests -f pom.xml

运行API

配置config-server

配置config-server

mkdir -p /opt/server/{config,logs}
vim /opt/server/config/application.yml

粘贴如下配置

server:
port: 8080
forward-headers-strategy: framework #解决nginx转发后获取不到ip问题
spring:
application:
name: rest-api
## 在单机版时需要增加如下配置 否则项目无法启动
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration #排除redis自动配置
- org.redisson.spring.starter.RedissonAutoConfiguration #排除redisson自动配置
- org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration #排除rabbitmq自动配置
jackson:
property-naming-strategy: SNAKE_CASE
main:
allow-bean-definition-overriding: true
allow-circular-references: true
servlet:
multipart:
enabled: true
max-file-size: 25MB
max-request-size: 25MB
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
#分库分表配置
shardingsphere:
props:
sql:
show: false
sharding:
default-data-source-name: ds0
#定义分库的数据源
datasource:
names: ds0
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.2.189:3306/single_730?useUnicode=true&characterEncoding=utf8&autoReconnect=true
username: root
password: 123456
## 开发环境日志为debug
logging:
#config: classpath:log4j2.xml #日志文件自定义名
level:
org.springframework: ERROR
com.enation.app: DEBUG
org.apache.ibatis: ERROR

file:
name: log/rest-api.log

#java 系统配置
javashop:
product: stand #定义系统标准产品,不可改变此配置
runmode: standalone #定义为集群版,不可改变此配置
debugger: on
i18n: close
license[0]: 123456 #license请向售后人员索要
#token加密秘钥,请务必更换此词串,且注意保密
token-secret: 85d6ce9da4e943ff4dcd367ab3d94164
timeout:
accessTokenTimeout: 120000 #访问token失效时间 单位秒
refreshTokenTimeout: 180000 #刷新token失效时间 单位秒
captchaTimout: 120 #验证码失效时间 单位秒
smscodeTimout: 120 #短信验证码失效时间 单位秒
isDemoSite: no
ssl: off #是否开启ssl
sign: no
domain:
adminApi: api-single.javamall.com.cn
localUpload: api-single.javamall.com.cn #配置为您站点的本地上传的api域名
buyer: https://pc-single.javamall.com.cn #配置为您买家端PC的域名
mobileBuyer: https://m-single.javamall.com.cn #配置为您买家端WAP的域名
#mobileBuyer: m-v722.javamall.com.cn:81 #配置为您买家端WAP的域名
callback: https://api-single.javamall.com.cn/buyer #请配置为您站点的买家端的api域名,如果不配置此项默认读取站点买家端api的域名,用来做支付信任登录回调
referer:
- 'servicewechat.com' #小程序referer
- 'unitradeprod.alipay.com' #支付宝同步回调 referer
- '*.weixin.qq.com' #PC微信信任登录
- '192.168.2.220'
- '127.0.0.1'
- '192.168.2.115'

seata:
enabled: false


上述配置需要 修改数据库链接 ,license ,domain域名信息 目录必须为实际存在且不会被自动删除的路径

建立如下脚本

vim /opt/server/start.sh

粘贴如下内容(注意更改branch参数):

#!/bin/bash

#版本
verson=7.3.0

#要部署的分支
branch=7.3.0_dev

#源文件存储目录
source_dir=/opt/source/api

#程序运行时目录
server_dir=/opt/server
mkdir -p $server_dir"/logs/"

#要运行的api
apis=("rest-api")
# 杀死进程
killone(){
ps -ef |grep java |grep $1 |grep -v 'grep'|awk '{print $2}' | xargs kill -9
echo '停止'$1
}
# 启动程序
startone(){
nohup java -Xmx512m -Xms256m -Xss256k -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

}

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["8080"]="rest-api"

totalPer=0

#是否全部启动成功的标识
all_is_ok=""
last_text=''
times=0
processNum=0
processItem=100/1 #六个任务中每个任务所占进度
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 1 "全部启动完成"
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:8080/doc.html/

tip

如果nginx代理api并设置了虚拟路径 需要在nginx配置文件中添加如下配置

api-nginx

proxy_set_header X-Forwarded-Prefix "/填写您的虚拟路径/";