Клиенту Eureka не удается подключиться к серверу с помощью docker

#docker #netflix-eureka

#docker #netflix-eureka

Вопрос:

Когда я запускаю zuul и eureka через Intellij, все в порядке, zuul зарегистрирован на eureka-сервере. На сервере eureka я вижу

 2019-03-15 18:00:20.727  INFO 31713 --- [nio-8761-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance ZUUL-SERVER/192.168.0.11:zuul-server:8762 with status UP (replication=false)
2019-03-15 18:00:21.309  INFO 31713 --- [nio-8761-exec-3] c.n.e.registry.AbstractInstanceRegistry  : Registered instance ZUUL-SERVER/192.168.0.11:zuul-server:8762 with status UP (replication=true)
  

Но когда я пытаюсь запустить эти две службы с помощью docker, используя docker-compose up -d в контейнере zuul, у меня возникает исключение:

 com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1051) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:965) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:414) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:269) ~[eureka-client-1.9.3.jar!/:1.9.3]
    at org.springframework.cloud.netflix.eureka.CloudEurekaClient.<init>(CloudEurekaClient.java:63) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
    at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration.eurekaClient(EurekaClientAutoConfiguration.java:290) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
    at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$8fcb0d88.CGLIB$eurekaClient$2(<generated>) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
  

spring-boot-starter-parent Является 2.1.2.RELEASE версией, а spring-cloud версии для eureka и zuul являются Greenwich.M1

eureka-файл свойств сервера:

 # Give a name to the eureka server
spring.application.name=eureka-server

# default port for eureka server
server.port=8761

# eureka by default will register itself as a client. So, we need to set it to false.
# What's a client server? See other microservices (image, gallery, auth, etc).
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
  

файл zuul-properties содержит эту строку:

 eureka.client.service-url.default-zone=http://eureka:8761/eureka/
  

файл docker-compose.yml (связанные службы)

 version: "2"

services:
  eureka:
    container_name: eureka
    build:
      context: .
      dockerfile: eureka.Dockerfile
    image: eureka-service
    ports: 
      - "8761:8761"
    networks:
      - event-network

  zuul:
    container_name: zuul
    build:
      context: .
      dockerfile: zuul.Dockerfile
    image: zuul-service
    ports: 
      - "8762:8762"
    networks:
      - event-network

networks:
  event-network:
    driver: bridge
  

В обоих файлах Dockerfile я просто добавляю jar в контейнер и запускаю jar с помощью java -jar команды. Я аннотировал основной класс zuul с помощью @EnableEurekaClient и основной класс eureka с помощью @EnableEurekaServer . Я не думаю, что это исключение связано с zuul, поскольку у меня такая же проблема с остальными моими микросервисами. Остальные из них также не могут подключиться к eureka.

Когда я запускаю eureka как в контейнере, так и через intellij, я могу получить доступ к панели мониторинга eureka. Я даже пытался поместить это изображение вместо своего, но я получил то же исключение. Я также пробовал docker exec "zuul" -it bash и внутри этого контейнера zuul я пробовал curl eureka:8761 , и я могу нормально получить доступ к панели мониторинга.

Ответ №1:

Не уверен насчет Eureka, но у него была похожая проблема с прокси-сервером nginx. Nginx не может распознать распознаватель хостов docker, и одним из возможных решений, которое я использовал, является получение статического IP-адреса службы конкретного контейнера.

В этом случае можно установить стандартный IP для контейнера Eureka и использовать его в файле конфигурации для Zuul.

Конечно, это сработает, если у вас будет один контейнер Eureca. Для многих контейнеров следует посмотреть, как zuul может читать и понимать распознаватель хоста docker.