注:日常更版只需执行步骤五、六即可
所有文件存放、软件安装一般都在 /opt 目录下。
(一)、用户相关配置
一、添加用户、设置密码
adduser -m dpsapp
passwd dpsapp
二、给用户赋予root权限
1、修改文件/etc/sudoers权限
chmod 600 /etc/sudoers
2、修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉
%wheel ALL=(ALL) ALL
3、参照root配置方法,在下面配置dpsapp用户
root ALL=(ALL:LL) ALL
dpsapp ALL=(ALL:LL) ALL
4、/etc/sudoers权限恢复,否则会报错
chmod 400 /etc/sudoers
(二)、服务相关配置
[切换到dpsapp用户执行以下操作]
一、文件位置
jdk1.8 压缩包上传至 /opt/software 目录;
jdk1.8 解压文件放在 /opt/jdk 目录,即为jdk安装目录
tar -xvf jdk-8u311-linux-x64.tar
二、配置java环境变量
[说明]:永久修改,仅对dpsapp用户有效
1、修改dpsapp用户目录下的.bash_profile文件
vim /home/dpsapp/.bash_profile
2、在文件最后添加下面的内容
export JAVA_HOME=/opt/jdk/jdk1.8.0_311
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
3、运行以下命令使配置立即生效
source /home/dpsapp/.bash_profile
4、检查java环境变量配置是否生效
java -version
三:安装Git
[说明]:公司内部原因,生产环境部署时,jar包只能通过git上传至服务器,所以需要安装。
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum -y install git-core
检查git安装是否成功及查看版本
git --version
四:防火墙相关:
1、查看开放的端口列表
firewall-cmd --list-ports
2、开放服务端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
3、重启防火墙
firewall-cmd --reload
4、查看开放端口列表,确认是否开放成功
五、项目git地址: http://*****.****.git
1、切换到服务相关主目录
cd /opt/appservice
2、如果已存在cockpit-1.0-SNAPSHOT.jar文件,请先将文件备份(yyyyMMdd-n 年月日+编号)
cp cockpit-1.0-SNAPSHOT.jar ./versionHist/cockpit-1.0-SNAPSHOT.jar.yyyyMMdd-n
2、进入到指定目录,从Git仓库拉取文件
cd /opt/appservice/cockpit
git clone http://*****.****.git
4、复制jar文件
cd /opt/appservice
cp /opt/appservice/cockpit/target/cockpit-1.0-SNAPSHOT.jar ./
4、编辑配置文件(如果有配置文件修改,则执行以下命令修改添加)
cd /opt/appservice/conf
vim application.yml
vim logback-spring.xml
六、运行脚本,启动服务。
./run.sh start
如果不清楚命令或想得到全部命令参数,可输入./run.sh 查看相应参数。
七、关于log文件:
1、所有日志相关文件全部存放在log文件夹下。
2、gc.log 为java垃圾回收日志,调优时使用。
3、每日的日志会新建文件夹。文件夹以当日日期命名。格式“yyyy-MM-dd”。
4、开启的日志级别为INFO,info.yyyy-MM-dd.0.log 文件包含INFO日志和ERROR日志,error.yyyy-MM-dd.0.log只包含ERROR日志。
[说明]:单个日志文件大于50M,则会新建文件输出日志。
自定义切面
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
* 检查入参,切面处理类
*
* @author fanxinlai
*/
@Slf4j
@Aspect
@Component
public class CheckEmpCodeAspect {
@Value("${hy.auth.url: }")
private String authUrl;
public static final ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<>();
@Pointcut("@annotation(com.hy.cockpit.common.annotation.CheckEmpCode)")
public void checkPointCut() {
}
@Around("checkPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
// 请求的类名
String className = point.getTarget().getClass().getName();
// 请求的方法名
String methodName = point.getSignature().getName();
// 请求参数
Object[] args = point.getArgs();
log.info("请求类及方法为: {}.{}()", className, methodName);
log.info("请求参数有: {}", args);
long beginTime = System.currentTimeMillis();
// 1. 获取request,拿到Token
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
String authToken = request.getHeader("Authorization");
// 2. 携带Token请求鉴权接口获取empCode
log.info("获取到request.head中的Authorization信息: " + authToken);
HashMap<String, String> headers = new HashMap<>();//存放请求头,可以存放多个请求头
headers.put("hytoken", authToken);
// 2.1 发送get请求并接收响应数据
HttpResponse execute = HttpUtil.createGet(authUrl).addHeaders(headers).execute();
String resultBody= execute.body();
log.info("=========[鉴权执行耗时(单位毫秒)]====>>> {}", System.currentTimeMillis() - beginTime);
// 2.2 解析返回的参数,获取empCode
String empCode = getEmpCode(resultBody);
// String empCode = request.getParameter("emp_code");
log.info("鉴权返回的员工编号为: {}", empCode);
// 3. 保存鉴权接口返回的员工工号
HashMap<String, String> map = new HashMap<>();
map.put(Const.EMP_CODE, empCode);
threadLocal.set(map);
// 4. 执行方法
Object result = point.proceed();
threadLocal.remove();
log.info("===== 请求结果===== \n{}", result);
log.info("=========[方法总耗时(单位毫秒)]====>>> {}", System.currentTimeMillis() - beginTime);
return result;
}
启动脚本
#!/bin/bash
#项目包名
APP_NAME=cockpit-1.0-SNAPSHOT.jar
#项目启动脚本使用说明,用来提示输入参数
usage() {
echo "Usage: sh run.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法、命令
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -Dloader.path="./lib" -Dspring.config.location=./conf/application.yml -jar -Xms2048m -Xmx2048m -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./log/gc.log ${APP_NAME} >>./log/log_$(date +%F).log 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
#日志路径
echo "查看日志命令: tail -f ./log/log_$(date +%F).log"
日志配置文件
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Log file path -->
<property name="log.path" value="/home/xinlai/testlog" />
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{MM-dd HH:mm:ss.SSS} %-5level [%logger{50}] - %msg%n</pattern>
</encoder>
</appender>
<!-- Log file debug output -->
<appender name="fileRolling_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level>
<onMatch>DENY</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter> -->
</appender>
<!-- Log file error output -->
<appender name="fileRolling_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="info">
<!--{dev.start}-->
<!-- <appender-ref ref="console" />-->
<!--{dev.end}-->
<!--{alpha.start}
<appender-ref ref="fileRolling_info" />
{alpha.end}-->
<!-- {release.start}-->
<appender-ref ref="fileRolling_info" />
<!-- {release.end}-->
<appender-ref ref="fileRolling_error" />
</root>
<!-- Framework level setting -->
<include resource="config/logger-core.xml" />
<!-- Project level setting -->
<!-- <logger name="your.package" level="DEBUG" /> -->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
</configuration>