簡體   English   中英

Spring Cloud Config Server無法使用Docker撰寫

[英]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-aopspring-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM