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

主要功能类是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<String> 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<String> 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<String> 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(); } } }

上述代码有以下几处需要注意:

a. hello方法是此应用对外提供的服务,如果本地文件abc.txt存在且内容不为空,hello方法的返回码就是200,否则返回码为403,表示当前服务出现异常;

b. getstate方法是新增的服务,该接口会被docke-daemon调用,如果返回码是200,就表示容器健康,如果返回码是403,表示容器不健康;

在pom.xml文件所在目录执行mvn clean compile -U -DskipTests jib:dockerBuild,即可将当前工程构建为镜像,名为bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT

至此,支持容器健康检查的Java应用镜像构建成功,接下来验证容器的健康检查功能是否正常;

验证步骤 验证的步骤如下:

a. 让应用容器正常工作,确保文件/app/depend/abc.txt是正常的,此时容器状态应该是healthy

b. 将文件/app/depend/abc.txt删除,此时应用hello接口返回码为403,并且容器状态变为unhealthy

验证操作

创建文件abc.txt,完整路径是/Users/zhaoqin/temp/201910/20/abc.txt,文件内容是个字符串,例如:123456

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfxdw.html