如何理解Spring启动应用程序是否可以正常工作?

Art*_*nov 3 java spring docker spring-boot docker-compose

春天我有几个微小的细胞.其中一个是配置服务器.我尝试用docker-compose完全启动服务.但是有问题.微服务在初始化之前尝试从配置服务器获取配置.我想为microservice的启动编写脚本以防止错误启动.我现在必须如何确定配置服务器准备就绪的时刻.端口监听不起作用.Docker隐藏了有关他的网络的信息.我相信有比标准输出解析更好的方法.

有人知道如何确定春季启动应用程序启动的时间吗?

deF*_*tas 9

有人知道如何确定春季启动应用程序启动的时间吗?

当您的应用程序200/health端点返回具有类似负载的代码时,它必须准备就绪

{
  "status": "UP"
}
Run Code Online (Sandbox Code Playgroud)

这意味着您的应用程序没有问题并且已准备好工作,无论如何,监视器应用程序通常使用此端点来了解应用程序运行状况,以便它可以维护群集,此端点不会被其他应用程序使用,此监视器常用

  • 使用该端点知道您的应用程序何时准备好接收世界请求,这样它就可以将您的应用程序注册到公共地址
  • 尝试重新启动该应用程序,期望它可以在/health返回DOWN状态时解决它的问题

看看docker healthcheck,它使用与spring相同的概念

要使该端点可用,您需要添加弹簧致动器依赖性,这是一个gradle样本

compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.10.RELEASE'
Run Code Online (Sandbox Code Playgroud)

微服务在初始化之前尝试从配置服务器获取配置....

这里有一些要点清楚

  • 除非你使用depends_on子句,否则Docker组合不会授予启动顺序,无论如何,docker永远不会等到第一个容器完全启动(使用healthcheck的事件)然后启动第二个容器
  • 如果您的微服务A依赖于微服务B,那么A必须准备好处理B故障和不可用性,这是一个微服务的前提,因为它会在某一天或更糟的情况下发生,在一个意想不到的时刻,它不应该发生.那个配置服务器什么时候重启?依赖应用程序会发生什么?

所以我的建议是,当你的应用程序尝试从配置服务器应用程序获取信息时,让你的应用程序失败,如果失败你可以做一些事情:

这里有一些简洁的例子来模拟你的案例并使用docker解决这个问题

  • 配置服务器
  • APP-1

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
Run Code Online (Sandbox Code Playgroud)

然后开始吧

docker-compose up
docker ps | grep "mg" 
Run Code Online (Sandbox Code Playgroud)

无论如何,在这种情况下使用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"
Run Code Online (Sandbox Code Playgroud)

Docker版本: 18.02.0-ce

抱歉,答案太长,希望有所帮助