Spring-cloud-netflix: Zuul Load balancer does not have available server for client

Created on 28 Dec 2017  路  6Comments  路  Source: spring-cloud/spring-cloud-netflix

I've been trying to connect microservices using Zuul and Eureka and have succeeded for the most part except re-routing through Zuul based on serviceId. What I have is Spring Boot Zuul and Eureka applications, and a Node-based microservice which registers with Eureka. Both Zuul and the microservice are registered with Eureka and show up on the Eureka control panel, however, when I try to route through Zuul to the microservice I get the following exception:

com.netflix.zuul.exception.ZuulException: Forwarding error
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: steam-auth-service

Routing through IP seems to work, but I don't need that.

Zuul application.properties:

server.port=8079
eureka.client.service-url.defaultZone=http://localhost:8088/eureka
zuul.routes.steam-auth-service.serviceId=steam-auth-service
zuul.routes.steam-auth-service.path=/steam/**

Node.JS Eureka client registration:

// Discovery service info
const eurekaServer = {
  host: process.env.EUREKA_HOST,
  port: process.env.EUREKA_PORT,
  servicePath: '/eureka/apps/',
};

// Client to connect to Eureka discovery service
const eurekaClient = new Eureka({
  instance: {
    app: 'steam-auth-service',
    hostName: 'localhost',
    ipAddr: '127.0.0.1',
    port: {
      $: process.env.PORT,
      '@enabled': true,
    },
    vipAddress: 'steamauth.pubgtrade.com',
    dataCenterInfo: {
      '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
      name: 'MyOwn',
    },
  },
  eureka: eurekaServer,
});

As I said, both the Zuul application and the microservices are registered with Eureka and show up in the control panel.

/eureka/apps response:

<applications>
<versions__delta>1</versions__delta>
<apps__hashcode>UP_2_</apps__hashcode>
<application>
<name>STEAM-AUTH-SERVICE</name>
<instance>
<hostName>localhost</hostName>
<app>STEAM-AUTH-SERVICE</app>
<ipAddr>127.0.0.1</ipAddr>
<status>UP</status>
<overriddenstatus>UNKNOWN</overriddenstatus>
<port enabled="true">3001</port>
<securePort enabled="false">7002</securePort>
<countryId>1</countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>
<leaseInfo>
<renewalIntervalInSecs>30</renewalIntervalInSecs>
<durationInSecs>90</durationInSecs>
<registrationTimestamp>1514334766260</registrationTimestamp>
<lastRenewalTimestamp>1514334886300</lastRenewalTimestamp>
<evictionTimestamp>0</evictionTimestamp>
<serviceUpTimestamp>1514333831189</serviceUpTimestamp>
</leaseInfo>
<metadata class="java.util.Collections$EmptyMap"/>
<vipAddress>steamauth.pubgtrade.com</vipAddress>
<isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
<lastUpdatedTimestamp>1514334766260</lastUpdatedTimestamp>
<lastDirtyTimestamp>1514334766260</lastDirtyTimestamp>
<actionType>ADDED</actionType>
</instance>
</application>
<application>
<name>PUBG-API-GATEWAY</name>
<instance>
<instanceId>192.168.0.13:pubg-api-gateway:8079</instanceId>
<hostName>192.168.0.13</hostName>
<app>PUBG-API-GATEWAY</app>
<ipAddr>192.168.0.13</ipAddr>
<status>UP</status>
<overriddenstatus>UNKNOWN</overriddenstatus>
<port enabled="true">8079</port>
<securePort enabled="false">443</securePort>
<countryId>1</countryId>
<dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
<name>MyOwn</name>
</dataCenterInfo>
<leaseInfo>
<renewalIntervalInSecs>30</renewalIntervalInSecs>
<durationInSecs>90</durationInSecs>
<registrationTimestamp>1514334380413</registrationTimestamp>
<lastRenewalTimestamp>1514334890454</lastRenewalTimestamp>
<evictionTimestamp>0</evictionTimestamp>
<serviceUpTimestamp>1514334380413</serviceUpTimestamp>
</leaseInfo>
<metadata>
<management.port>8079</management.port>
<jmx.port>36983</jmx.port>
</metadata>
<homePageUrl>http://192.168.0.13:8079/</homePageUrl>
<statusPageUrl>http://192.168.0.13:8079/info</statusPageUrl>
<healthCheckUrl>http://192.168.0.13:8079/health</healthCheckUrl>
<vipAddress>pubg-api-gateway</vipAddress>
<secureVipAddress>pubg-api-gateway</secureVipAddress>
<isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
<lastUpdatedTimestamp>1514334380413</lastUpdatedTimestamp>
<lastDirtyTimestamp>1514334380381</lastDirtyTimestamp>
<actionType>ADDED</actionType>
</instance>
</application>
</applications>

I looked through closed issues with the same title but they had some sort of code missing which is present in my applications. Again, both Zuul and my microservice show up in the Eureka control panel, and I can get Zuul's address in my microservice. Zuul, however, fails to recognize when trying to route through serviceId. Any tips?

Most helpful comment

Solved!! I was wrong, it's not a problem between eureka-js-client and ribbon, its just a service with not te correct configuration.
An instanceId and a vipAddress is needed

const eureka = new Eureka({
  instance: {
    id: 'node-simple-service',    
    instanceId: 'node-simple-service',
    app: 'node-simple-service',
    hostName: 'localhost',
    ipAddr: '127.0.0.1',
    statusPageUrl: 'http://localhost:8200',
    port: {
      '$': SERVER_PORT,
      '@enabled': 'true',
    },
    vipAddress: 'node-simple-service',
    dataCenterInfo: {
      '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
      name: 'MyOwn',
    }
  },
  eureka: {
    host: 'localhost',
    port: 8761,
    servicePath: '/eureka/apps/'
  }
});

All 6 comments

Eureka actually routes using vipaddress.

@spencergibb I tried adding the service vipAddress as serviceId in Zuul, still no luck. Anything else that might cause the issue?

Hi @andrej-naumovski . Have you solved this issue? I am facing a similar problem.

Hi all!
I'm also facing the same issue. I didn't found any solution on the internet for this problem...
I think it's a problem with the registration of eureka-js-client and ribbon(zuul's load balancer).
I debugged it and see that the nodejs microservices don't have a loadBalancerKey in the method getServerFromLoadBalancer in the class LoadBalancerContext.
Maybe the solution could be find the exact issue between eureka-js-client and zuul or enable some kind of functionality to disable load balancing for some microservices, but just saying.
This repository https://github.com/cleversonledur/springcloud-netflixoss-project from @cleversonledur is a very good example to reproduce the error.
Thanks in advance

We don't maintain eureka-js-client

Solved!! I was wrong, it's not a problem between eureka-js-client and ribbon, its just a service with not te correct configuration.
An instanceId and a vipAddress is needed

const eureka = new Eureka({
  instance: {
    id: 'node-simple-service',    
    instanceId: 'node-simple-service',
    app: 'node-simple-service',
    hostName: 'localhost',
    ipAddr: '127.0.0.1',
    statusPageUrl: 'http://localhost:8200',
    port: {
      '$': SERVER_PORT,
      '@enabled': 'true',
    },
    vipAddress: 'node-simple-service',
    dataCenterInfo: {
      '@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
      name: 'MyOwn',
    }
  },
  eureka: {
    host: 'localhost',
    port: 8761,
    servicePath: '/eureka/apps/'
  }
});
Was this page helpful?
0 / 5 - 0 ratings