给 Springboot 容器添加健康检查


共计 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 分钟一次主要是机器的性能太差,一个容器的启动时间需要挺久的,如果设置得过短会导致容器无限重启。

提醒:本文发布于327天前,文中所关联的信息可能已发生改变,请知悉!

Tips:清朝云网络工作室

阅读剩余
THE END