Java應(yīng)用在docker環(huán)境配置容器健康檢查是怎么樣的,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、北流網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場景定制、商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為北流等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
今天就來給java應(yīng)用的容器加入健康檢查,使應(yīng)用的狀態(tài)隨時(shí)都可以被監(jiān)控和查看。
操作系統(tǒng):macOS Catalina 10.15
Docker:19.03.2
今天實(shí)戰(zhàn)的java應(yīng)用,是用來模擬生產(chǎn)環(huán)境應(yīng)用的,特點(diǎn)如下:
普通springboot應(yīng)用,對(duì)外提供http服務(wù),路徑:<font color="blue">/hello</font>
springboot應(yīng)用運(yùn)行在docker容器,在容器的<font color="blue">/app/depend/</font>目錄下有名為<font color="blue">abc.txt</font>的文件;
上述abc.txt文件存在時(shí),springboot應(yīng)用的hello接口正常,若abc.txt不存在,springboot應(yīng)用就不對(duì)外提供服務(wù),相當(dāng)于不健康狀態(tài)(以此來模擬應(yīng)用出現(xiàn)異常);
如果您不想寫代碼,上述springboot應(yīng)用的源碼可在GitHub下載到,地址和鏈接信息如下表所示: | 名稱 | 鏈接 | 備注| | :-------- | :----| :----| | 項(xiàng)目主頁| https://github.com/zq2599/blog_demos | 該項(xiàng)目在GitHub上的主頁 | | git倉庫地址(https)| https://github.com/zq2599/blog_demos.git | 該項(xiàng)目源碼的倉庫地址,https協(xié)議 | | git倉庫地址(ssh)| git@github.com:zq2599/blog_demos.git | 該項(xiàng)目源碼的倉庫地址,ssh協(xié)議 | </br>
這個(gè)git項(xiàng)目中有多個(gè)文件夾,本章的應(yīng)用在<font color="blue">springboot-app-docker-health-check</font>文件夾下,如下圖紅框所示: 
應(yīng)用接入容器健康檢查的步驟如下:
將java應(yīng)用制作成docker鏡像時(shí)需要基礎(chǔ)鏡像,因此先準(zhǔn)備好基礎(chǔ)鏡像,將容器健康檢查的參數(shù)都配置在基礎(chǔ)鏡像中,包括提供容器健康信息的接口路徑,這里定為<font color="blue">/getstate</font>;
改造java應(yīng)用,提供<font color="blue">/getstate</font>接口服務(wù),根據(jù)業(yè)務(wù)的實(shí)際情況決定當(dāng)前應(yīng)用是否健康,健康時(shí)返回碼為200,不健康時(shí)返回碼為403;
編譯構(gòu)建應(yīng)用并且生成docker鏡像;
驗(yàn)證;
創(chuàng)建名為<font color="blue">Dockerfile</font>的文件,內(nèi)容如下:
# Docker file from bolingcavalry # VERSION 0.0.1 # Author: bolingcavalry #基礎(chǔ)鏡像 FROM openjdk:8-jdk-stretch #作者 MAINTAINER BolingCavalry <zq2599@gmail.com> #健康檢查參數(shù)設(shè)置,每5秒檢查一次,接口超時(shí)時(shí)間2秒,連續(xù)10次返回1就判定該容器不健康 HEALTHCHECK --interval=5s --timeout=2s --retries=10 \ CMD curl --silent --fail localhost:8080/getstate || exit 1
由上述可見Dockerfile的內(nèi)容非常簡單,選定自身的基礎(chǔ)鏡像為<font color="blue">openjdk:8-jdk-stretch</font>,再配置好健康檢查參數(shù): | 參數(shù)名 | 作用 | |--|--| | health-cmd | 指定命令在容器內(nèi)執(zhí)行,用于檢查容器健康狀態(tài) | | health-interval | 每次健康檢查的間隔時(shí)間,默認(rèn)30秒 | | health-retries | 假設(shè)該值為3,表示若連續(xù)三次檢測的返回結(jié)果都是不健康,就判定該容器不健康,默認(rèn)值為3 | | health-timeout | 超時(shí)時(shí)間,默認(rèn)30秒 | 2. 在Dockerfile文件所在目錄執(zhí)行命令<font color="blue">docker build -t bolingcavalry/jdk8-healthcheck:0.0.1 .</font>(最后那個(gè)點(diǎn)號(hào)不要漏掉),控制臺(tái)輸出如下,提示鏡像構(gòu)建成功:
(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
此時(shí)宿主機(jī)上已經(jīng)有了名為<font color="blue">bolingcavalry/jdk8-healthcheck:0.0.1</font>的鏡像,該鏡像帶有容器健康檢查的參數(shù)配置,以此作為基礎(chǔ)鏡像來構(gòu)建的其他鏡像都集成了健康檢查的特性;
如果您已經(jīng)在hub.docker.com上注冊過,就可以用<font color="blue">docker login</font>命令登錄,然后執(zhí)行以下命令將本地鏡像推送到hub.docker.com給更多人使用:
docker push bolingcavalry/jdk8-healthcheck:0.0.1
本次實(shí)戰(zhàn)的目標(biāo)是讓Java應(yīng)用支持docker的容器健康檢查功能,接下來一起創(chuàng)建這個(gè)Java應(yīng)用:
這是個(gè)基于maven構(gòu)建的springboot工程,pom.xml內(nèi)容如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bolingcavalry</groupId>
<artifactId>springboot-app-docker-health-check</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-app-docker-health-check</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--使用jib插件-->
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.7.0</version>
<configuration>
<!--from節(jié)點(diǎn)用來設(shè)置鏡像的基礎(chǔ)鏡像,相當(dāng)于Docerkfile中的FROM關(guān)鍵字-->
<from>
<!--基礎(chǔ)鏡像是bolingcavalry/jdk8-healthcheck:0.0.1,該鏡像已配置了健康檢查參數(shù)-->
<image>bolingcavalry/jdk8-healthcheck:0.0.1</image>
</from>
<to>
<!--鏡像名稱和tag,使用了mvn內(nèi)置變量${project.version},表示當(dāng)前工程的version-->
<image>bolingcavalry/${project.artifactId}:${project.version}</image>
</to>
<!--容器相關(guān)的屬性-->
<container>
<!--jvm內(nèi)存參數(shù)-->
<jvmFlags>
<jvmFlag>-Xms1g</jvmFlag>
<jvmFlag>-Xmx1g</jvmFlag>
</jvmFlags>
<!--要暴露的端口-->
<ports>
<port>8080</port>
</ports>
<!--使用該參數(shù)將鏡像的創(chuàng)建時(shí)間與系統(tǒng)時(shí)間對(duì)其-->
<useCurrentTimestamp>true</useCurrentTimestamp>
</container>
</configuration>
</plugin>
</plugins>
</build>
</project>上述pom.xml有以下幾處需要注意: a. 使用jib插件來將當(dāng)前工程構(gòu)建成docker鏡像; b. 基礎(chǔ)鏡像是前面構(gòu)建的<font color="blue">bolingcavalry/jdk8-healthcheck:0.0.1</font>,以此為基礎(chǔ)鏡像的鏡像都帶有健康檢查功能;
主要功能類是<font color="blue">SpringbootAppDockerHealthCheckApplication.java</font>:
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);
}
/**
* 讀取本地文本文件的內(nèi)容并返回
* @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;
}
/**
* 對(duì)外提供的http服務(wù),讀取本地的txt文件將內(nèi)容返回,
* 如果讀取不到內(nèi)容返回碼為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服務(wù)返回當(dāng)前應(yīng)用是否正常,
* 如果能從本地txt文件成功讀取內(nèi)容,當(dāng)前應(yīng)用就算正常,返回碼為200,
* 如果無法從本地txt文件成功讀取內(nèi)容,當(dāng)前應(yīng)用就算異常,返回碼為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. <font color="blue">hello</font>方法是此應(yīng)用對(duì)外提供的服務(wù),如果本地文件abc.txt存在且內(nèi)容不為空,hello方法的返回碼就是200,否則返回碼為403,表示當(dāng)前服務(wù)出現(xiàn)異常; b. <font color="blue">getstate</font>方法是新增的服務(wù),該接口會(huì)被docke-daemon調(diào)用,如果返回碼是200,就表示容器健康,如果返回碼是403,表示容器不健康; 3. 在pom.xml文件所在目錄執(zhí)行<font color="blue">mvn clean compile -U -DskipTests jib:dockerBuild</font>,即可將當(dāng)前工程構(gòu)建為鏡像,名為<font color="blue">bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT</font> 4. 至此,支持容器健康檢查的Java應(yīng)用鏡像構(gòu)建成功,接下來驗(yàn)證容器的健康檢查功能是否正常;
驗(yàn)證的步驟如下: a. 讓應(yīng)用容器正常工作,確保文件<font color="blue">/app/depend/abc.txt</font>是正常的,此時(shí)容器狀態(tài)應(yīng)該是<font color="red">healthy</font> b. 將文件<font color="blue">/app/depend/abc.txt</font>刪除,此時(shí)應(yīng)用hello接口返回碼為403,并且容器狀態(tài)變?yōu)?lt;font color="red">unhealthy</font>
創(chuàng)建文件<font color="blue">abc.txt</font>,完整路徑是<font color="blue">/Users/zhaoqin/temp/201910/20/abc.txt</font>,文件內(nèi)容是個(gè)字符串,例如:123456
執(zhí)行以下命令,用新建的java應(yīng)用鏡像創(chuàng)建容器,該容器會(huì)將<font color="blue">test</font>文件夾映射到容器的<font color="blue">/app/depend</font>文件夾:
docker run --rm \ --name=java-health-check \ -p 8080:8080 \ -v /Users/zhaoqin/temp/201910/20:/app/depend \ bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT
控制臺(tái)可見以下輸出,表明健康檢查接口已經(jīng)被調(diào)用:
2019-10-20 14:16:34.875 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2019-10-20 14:16:34.876 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2019-10-20 14:16:34.892 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 16 ms 2019-10-20 14:16:34.959 INFO 1 --- [nio-8080-exec-1] pringbootAppDockerHealthCheckApplication : service is healthy 2019-10-20 14:16:40.159 INFO 1 --- [nio-8080-exec-2] pringbootAppDockerHealthCheckApplication : service is healthy 2019-10-20 14:16:45.356 INFO 1 --- [nio-8080-exec-4] pringbootAppDockerHealthCheckApplication : service is healthy 2019-10-20 14:16:50.580 INFO 1 --- [nio-8080-exec-6] pringbootAppDockerHealthCheckApplication : service is healthy
執(zhí)行命令<font color="blue">docker ps</font>查看容器狀態(tài),可見已經(jīng)是<font color="red">healthy</font>:
(base) zhaoqindeMBP:20 zhaoqin$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51572d2488fb bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" About a minute ago Up About a minute (healthy) 0.0.0.0:8080->8080/tcp java-health-check
刪除宿主機(jī)上的<font color="blue">/Users/zhaoqin/temp/201910/20/abc.txt</font>,相當(dāng)于容器內(nèi)的abc.txt文件被刪除,此時(shí)控制臺(tái)可見健康檢查接口在被調(diào)用時(shí)發(fā)現(xiàn)文件不存在,已返回了403錯(cuò)誤碼:
019-10-20 14:22:37.490 ERROR 1 --- [nio-8080-exec-7] pringbootAppDockerHealthCheckApplication : service is unhealthy
健康檢查接口被連續(xù)10次調(diào)用后,再執(zhí)行命令<font color="blue">docker ps</font>查看容器狀態(tài),可見已經(jīng)是<font color="red">unhealthy</font>:
(base) zhaoqindeMBP:20 zhaoqin$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 51572d2488fb bolingcavalry/springboot-app-docker-health-check:0.0.1-SNAPSHOT "java -Xms1g -Xmx1g …" 7 minutes ago Up 7 minutes (unhealthy) 0.0.0.0:8080->8080/tcp java-health-check
關(guān)于Java應(yīng)用在docker環(huán)境配置容器健康檢查是怎么樣的問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
當(dāng)前文章:Java應(yīng)用在docker環(huán)境配置容器健康檢查是怎么樣的
文章出自:http://www.chinadenli.net/article24/pishce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、微信公眾號(hào)、關(guān)鍵詞優(yōu)化、軟件開發(fā)、網(wǎng)站建設(shè)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)