使用zuul和eureka时出现错误“负载均衡器没有客户端可用的服务器”

时间:2019-03-27 13:26:00

标签: spring-boot heroku netflix-eureka netflix-zuul netflix-ribbon

我在Heroku上有几个微服务-eureka服务器,Zuul服务器和一些应用程序服务。

当我尝试通过Zuul网关访问我的任何服务(例如“ service1”)时,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 个答案:

答案 0 :(得分:0)

最后,我找到了根本原因:) 默认情况下,所有服务都使用heroku主机名在eureka中注册(例如“ 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}

现在可以使用了。