我有一个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出了问题,但我不确定。
任何帮助我都会坚持几个小时...接近几天:(
答案 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;参数。我在论证中添加了引用,似乎有效。
version: "2"
services:
eureka:
image: eurekatest
ports:
- "8761:8761"
config:
image: config
ports:
- "8888:8888"
links:
- eureka:eureka
depends_on:
- "eureka"
&#13;