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?