[英]Spring Cloud Config Server not working with Docker compose
我有一個spring cloud配置服務器並將其打包為docker圖像然后我有spring spring eureka服務器,它也被打包為docker image。
當我使用docker compose運行兩個時,我得到以下錯誤。
discovery-service_1 | 2017-06-24 15:36:12.059 INFO 5 --- [ main] cccConfigServicePropertySourceLocator : Fetching config from server at: http://config-service:9001 discovery-service_1 | 2017-06-24 15:36:12.997 WARN 5 --- [ main] cccConfigServicePropertySourceLocator : 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 compose文件是這個 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有問題,但我不確定。
任何幫助,我會堅持這幾個小時......接近幾天:(
我通過將此配置添加到發現服務的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>
問題是它們都是在同一時間開始的。 但是發現服務取決於配置服務。
當您啟動發現服務時,它會一次又一次地說“ 從服務器獲取配置 ”,直到配置服務啟動。
配置服務啟動后,發現服務將成功獲得其配置 ,然后它將自行啟動。
問題是所有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這樣的容器編排工具 。
我遇到了同樣的問題,並且卡住了一段時間,我打算采用與彈簧重試相同的路線,這不是一個糟糕的模式,它可以將彈性嵌入到您的應用程序中,但主要問題這里是碼頭工人的發射順序不合適。 我將分享我的工作docker-compose文件,它非常相似,但這里的關鍵是“depends_on”參數。 我在我的論點上添加了引用,似乎有效。
version: "2" services: eureka: image: eurekatest ports: - "8761:8761" config: image: config ports: - "8888:8888" links: - eureka:eureka depends_on: - "eureka"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.