微服务目录结构
[root@ecs-0001 server]# ll
total 181788
drwx------ 2 root root 55 Nov 3 17:40 config
-rw-r----- 1 root root 186126734 Nov 3 17:38 server.jar
-rwxrwxrwx 1 root root 307 Jul 18 14:44 deploy.sh
-rw------- 1 root root 825 Nov 19 11:22 Dockerfile
drwx------ 2 root root 185 Nov 19 11:26 logs
-rwxrwxrwx 1 root root 76 Jul 18 14:44 run.sh
-rwxrwxrwx 1 root root 799 Jul 18 14:44 start.sh
-rwxrwxrwx 1 root root 336 Jul 18 14:44 stop.sh
配置文件
(1)config/application.properties中关键配置:
logging.config=config/logback.xml
logging.file.max-history=7
logging.file.max-size=100MB
logging.level.root=error
logging.level.com.example=info
logging.level.com.example.server.service.user.impl.UserServiceImpl=info
logging.level.com.example.server.dao=info
(2)config/logback.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener"/>
<property name="LOG_HOME" value="logs"/>
<property name="APP_NAME" value="server"/>
<springProperty scope="context" name="LOG_SIZE" source="logging.file.max-size"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %msg [%thread]\(%c:%L\)%n</pattern>
</encoder>
</appender>
<appender name="FILELOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/${APP_NAME}.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
<maxFileSize>${LOG_SIZE}</maxFileSize>
<maxHistory>5</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %msg [%thread]\(%c:%L\)%n</pattern>
</encoder>
</appender>
<appender name="ERRORLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/${APP_NAME}-err.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern
>${LOG_HOME}/${APP_NAME}-err.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
<maxFileSize>${LOG_SIZE}</maxFileSize>
<maxHistory>5</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %msg [%thread]\(%c:%L\)%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="ERROR">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILELOG"/>
<appender-ref ref="ERRORLOG"/>
</root>
<logger name="com.example" level="INFO"/>
</configuration>
关键命令
(1)控制台启动命令run.sh
该命令主要用于直接启动微服务,以检查微服务打包及配置是否正确。
#!/bin/sh
java -jar server.jar --spring.config.location=./config
(2)后台进程启动命令start.sh
#!/bin/sh
SH_DIR=$(cd `dirname $0`;pwd)
java_home=env|grep "JAVA_HOME";
latestjar=`ls $SH_DIR -lt | grep '.jar'| awk '{print $9}' | sed -n '1p'`
echo 'Start:'$latestjar
process_exists=`ps -ef|grep $latestjar|grep -v grep|awk '{print $2}'`
if [ -n "${process_exists}" ];then
kill -9 ${process_exists}
fi
if [ ! -n "$java_home" ]; then
cd $SH_DIR/
nohup java -Xms2g -Xmx2g -jar $SH_DIR/$latestjar --spring.config.location=$SH_DIR/config/ > /dev/null 2>&1 &
echo "Application is started";
cd -;
exit;
else
java -version;
if [ $? -eq 0 ]; then
cd $SH_DIR/
nohup java -Xms100m -Xmx2g -jar $SH_DIR/$latestjar --spring.config.location=$SH_DIR/config/ > /dev/null 2>&1 &
else
echo "This system has no jdk";
cd -;
exit;
fi
fi
(2)后台进程停止命令stop.sh
#!/bin/sh
SH_DIR=$(cd `dirname $0`;pwd)
java_home=env|grep "JAVA_HOME";
latestjar=`ls $SH_DIR -lt | grep '.jar'| awk '{print $9}' | sed -n '1p'`
echo 'Stop:'$latestjar
process_exists=`ps -ef|grep $latestjar|grep -v grep|awk '{print $2}'`
if [ -n "${process_exists}" ];then
kill -9 ${process_exists}
fi
echo "Application stop sucess"
Docker方式部署
(1)编写Dockerfile,以下为两种写法
方法一
FROM adoptopenjdk/openjdk8:aarch64-ubuntu-jdk8u472-b08
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /opt/app/logs
RUN mkdir -p /opt/app/config
RUN mkdir -p /opt/app/lib
WORKDIR /opt/app
COPY server.jar /opt/app/server.jar
CMD java -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/server.hprof -jar server.jar
#CMD while true; do sleep 1; done
EXPOSE 9018
方法二
FROM adoptopenjdk/openjdk8:aarch64-ubuntu-jdk8u472-b08
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /opt/app/logs
RUN mkdir -p /opt/app/config
RUN mkdir -p /opt/app/lib
WORKDIR /opt/app
COPY server.jar /opt/app/server.jar
ENV JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/server.hprof"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar server.jar"]
#CMD while true; do sleep 1; done
EXPOSE 9018
如果创建的镜像无法启动,将CMD while true; do sleep 1; done前的注释去掉,就可以进入镜像进行调试。
(2)部署命令deploy.sh
#!/bin/sh
app_name=server
docker stop $app_name
docker rm -f $app_name
docker rmi $app_name:latest
docker build -t $app_name:latest .
docker run -d --network=host --restart=always --name $app_name \
-v /data/app/$app_name/logs:/opt/app/logs \
-v /data/app/$app_name/config:/opt/app/config \
$app_name:latest
779

被折叠的 条评论
为什么被折叠?



