Java应用在docker环境配置容器健康检查

#作者

MAINTAINER BolingCavalry zq2599@gmail.com

#健康检查参数设置,每5秒检查一次,接口超时时间2秒,连续10次返回1就判定该容器不健康

HEALTHCHECK --interval=5s --timeout=2s --retries=10 \

CMD curl --silent --fail localhost:8080/getstate || exit 1

由上述可见Dockerfile的内容非常简单,选定自身的基础镜像为openjdk:8-jdk-stretch,再配置好健康检查参数:

| 参数名 | 作用 |

| — | — |

| health-cmd | 指定命令在容器内执行,用于检查容器健康状态 |

| health-interval | 每次健康检查的间隔时间,默认30秒 |

| health-retries | 假设该值为3,表示若连续三次检测的返回结果都是不健康,就判定该容器不健康,默认值为3 |

| health-timeout | 超时时间,默认30秒 |

  1. 在Dockerfile文件所在目录执行命令docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 .(最后那个点号不要漏掉),控制台输出如下,提示镜像构建成功:

(base) zhaoqindeMacBook-Pro:springboot-app-docker-health-check zhaoqin$ docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 .

Sending build context to Docker daemon 217.6kB

Step 1/3 : FROM openjdk:8-jdk-stretch

8-jdk-stretch: Pulling from library/openjdk

9a0b0ce99936: Already exists

db3b6004c61a: Already exists

f8f075920295: Already exists

6ef14aff1139: Already exists

962785d3b7f9: Already exists

631589572f9b: Already exists

c55a0c6f4c7b: Already exists

Digest: sha256:8bce852e5ccd41b17bf9704c0047f962f891bdde3e401678a52d14a628defa49

Status: Downloaded newer image for openjdk:8-jdk-stretch

—> 57c2c2d2643d

Step 2/3 : MAINTAINER BolingCavalry zq2599@gmail.com

—> Running in 270f78efa617

Removing intermediate container 270f78efa617

—> 01b5df83611d

Step 3/3 : HEALTHCHECK --interval=5s --timeout=2s --retries=10 CMD curl --silent --fail localhost:8080/getstate || exit 1

—> Running in 7cdd08b9ca22

Removing intermediate container 7cdd08b9ca22

—> 9dd7ffb22df4

Successfully built 9dd7ffb22df4

Successfully tagged bolingcavalry/jdk8-healthcheck:0.0.1

  1. 此时宿主机上已经有了名为bolingcavalry/jdk8-healthcheck:0.0.1的镜像,该镜像带有容器健康检查的参数配置,以此作为基础镜像来构建的其他镜像都集成了健康检查的特性;

  2. 如果您已经在hub.docker.com上注册过,就可以用docker login命令登录,然后执行以下命令将本地镜像推送到hub.docker.com给更多人使用:

docker push bolingcavalry/jdk8-healthcheck:0.0.1

改造Java应用

本次实战的目标是让Java应用支持docker的容器健康检查功能,接下来一起创建这个Java应用:

  1. 这是个基于maven构建的springboot工程,pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.2.0.RELEASE

com.bolingcavalry

springboot-app-docker-health-check

0.0.1-SNAPSHOT

springboot-app-docker-health-check

Demo project for Spring Boot

<java.version>1.8</java.version>

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

true

commons-io

commons-io

2.5

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

org.springframework.boot

spring-boot-maven-plugin

com.google.cloud.tools

jib-maven-plugin

1.7.0

bolingcavalry/jdk8-healthcheck:0.0.1

bolingcavalry/ p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version}

-Xms1g

-Xmx1g

8080

true

上述pom.xml有以下几处需要注意:

a. 使用jib插件来将当前工程构建成docker镜像;

b. 基础镜像是前面构建的bolingcavalry/jdk8-healthcheck:0.0.1,以此为基础镜像的镜像都带有健康检查功能;

  1. 主要功能类是SpringbootAppDockerHealthCheckApplication.java:

package com.bolingcavalry.springbootappdockerhealthcheck;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.IOUtils;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.http.ResponseEntity;

import org.springframework.util.StringUtils;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import java.io.*;

import java.util.List;

@SpringBootApplication

@RestController

@Slf4j

public class SpringbootAppDockerHealthCheckApplication {

public static void main(String[] args) {

SpringApplication.run(SpringbootAppDockerHealthCheckApplication.class, args);

}

/**

  • 读取本地文本文件的内容并返回

  • @return

*/

private String getLocalFileContent() {

String content = null;

try{

InputStream is = new FileInputStream(“/app/depend/abc.txt”);

List lines = IOUtils.readLines(is, “UTF-8”);

if(null!=lines && lines.size()>0){

content = lines.get(0);

}

} catch (FileNotFoundException e) {

log.error(“local file not found”, e);

} catch (IOException e) {

log.error(“io exception”, e);

}

return content;

}

/**

  • 对外提供的http服务,读取本地的txt文件将内容返回,

  • 如果读取不到内容返回码为403

  • @return

*/

@RequestMapping(value = “/hello”, method = RequestMethod.GET)

public ResponseEntity hello(){

String localFileContent = getLocalFileContent();

if(StringUtils.isEmpty(localFileContent)) {

log.error(“hello service error”);

return ResponseEntity.status(403).build();

} else {

log.info(“hello service success”);

return ResponseEntity.status(200).body(localFileContent);

}

}

/**

  • 该http服务返回当前应用是否正常,

  • 如果能从本地txt文件成功读取内容,当前应用就算正常,返回码为200,

  • 如果无法从本地txt文件成功读取内容,当前应用就算异常,返回码为403

  • @return

*/

@RequestMapping(value = “/getstate”, method = RequestMethod.GET)

public ResponseEntity getstate(){

String localFileContent = getLocalFileContent();

if(StringUtils.isEmpty(localFileContent)) {

log.error(“service is unhealthy”);

return ResponseEntity.status(403).build();

} else {

log.info(“service is healthy”);

return ResponseEntity.status(200).build();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

[外链图片转存中…(img-hiU50nM4-1713160726932)]

[外链图片转存中…(img-5yx0Ej4i-1713160726932)]

[外链图片转存中…(img-VJrzEnQs-1713160726932)]

[外链图片转存中…(img-QpLQg4As-1713160726933)]

[外链图片转存中…(img-hpvAb2Am-1713160726933)]

[外链图片转存中…(img-cpo94x2h-1713160726933)]

[外链图片转存中…(img-lHSvAL5o-1713160726933)]

[外链图片转存中…(img-rhtMukXu-1713160726934)]

[外链图片转存中…(img-3GVFpWSj-1713160726934)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值