0

I'm trying to create spring boot microservices project with netflix libraries. GET Request (http://localhost:8005/api/video-service/video) causes error:

com.netflix.zuul.exception.ZuulException: Forwarding error
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException(RibbonRoutingFilter.java:198) ~[spring-cloud-netflix-zuul-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:173) ~[spring-cloud-netflix-zuul-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:119) ~[spring-cloud-netflix-zuul-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117) ~[zuul-core-1.3.1.jar:1.3.1]
    at com.netflix.zuul.FilterProcessor.processZuulFilter(FilterProcessor.java:193) ~[zuul-core-1.3.1.jar:1.3.1]
    at com.netflix.zuul.FilterProcessor.runFilters(FilterProcessor.java:157) ~[zuul-core-1.3.1.jar:1.3.1]
    at com.netflix.zuul.FilterProcessor.route(FilterProcessor.java:118) ~[zuul-core-1.3.1.jar:1.3.1]
    at com.netflix.zuul.ZuulRunner.route(ZuulRunner.java:96) ~[zuul-core-1.3.1.jar:1.3.1]
    at com.netflix.zuul.http.ZuulServlet.route(ZuulServlet.java:116) ~[zuul-core-1.3.1.jar:1.3.1]
    at com.netflix.zuul.http.ZuulServlet.service(ZuulServlet.java:81) ~[zuul-core-1.3.1.jar:1.3.1]

Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: player-service
    at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:483) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
    at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.3.0.jar:2.3.0]
    at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]

Discovery server:

@SpringBootApplication
@EnableEurekaServer
public class EurekaDiscoveryApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaDiscoveryApplication.class, args);
    }

}
spring.application.name=discovery-service
server.port=8000

#By default, the registry will also attempt to register itself
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.instance.hostname=localhost
eureka.server.enable-self-preservation=true
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

management.endpoints.web.exposure.include=*
management.endpoints.actuator.enabled=true
management.health.defaults.enabled=false
management.security.enabled=false

Gateway server:

I also tried using @EnableEurekaClient.

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

}

Setting ribbon property to false has no effect.

spring.application.name=gateway-service
server.port=8005
eureka.instance.hostname=localhost
eureka.instance.preferIpAddress=true
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
eureka.client.registerWithEureka=true
eureka.client.fetch-registry=true

zuul.prefix=/api
ribbon.eureka.enabled=true
zuul.routes.video-service.path=/video-service/**
zuul.routes.video-service.serviceId=video-service

Client server:

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientPlayerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientPlayerApplication.class, args);
    }

}
@RestController
@RequestMapping("video")
public class PlayerController {

    @GetMapping
    public String get() {
        return "string";
    }

}
spring.application.name=video-service
server.port=8003
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true

eureka.instance.hostname=localhost

It works when I set below poperty in zuul properties:

zuul.routes.video-service.url=http://localhost:8003/

I know it's common problem and I tried with multiple solutions from similar questions, but nothing works. Could you help?

Logan
  • 113
  • 8
  • Does this answer your question? [Load balancer does not have available server for client](https://stackoverflow.com/questions/41401009/load-balancer-does-not-have-available-server-for-client) – Alexey Osetsky Jun 20 '21 at 20:53
  • Not quite. It works when I set video-service.ribbon.listOfServers in gateway-service, but ports and number of instances will be changing dynamically. – Logan Jun 21 '21 at 21:56

0 Answers0