微服务传统部署和Docker部署

微服务目录结构

[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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

angushine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值