Ошибка «У балансировщика нагрузки нет доступного сервера для клиента» при использовании zuul и eureka - PullRequest
1 голос
/ 27 марта 2019

У меня есть несколько микросервисов на Heroku - eureka-сервер, Zuul-сервер и некоторые сервисы приложений.

Хотя я пытаюсь получить доступ к любой из моих служб, например, «service1» через шлюз Zuul, Zuul не может переслать запрос соответствующей службе (когда я пытаюсь запустить их локально, все работает нормально). Я нашел следующие ошибки в логах Zuul:

com.netflix.zuul.exception.ZuulException: Forwarding error 
Caused by: com.netflix.client.ClientException: Load balancer does not have the available server for the client: service1

Ниже приведены конфигурации моих услуг:

1) "сервер zuul" application.yml

server:
  port: ${PORT:8000}

zuul:
  prefix: /api
  ignoredServices: '*'
  routes:
    service1:
      path: /path_for_service1/**
      serviceId: service1
      strip-prefix: false
   ...

management:
  endpoints:
    web:
      exposure:
        include: "*"

eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URL:http://localhost:5000}/eureka/

2) "сервер eureka" application.yml

server:
  port: ${PORT:5000}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.1) "service1" application.yml

server.port=${PORT:8081}
eureka.client.service-url.defaultZone=${EUREKA_URL:http://localhost:5000}/eureka/

3.2) "service1" bootstrap.yml

spring:
  application:
    name: service1

Все микросервисы видны на приборной панели eureka.

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

zuul:
  prefix: /api
  ignoredServices: '*'
  routes:
    service1:
      path: /path_for_service1/**
      url: http://url_of_service_1
      strip-prefix: false

Не могли бы вы помочь мне с этим вопросом?

1 Ответ

1 голос
/ 15 апреля 2019

Наконец-то я нашел основную причину :) Все сервисы зарегистрированы в eureka с использованием имени хоста heroku по умолчанию (например, «085930c7-b893-4b34-88a7-6e37fbe7fa0f»), которое недоступно снаружи. Но услуги доступны по доменным именам. Поэтому я просто добавил настройки доменного имени в application.properties каждого сервиса (https://blog.heroku.com/managing_your_microservices_on_heroku_with_netflix_s_eureka)

eureka:
  instance:
    non-secure-port: 80
    hostname: ${DOMAIN_NAME}

и теперь это работает.

...