有人知道我如何确定 Spring Boot 应用程序的启动时间吗?
当您的应用程序从 /health 端点返回代码 200 并带有类似的有效负载时,它必须准备好
{
"status": "UP"
}
这意味着您的应用程序没有问题并且准备好工作,无论如何,此端点通常由监控应用程序用于了解您的应用程序健康状况,这样它可以维护集群,其他应用程序不常用此端点, 这个显示器一般
- 使用该端点知道您的应用程序何时准备好接收世界请求,这样它就可以将您的应用程序注册到公共地址,例如
- 当
/health 返回DOWN状态 时,尝试重新启动该应用程序以解决问题
看看docker healthcheck,它使用了和spring一样的概念
要使该端点可用,您需要添加弹簧执行器依赖项,这是一个 gradle 示例
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.10.RELEASE'
微服务在初始化之前尝试从配置服务器获取配置......
这里有一些要点要明确
- Docker compose 不会授予启动顺序,除非您使用 depends_on 子句,无论如何 docker 永远不会等待第一个容器完全启动(使用健康检查的事件)然后启动第二个容器
- 如果您的微服务 A 依赖于微服务 B 那么 A 必须准备好应对 B 故障和不可用,这是一个微服务的前提,因为它会在某一天或更糟的时候发生,发生在一个不应该发生的意外时刻。 config-server 会在某个时刻重新启动吗?相关应用会发生什么情况?
所以我的建议是让你的应用程序在尝试从 config server 应用程序获取信息时失败,如果失败了你可以做一些事情:
这里有一些紧凑的例子来模拟你的情况并使用 docker 解决这个问题
config-server 将比 app-1 花费更长的时间来准备,然后 app-1 将保持不健康 直到 config-server 正确响应
version: '3.4'
services:
mg-config-server:
image: nginx:1.10
healthcheck:
test: ["CMD", "bash", "-c", "sleep 15; exit 0"]
interval: 10s
timeout: 17s
retries: 3
start_period: 10s
networks:
- my-net
command: bash -c "echo starting; sleep 20; nginx -g 'daemon off;'"
mg-app-1:
image: alpine:3.7
healthcheck:
test: ["CMD", "curl", "http://mg-config-server"]
interval: 5s
timeout: 5s
retries: 3
start_period: 1s
command: sh -c 'echo starting; apk add --update curl; tail -f /dev/null'
restart: always
networks:
- my-net
dns:
- 8.8.8.8
networks:
my-net:
driver: overlay
那就开始吧
docker-compose up
docker ps | grep "mg"
无论如何,在这种情况下使用 docker swarm 更有意义,因为它会检查运行状况检查端点并在容器不健康时重新启动容器
docker swarm init --advertise-addr <your-machine-ip>
docker stack deploy --compose-file docker-compose.yml my-stack && docker ps | grep "my-stack"
Docker 版本:18.02.0-ce
抱歉回答太长了,希望对你有帮助