2024年最全Java应用在docker环境配置容器健康检查,一个Java程序员的阿里面试心得

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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();

}

}

}

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

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

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

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

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

验证步骤

验证的步骤如下:

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

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

验证操作

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

  2. 执行以下命令,用新建的java应用镜像创建容器,该容器会将test文件夹映射到容器的/app/depend文件夹:

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

  1. 控制台可见以下输出,表明健康检查接口已经被调用:

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

  1. 执行命令docker ps查看容器状态,可见已经是healthy:

(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

  1. 删除宿主机上的/Users/zhaoqin/temp/201910/20/abc.txt,相当于容器内的abc.txt文件被删除,此时控制台可见健康检查接口在被调用时发现文件不存在,已返回了403错误码:

019-10-20 14:22:37.490 ERROR 1 — [nio-8080-exec-7] pringbootAppDockerHealthCheckApplication : service is unhealthy

  1. 健康检查接口被连续10次调用后,再执行命令docker ps查看容器状态,可见已经是unhealthy:

架构学习资料

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

5)]

[外链图片转存中…(img-hnHBtaEQ-1715080783896)]

[外链图片转存中…(img-1VuFemtG-1715080783896)]

[外链图片转存中…(img-gBZvAkcP-1715080783896)]

[外链图片转存中…(img-7RA2tpAw-1715080783897)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值