Spring Cloud Config в контейнере Docker недоступен - PullRequest
0 голосов
/ 28 января 2019

У меня относительно простая настройка.Сервер Spring Could Config и сервер Spring Cloud Eureka.(Я называю Eureka server как везде в моей конфигурации ...) Сервер конфигурации использует Git-репозиторий для поиска подходящей конфигурации.

Все находится в контейнерах Docker.Я использую docker-compose для создания своих сервисов.Сервер шлюза должен подождать, пока сервер конфигурации не появитсяНиже я приведу источник файла.

Итак, когда я собираю и запускаю контейнеры, сервер обнаружения (Eureka) не хочет запускаться.Выход за исключением.Это действительно долго, поэтому я просто добавляю самую важную часть:

019-01-27 23:52:17,494 [INFO  ] o.s.c.c.c.ConfigServicePropertySourceLocator.getRemoteEnvironment [main] – Fetching config from server at : http://tao-elszamolas-config:9001
2019-01-27 23:52:17,898 [INFO  ] o.s.c.c.c.ConfigServicePropertySourceLocator.getRemoteEnvironment [main] – Connect Timeout Exception on Url - http://tao-elszamolas-config:9001. Will be trying the next url if available
2019-01-27 23:52:17,902 [ERROR ] o.s.b.SpringApplication.reportFailure [main] – Application run failed
java.lang.IllegalStateException: Could not locate PropertySource and the fail fast property is set, failing
... Something...Something
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://tao-elszamolas-config:9001/discovery-server/prod": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:743) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:669) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:578) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.getRemoteEnvironment(ConfigServicePropertySourceLocator.java:218) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:96) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    ... 15 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:?]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[?:?]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[?:?]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[?:?]
    at java.net.Socket.connect(Socket.java:591) ~[?:?]
    at java.net.Socket.connect(Socket.java:540) ~[?:?]
    at sun.net.NetworkClient.doConnect(NetworkClient.java:182) ~[?:?]
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:474) ~[?:?]
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:569) ~[?:?]
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242) ~[?:?]
    at sun.net.www.http.HttpClient.New(HttpClient.java:341) ~[?:?]
    at sun.net.www.http.HttpClient.New(HttpClient.java:362) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1242) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1181) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1075) ~[?:?]
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1009) ~[?:?]
    at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:734) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:669) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:578) ~[spring-web-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.getRemoteEnvironment(ConfigServicePropertySourceLocator.java:218) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    at org.springframework.cloud.config.client.ConfigServicePropertySourceLocator.locate(ConfigServicePropertySourceLocator.java:96) ~[spring-cloud-config-client-2.1.0.RC3.jar!/:2.1.0.RC3]
    ... 15 more

Единственное исключение, которое я обнаружил в журнале сервера Config, - это жалоба на подключение к серверу Discovery (Eureka).Да, я пытаюсь зарегистрировать свою службу конфигурации в Eureka для поиска при запуске других микросервисов.

В соединении отказано, что означает, что сервер конфигурации не работает в тот момент, когда сервер Eureka пытается получить егоконфиг или он не прослушивает данный порт, 9001.

Как это возможно?Я использовал disabled_on в моем файле compose, так что он должен ждать этого.

Или почему он заканчивает работать?Если я делаю то же самое на локальном компьютере без докера, он продолжает пытаться подключиться к Config, пока не запустится сервер конфигурации.Я хотел бы добиться того же поведения с помощью Docker.

Любой совет будет оценен!

И, наконец, вот мои файлы конфигурации:

docker-compose.yml :

 version: "3"
   services:           
     tao-elszamolas-config:
       build: ./tao-elszamolas-config
       container_name: tao-elszamolas-config
       ports:
         - "9001:9001"
       volumes:
         - "/tao-elszamolas/logs:/var/log/tao-elszamolas"
       networks:
         - taonetwork

       tao-elszamolas-discovery:
         build: ./tao-elszamolas-discovery
         container_name: tao-elszamolas-discovery
         depends_on:
           - tao-elszamolas-config
         ports:
           - "9002:9002"
         volumes:
           - "/tao-elszamolas/logs:/var/log/tao-elszamolas"
         networks:
           - taonetwork

   networks:
     taonetwork:
       driver: bridge

Dockerfile сервера конфигурации:

 FROM openjdk:11-jdk-slim
 MAINTAINER BeszterceKK
 COPY ./tao-elszamolas-config.jar /usr/src/taoelszamolas/tao-elszamolas-config.jar
 WORKDIR /var/log/tao-elszamolas
 WORKDIR /usr/src/taoelszamolas
 ENV SPRING_PROFILES_ACTIVE prod
 EXPOSE 9001
 ENTRYPOINT ["java", "-DlogFileLocation=/var/log/tao-elszamolas", "-jar", "tao-elszamolas-config.jar"]

application.yml для сервера конфигурации:

server:
  port: 9001

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/something/something
          username: something
          password: something
          skip-ssl-validation: true
  security:
    user:
      name: something
      password: something

eureka:  
  client:
    serviceUrl:
      defaultZone: http://something:something@tao-elszamolas-discovery:9002/eureka/


info:
  artifact: tao-elszamolas-config
  name: TAO Elszamolas Config Application
  description: Tao elszamolas microservice elosztott szolgaltatas konfiguracio
  version: 1.0.0

Dockerfile сервера Discovery (Eureka):

FROM openjdk:11-jdk-slim
MAINTAINER BeszterceKK
COPY ./tao-elszamolas-discovery.jar /usr/src/taoelszamolas/tao-elszamolas-discovery.jar
WORKDIR /var/log/tao-elszamolas
WORKDIR /usr/src/taoelszamolas
ENV SPRING_PROFILES_ACTIVE prod
EXPOSE 9002
ENTRYPOINT ["java", "-DlogFileLocation=/var/log/tao-elszamolas", "-jar", "tao-elszamolas-discovery.jar"]

bootstrap.yml для сервера Discovery (Eureka):

spring:
  application:
    name: discovery-server
  cloud:
    config:
      fail-fast: true
      name: discovery-server
      uri: http://tao-elszamolas-config:9001
      username: something
      password: something

application.yml для сервера Discovery (Eureka):

server:
  port: 9002

eureka:
  instance:
    hostname: tao-elszamolas-discovery
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://tao-elszamolas-discovery:9002/eureka

info:
  artifact: tao-elszamolas-discovery
  name: TAO Elszamolas Eureka Szolgaltatas monitor
  description: Tao elszamolas automatikus szolgaltatas regisztracio
  version: 1.0.0

И наконец, вот как я запускаю свои контейнеры.Это просто:

docker-compose up -d

Весь стек приложений работает локально без Docker.Так что, я думаю, проблема в моей конфигурации Docker.

Еще одна вещь, о которой стоит упомянуть, как правило, я не хочу публиковать порты для размещения, а только выставлять их в моей пользовательской сети между контейнерами.Вот почему я попытался заменить PORTS на EXPOSE , но это не помогло.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы registry служба пытаетесь запустить до configuration службы.Вы должны заставить его ждать.Вы можете сделать это с помощью condition: service_started, как показано ниже.Но я думаю, что это не работает с версией 3

version: '2.1'

# ...

tao-elszamolas-discovery:
    build: ./tao-elszamolas-discovery
    container_name: tao-elszamolas-discovery
    depends_on:
        - tao-elszamolas-config:
            condition: service_started
    ports:
        - "9002:9002"
    volumes:
        - "/tao-elszamolas/logs:/var/log/tao-elszamolas"
    networks:
        - taonetwork

Решение для версии 3 заключается в использовании healthcheck и restart: on-failure Посмотрите наthis post

Другое решение - использовать секцию entrypoint для запуска пакетного файла при запуске, который проверяет служебный контейнер configuration, пока он не отвечает.

0 голосов
/ 28 января 2019

для запуска Compose не ждет, пока контейнер будет «готов» (что бы это ни значило для вашего конкретного приложения) - только до тех пор, пока он не будет запущен

Итак, вы должны обратиться: https://docs.docker.com/compose/startup-order/

для ожидания, пока контейнер сервера конфигурации сначала не будет готов (уже прослушен на порте 9001), затем запустит контейнер сервера Eureka.

...