共计 1469 个字符,预计需要花费 4 分钟才能阅读完成。
微服务架构下,如果注册中心使用 nacos,此时微服务都需要注册到 nacos 上。但是如果单机部署所有微服务和中间件的情况下,机器性能不够,开机时 CPU
会占满,nacos 启动要很久,同时业务服务也在启动,会发现连不上 nacos,这种情况是注册不上但也不是完全无法连接,因为无法连接启动会报错。这个时候,服务会报错 java.net.ConnectException: [NACOS HTTP-GET] The maximum number of tolerable server reconnection errors has been reached
,表示重试了很多次还是注册不上 nacos,那么这个服务就会处于假死状态,容器启动不报错,但是服务用不了。
总的来说,就是业务服务启动过快,导致处于假死状态。那么,这个时候可以利用 springboot 提供的健康检查端点,来判断容器是否是健康的,如果不健康,则重启容器即可。做法如下:
给容器添加健康检查,这里有两种方式,可以直接编辑 dockerfile 或者是在 docker-compose.yml 文件中进行添加。
在 dockerfile 中添加 HEALTHCHECK
指令即可,这里的端口修改为当前容器的端口,这里是 30666,如果基础镜像没有 curl
命令的话,需要安装 curl。
FROM openjdk:8-jdk-alpine3.7
RUN apk add curl
HEALTHCHECK --interval=30s --timeout=10s --retries=3 --start-period=40s \
CMD curl -f http://localhost:30666/actuator/health || exit 1
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /app/${JAR_FILE}
# 设置环境变量
ENV TZ="Asia/Shanghai" \
JAR_NAME=/app/${JAR_FILE} \
JAVA_OPTS="\
-Xms128m \
-Xmx1024m \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m"
ENTRYPOINT java ${JAVA_OPTS} -jar ${JAR_NAME}
如果不想修改 dockerfile,可以使用 docker-compose 启动容器,同样添加 healthcheck
内容即可。
version: '3'
services:
myservice:
image: system-service
restart: unless-stopped
network_mode: host
environment:
- NACOS_URL=127.0.0.1:8848
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:30666/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
添加了健康检查,其实还是不够的,因为健康检查只能显示容器的状态,如果需要重启容器的能力,还需要借助定时任务,linux 下使用 crontab -e
添加如下内容即可:
*/3 * * * * docker ps -f health=unhealthy --format "{{.ID}}" | xargs -I {} docker restart {}
这里的定时时间根据自己需要设定,我这里设置 3 分钟一次主要是机器的性能太差,一个容器的启动时间需要挺久的,如果设置得过短会导致容器无限重启。
提醒:本文发布于392天前,文中所关联的信息可能已发生改变,请知悉!