Spring Cloud Config Server无法使用Docker撰写

时间:2017-06-24 16:20:56

标签: spring-boot docker-compose spring-cloud spring-cloud-netflix spring-cloud-config

我有一个spring cloud配置服务器并将其打包为docker image然后我有spring spring eureka服务器,它也打包为docker image。

当我使用docker compose运行这两个时,我收到以下错误。

discovery-service_1 | 2017-06-24 15:36:12.059 INFO 5 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at: http://config-service:9001 discovery-service_1 | 2017-06-24 15:36:12.997 WARN 5 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://config-service:9001/cls-discovery-service/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

  

虽然配置服务已成功启动并运行,但发现服务仍然因某些原因找不到它。

此处使用的Docker撰写文件是 version: '2' services: config-service: image: cloudsea/cls-config-service ports: - 9001:9001 expose: - "9001" discovery-service: image: cloudsea/cls-discovery-service depends_on: - config-service environment: CLOUD_SEA_CONFIG_SERVER_URI: http://config-service:9001 EUREKA_DEFAULT_ZONE_URL: http://discovery-service:8761/eureka/ ports: - 8761:8761 links: - config-service:config-service

以下是DISCOVERY SERVICE的 bootstrap.properties

spring.cloud.config.uri = ${CLOUD_SEA_CONFIG_SERVER_URI:http://localhost:9001} spring.application.name = ${SPRING_APPLICATION_NAME:cls-discovery-service}

以下是位于github的DISCOVERY SERVICE的 cls-discovery-service.properties

server.port=${SERVER_PORT:8761} eureka.client.registerWithEureka: false eureka.client.fetchRegistry: false eureka.client.serviceUrl.defaultZone: ${EUREKA_DEFAULT_ZONE_URL:http://localhost:8761/eureka/} eureka.server.eviction-interval-timer-in-ms: 1000

我假设我的docker-compose.yml出了问题,但我不确定。

任何帮助我都会坚持几个小时...接近几天:(

3 个答案:

答案 0 :(得分:4)

我通过将此配置添加到发现服务的bootstrap.yml 来解决了这个问题。

spring:
  cloud:
    config:
      failFast: true
      retry:
        initialInterval: 3000
        multiplier: 1.3
        maxInterval: 5000
        maxAttempts: 20

然后将 spring-boot-starter-aop spring-retry 添加到发现服务的maven依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>${spring-boot-starter-aop.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>${spring-retry.version}</version>
</dependency>

问题是他们都是在同一时间开始。但是发现服务取决于配置服务。

当您启动发现服务时,它会一次又一次地说“从服务器提取配置”,直到配置服务启动。

配置服务启动后,发现服务将成功配置,然后它将自行启动。

答案 1 :(得分:1)

问题是所有docker容器将一起启动,但根据您的体系结构,config-service需要先启动,然后启动发现服务(eureka)。所以发现服务正在给出错误。

depends_on 在启动发现服务之前不会等待config-service“准备就绪” - 它只会等到它启动。如果您需要等待服务准备就绪,则必须使用控制启动顺序

根据建议,您可以将API /服务设置为在配置服务器启动之前的某些时间间隔内重试

虽然,我也更喜欢使用depends_on或healthcheck并控制启动顺序,如下所示:

version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres

wait-for-it.sh是一个纯粹的bash脚本,它将等待可用性。我还建议查看容器编排工具,如docker-swarm或kubernetes

答案 2 :(得分:0)

我遇到了同样的问题,并且卡住了一段时间,我准备采用与弹簧重试相同的路线,这不是一个糟糕的模式,它可以将弹性嵌入你的应用程序,但这里的主要问题是docker的启动顺序不合适。我将分享我工作的docker-compose文件,它非常相似,但这里的关键是&#34; depends_on&#34;参数。我在论证中添加了引用,似乎有效。

&#13;
&#13;
version: "2"
services:
  eureka:
    image: eurekatest
    ports:
    - "8761:8761"

  config: 
    image: config
    ports:
    - "8888:8888"
    links:
    - eureka:eureka
    depends_on:
    - "eureka"
&#13;
&#13;
&#13;