Не удается получить файлы конфигурации при запуске ConfigServer и EurekaServer в док-контейнере - PullRequest
0 голосов
/ 03 мая 2018

[Пружинные загрузочные микросервисы]

У меня в микросервисе есть 2 сервиса: ConfigService и DiscoveryService

  • ConfigService включен ConfigServer, сохранить файлы конфигурации для микросервиса
  • DiscoveryService - это EurekaServer. Он получит файл конфигурации от ConfigService

При запуске 2 сервиса на локальном (не на докере) все хорошо

Fetching config from server at: http://localhost:8088
Located environment: name=epl-discovery-service, profiles=[default], label=null, version=3f6887b5b355381341e02ad03615f2415d6a566d, state=null
Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='configClient'}, MapPropertySource {name='https://github.com/stomer90/epl-config-server.git/epl-discovery-service.yml'}]}
No active profile set, falling back to default profiles: default

но при запуске службы 2 на 2 контейнера (докер) ConfigService работает нормально, но DiscoveryService имеет некоторая ошибка (не удается подключиться к ConfigService)

Fetching config from server at: http://localhost:8088
Could not locate PropertySource: I/O error on GET request for "http://localhost:8088/epl-discovery-service/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
No active profile set, falling back to default profiles: default
  • ConfigService

EplConfigServiceApplication.java

Blockquote

@SpringBootApplication
@EnableConfigServer
public class EplConfigServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(EplConfigServiceApplication.class, args);
    }
}

bootstrap.yml

server:
  port: 8088

 spring:
  application:
    name: eplconfigserver

  cloud:
    config:
      server:
        git:
          uri: https://github.com/stomer90/epl-config-server.git

Dockerfile

FROM openjdk:8-jdk-alpine

MAINTAINER Phong Nguyen

VOLUME /tmp

# Add Spring Boot app.jar to Container
ADD ./target/epl-config-service-0.0.1-SNAPSHOT.jar app.jar

RUN sh -c 'touch /app.jar'

ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar " ]

* DiscoveryService

EplDiscoveryServiceApplication.java

@SpringBootApplication
@EnableEurekaServer
public class EplDiscoveryServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(EplDiscoveryServiceApplication.class, args);
    }
}

bootstrap.yml

spring:
  application:
    name: epl-discovery-service
  cloud:
    config:
      uri: http://localhost:8088

Dockerfile

FROM openjdk:8-jdk-alpine

MAINTAINER Phong Nguyen

VOLUME /tmp

# Add Spring Boot app.jar to Container
ADD ./target/epl-discovery-service-0.0.1-SNAPSHOT.jar app.jar

RUN sh -c 'touch /app.jar'

ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
  • Докер-compose.yml
version: '3.1'

services:
  epl-config-service:
    build: ./epl-config-service
    ports:
      - "8088:8088"
    restart:
      unless-stopped


  epl-discovery-service:
    build: ./epl-discovery-service
    ports:
      - "8061:8061"
    environment:
      - REGISTRY_HOST=epl-config-service
    depends_on:
      - epl-config-service
    restart:
      unless-stopped

Исходный код ссылки: https://github.com/stomer90/epl-spring-cloud-microservice

Пожалуйста, помогите мне решить эту проблему

1 Ответ

0 голосов
/ 04 мая 2018

Таким образом, вы правильно указали порядок, в котором должен запускаться контейнер, но это не гарантирует, что предыдущий контейнер (в вашем случае сервер конфигурации работоспособен или нет), так как версия ur docker-compose 3.1. Вы можете определить проверки здоровья в вашем файле композиции

например:

 registry:
    build:
      context: ../service-registry
      dockerfile: Dockerfile
    container_name: registry
    links:
      - configuration-server
    depends_on:
      configuration-server:
         condition: service_healthy

и

 configuration-server:
build:
  context: ../configuration-server
  dockerfile: Dockerfile
image: xyz/configuration-server
container_name: configuration-server
environment:
  - SPRING_PROFILES_ACTIVE=dev
  - SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKER=kafka
  - SPRING_CLOUD_STREAM_KAFKA_BINDER_BROKER_PORT=9092
  - SPRING_CLOUD_STREAM_KAFKA_BINDER_ZKNODE=zookeeper
  - SPRING_CLOUD_STREAM_KAFKA_BINDER_ZKPORT=2181
depends_on:
  kafka:
    condition: service_healthy
  zookeeper:
    condition: service_healthy
healthcheck:
    test: "exit 0"

обратите внимание на проверку работоспособности на сервере конфигурации, которая будет вызываться с сервера реестра (условие: служба исправна) Вы можете реализовать свою собственную проверку работоспособности для чего-то более сложного, такого как

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

см. Это: https://docs.docker.com/compose/compose-file/compose-file-v2/#healthcheck

Я думаю, этого должно быть достаточно, чтобы запустить ваши контейнеры, дайте мне знать, если это работает

...