The load balancer does not have an available server for the client.

I am trying to use the Feign client. Below is my client:

import com.eprogrammerz.examples.domain.Movie; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Created by Yogen on 12/26/2016. */ @FeignClient(name = "movie-api") public interface MovieApi { @RequestMapping(method = RequestMethod.GET, value = "/movies/{id}") Movie getMovie(@PathVariable("id") Long id); } 

I am calling from a simple service as shown below:

 @Service public class MovieService { @Autowired MovieApi movieApi; public Movie findMovie(Long id){ Movie movieOfTheDay = movieApi.getMovie(id); return movieOfTheDay; } } 

My spring boot application is shown below:

 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.netflix.feign.EnableFeignClients; @EnableFeignClients(basePackages = {"com.eprogrammerz.examples"}) @EnableCircuitBreaker @SpringBootApplication public class ClientAppApplication { public static void main(String[] args) { SpringApplication.run(ClientAppApplication.class, args); } } 

build.gradle

 buildscript { ext { springBootVersion = '1.4.3.RELEASE' } repositories { jcenter() mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' jar { baseName = 'client-app' version = '0.0.1-SNAPSHOT' } sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { jcenter() mavenCentral() maven { url "https://repo.spring.io/snapshot" } maven { url "https://repo.spring.io/milestone" } } dependencies { compile('org.springframework.cloud:spring-cloud-starter-feign') // https://mvnrepository.com/artifact/com.netflix.hystrix/hystrix-core compile('org.springframework.cloud:spring-cloud-starter-hystrix') compile("org.springframework.boot:spring-boot-starter-web"){ exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } compileOnly('org.projectlombok:lombok') testCompile('org.springframework.boot:spring-boot-starter-test') } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:Camden.BUILD-SNAPSHOT" mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}" } } 

I get an error as shown below:

 2016-12-30 13:07:16.894 INFO 6748 --- [nio-8082-exec-1] osweb.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 39 ms 2016-12-30 13:07:16.939 INFO 6748 --- [nio-8082-exec-1] ceecontrollers.RequestController : Calling findMovie(1203) 2016-12-30 13:07:17.240 INFO 6748 --- [rix-movie-api-1] scaAnnotationConfigApplicationContext : Refreshing org.spring framework.context.annotation.AnnotationConfigApplicationContext@ 547496c2: startup date [Fri Dec 30 13:07:17 EST 2016]; parent: org.springframework.boot .context.embedded.AnnotationConfigEmbeddedWebApplicationContext@ 542e560f 2016-12-30 13:07:17.318 INFO 6748 --- [rix-movie-api-1] faAutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring 2016-12-30 13:07:17.619 INFO 6748 --- [rix-movie-api-1] c.netflix.config.ChainedDynamicProperty : Flipping property: movie-api.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647 2016-12-30 13:07:17.670 INFO 6748 --- [rix-movie-api-1] cnuconcurrent.ShutdownEnabledTimer : Shutdown hook installed for: NFLoadBalancer-PingTimer-movie-api 2016-12-30 13:07:17.727 INFO 6748 --- [rix-movie-api-1] c.netflix.loadbalancer.BaseLoadBalancer : Client:movie-api instantiated a LoadBalancer:DynamicServerListLoadBalancer:{NFLoadBalancer:name=movie-api,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null 2016-12-30 13:07:17.739 INFO 6748 --- [rix-movie-api-1] cnlDynamicServerListLoadBalancer : Using serverListUpdater PollingServerListUpdater 2016-12-30 13:07:17.746 INFO 6748 --- [rix-movie-api-1] cnlDynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client movie-api initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=movie-api,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList: com.netflix.loadbalancer.ConfigurationBasedServerList@45bcfd5 2016-12-30 13:07:18.191 ERROR 6748 --- [nio-8082-exec-1] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: MovieApi#getMovie(Long) failed and no fallback available.] with root cause com.netflix.client.ClientException: Load balancer does not have available server for client: movie-api at com.netflix.loadbalancer.LoadBalancerContext.getServerFromLoadBalancer(LoadBalancerContext.java:468) ~[ribbon-loadbalancer-2.2.0.jar:2.2.0] at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:184) ~[ribbon-loadbalancer-2.2.0.jar:2.2.0] at com.netflix.loadbalancer.reactive.LoadBalancerCommand$1.call(LoadBalancerCommand.java:180) ~[ribbon-loadbalancer-2.2.0.jar:2.2.0] at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:94) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeConcatMap.call(OnSubscribeConcatMap.java:42) ~[rxjava-1.1.10.jar:1.1.10] at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber$1.call(OperatorRetryWithPredicate.java:127) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:73) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.schedule(TrampolineScheduler.java:52) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:79) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OperatorRetryWithPredicate$SourceSubscriber.onNext(OperatorRetryWithPredicate.java:45) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:276) ~[rxjava-1.1.10.jar:1.1.10] at rx.Subscriber.setProducer(Subscriber.java:209) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:138) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:129) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.Observable.subscribe(Observable.java:10307) ~[rxjava-1.1.10.jar:1.1.10] at rx.Observable.subscribe(Observable.java:10274) ~[rxjava-1.1.10.jar:1.1.10] at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:445) ~[rxjava-1.1.10.jar:1.1.10] at rx.observables.BlockingObservable.single(BlockingObservable.java:342) ~[rxjava-1.1.10.jar:1.1.10] at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:102) ~[ribbon-loadbalancer-2.2.0.jar:2.2.0] at org.springframework.cloud.netflix.feign.ribbon.LoadBalancerFeignClient.execute(LoadBalancerFeignClient.java:63) ~[spring-cloud-netflix-core-1.2.4.BUILD-SNAPSHOT.jar:1.2.4.BUILD-SNAPSHOT] at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:97) ~[feign-core-9.3.1.jar:na] at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-9.3.1.jar:na] at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108) ~[feign-hystrix-9.3.1.jar:na] at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:301) ~[hystrix-core-1.5.6.jar:1.5.6] at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:297) ~[hystrix-core-1.5.6.jar:1.5.6] at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.1.10.jar:1.1.10] at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.10.jar:1.1.10] at rx.Observable.unsafeSubscribe(Observable.java:10211) ~[rxjava-1.1.10.jar:1.1.10] at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) ~[rxjava-1.1.10.jar:1.1.10] at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56) ~[hystrix-core-1.5.6.jar:1.5.6] at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47) ~[hystrix-core-1.5.6.jar:1.5.6] at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69) ~[hystrix-core-1.5.6.jar:1.5.6] at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) ~[rxjava-1.1.10.jar:1.1.10] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_51] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_51] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_51] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_51] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_51] 

I tried a different way. But could not find a solution. I could not find any information about this on Spring Cloud Netflix . I also could not find any information in the thread of the discussion thread .

What am I missing here? TIA.

Additional information:

application.yml for microservice movie-api:

 server: port: 8090 logging: config: classpath:log4j2.yml spring: application: name: movie-api 

Spring boot application for movie-api module:

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

And the controller as below:

 @RestController @Slf4j public class MovieController { @Autowired private MovieRepository movieRepository; @RequestMapping("/movies/{id}") public ResponseEntity<Movie> getBook(@PathVariable("id") Long id){ log.trace("getBook({})",id); Optional<Movie> movie = Optional.of(movieRepository.findOneById(id)); if(movie.isPresent()) return new ResponseEntity(movie.get(), HttpStatus.OK); return new ResponseEntity<Movie>(HttpStatus.NOT_FOUND); } } 
+16
source share
5 answers

After conducting research and using @Bloodysock, I found that I did not have enough remote server registration in the client-application microservice. The document is located in Spring Cloud Netflix .

I used the tape without Eureka with the configuration in application.yml in the client-app 'microservice as:

 movie-api: ribbon: listOfServers: http://localhost:8090 
+23
source

The problem is that your service does not know the host of the requested service. If you are using Eureka, put this line in a .properties or .yml file:

eureka.client.fetchRegistry=true

OR

 eureka: client: fetchRegistry: true 

He will force your service to talk to Eureka and find the host of the requested service.

+10
source

If the Spring Cloud configuration does not support specifying servers in application.properties /application.yml, you must configure the services URL in the configuration class.

Please pay attention to the warning in my application.properties [Spring Boot v2.0.0RELEASE, spring-cloud-starter-feign & spring-cloud-starter-tape v 1.4.3. RELEASE]

enter image description here

Therefore, I wrote the following configuration class:

 @Configuration class LocalRibbonClientConfiguration { @Bean public ServerList<Server> ribbonServerList() { // return new ConfigurationBasedServerList(); StaticServerList<Server> staticServerList = new StaticServerList<>((new Server("localhost", 8001)), new Server("localhost", 8000)); return staticServerList; } } 

Then configured the Spring Boot application to use this configuration as follows:

 @SpringBootApplication @EnableFeignClients("my-package.currencyconversionservice") @RibbonClient(name = "currency-conversion-service", configuration = LocalRibbonClientConfiguration.class) public class CurrencyConversionServiceApplication { // nothing new here... } 

No need to change the Feign Proxy class. Publication only so that this post serves as a complete solution to the problem:

 @FeignClient(name="currency-exchange-service") @RibbonClient(name="currency-exchange-service") public interface CurrencyExchangeServiceProxy { @GetMapping("/currency-exchange/from/{from}/to/{to}") public CurrencyConversionBean retrieveExchangeValue(@PathVariable("from") String from, @PathVariable("to") String to); } 

It's all. The problem has been fixed.

+2
source

I almost lost 2 hours to find the reason. I mistakenly imported EnableEurekaClient into a client application, which was the main cause of the problem. I finally solved this problem by removing the import. To my surprise, @EnableDiscoveryClient does not require the dependency below. But if you are using an Eureka Naming server, then this must be used.

  <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.0.0.RELEASE</version> </dependency> 
+1
source

Make sure your ribbion client is correct.

 package com.in28minutes.microservices.currencyconversionservice; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @FeignClient(name="currency-exchange-service") @RibbonClient(name="currency-exchange-service") public interface CurrencyExchangeServiceProxy { @GetMapping("/currency-exchange/from/{from}/to/{to}") public CurrencyConversionBean retrieveExchangeValue (@PathVariable("from") String from, @PathVariable("to") String to); //mention correct pathvariables } 
0
source

Source: https://habr.com/ru/post/1013650/


All Articles