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

时间:2018-05-14 23:01:26

标签: java spring docker spring-boot docker-compose

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

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

2 个答案:

答案 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'
  

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

这里有一些要点清楚

  • 除非你使用depends_on子句,否则Docker compose不会授予启动顺序,无论如何,docker永远不会等到第一个容器完全启动(使用healthcheck的事件)然后启动第二个容器
  • 如果您的微服务 A 取决于微服务 B ,则 A 必须准备好处理 B 失败和不可用,这是一个微服务的前提,因为它会发生,有一天甚至更糟,在一个意想不到的时刻,它不应该。那么 config-server 会在什么时候重启?依赖应用程序会发生什么?

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

  • 执行某种重试using spring-retry,例如
  • 如果您可以处理一些临时配置服务器不可用,那么我的建议是/health add a custom check将此信息暴露给某些监控微服务
  • 如果您的应用无法在没有配置服务器的情况下工作,那么只需致电System.exit(-1)并再次让docker-compose restart your application,直到配置服务器回复某事有益

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

  • 配置服务器
  • APP-1

配置服务器需要比 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