我在春天有几个微小的细胞。其中一个是配置服务器。我尝试用docker-compose完全启动服务。但是有问题。微服务在初始化之前尝试从配置服务器获取配置。我想为microservice的启动编写脚本以防止错误启动。我现在必须如何确定配置服务器准备就绪的时刻。端口监听不起作用。 Docker隐藏了有关他的网络的信息。我相信有比标准输出解析更好的方法。
有人知道如何确定春季启动应用程序启动的时间吗?
答案 0 :(得分:8)
有人知道如何确定春季启动应用程序启动的时间吗?
当您的应用程序从200
端点返回代码/health
时,必须准备好应用程序
{
"status": "UP"
}
这意味着您的应用程序没有问题并且已准备好工作,无论如何,监视器应用程序通常使用此端点来了解您可以维护群集的应用程序运行状况,此端点不会被其他应用程序使用,这个监视器通常
/health
返回 DOWN 状态看看docker healthcheck,它使用与spring相同的概念
要使该端点可用,您需要添加弹簧致动器依赖性,这里是一个gradle样本
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.10.RELEASE'
微服务在初始化之前尝试从配置服务器获取配置....
这里有一些要点清楚
所以我建议您在尝试从配置服务器应用程序获取信息时让您的应用程序失败,如果失败则可以做一些事情:
/health
add a custom check将此信息暴露给某些监控微服务System.exit(-1)
并再次让docker-compose restart your application,直到配置服务器回复某事有益这里是一些模拟你的案例并使用docker解决这个问题的简洁例子
配置服务器需要比 app-1 更长的时间才能做好准备,然后 app-1 将保持不健康< / strong>直到 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更有意义,因为它会检查healthcheck端点并在容器不健康的情况下重启容器
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
对不起,答案太长,希望有所帮助
答案 1 :(得分:0)
如果您的问题是针对配置服务器的, 您还可以实现spring retry机制
WHERE EXISTS (SELECT 1 FROM MySpecialCharacterTable AS sct WHERE sct.Character = ac.Character)
您还需要具有spring-retry依赖项
spring:
application:
name: test-service
cloud:
config:
enabled: true
uri: ${CONFIG_SERVER_URL:http://127.0.0.1:8761} #where the config-service is running
fail-fast: true #the service will not run if it can't reach the config-service
name: common,test-service
retry:
max-attempts: 10
max-interval: 5000