로드 밸런서에 클라이언트에 사용 가능한 서버가 없습니다.
Feign 클라이언트를 사용하려고 합니다.다음은 나의 피어링 클라이언트입니다.
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);
}
아래와 같은 간단한 서비스로 전화를 드립니다.
@Service
public class MovieService {
@Autowired
MovieApi movieApi;
public Movie findMovie(Long id){
Movie movieOfTheDay = movieApi.getMovie(id);
return movieOfTheDay;
}
}
스프링 부트 앱은 다음과 같습니다.
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}"
}
}
다음과 같은 오류가 발생합니다.
2016-12-30 13:07:16.894 INFO 6748 --- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 39 ms
2016-12-30 13:07:16.939 INFO 6748 --- [nio-8082-exec-1] c.e.e.controllers.RequestController : Calling findMovie(1203)
2016-12-30 13:07:17.240 INFO 6748 --- [rix-movie-api-1] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.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] f.a.AutowiredAnnotationBeanPostProcessor : 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] c.n.u.concurrent.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] c.n.l.DynamicServerListLoadBalancer : Using serverListUpdater PollingServerListUpdater
2016-12-30 13:07:17.746 INFO 6748 --- [rix-movie-api-1] c.n.l.DynamicServerListLoadBalancer : 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] o.a.c.c.C.[.[.[/].[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]
나는 다른 방법을 시도했다.하지만 해결책을 찾을 수 없었다.Spring Cloud Netflix에서도 이에 대한 정보를 찾을 수 없었습니다.StackOverflow에서도 토론 스레드에 대한 정보를 찾을 수 없었습니다.
내가 뭘 놓쳤지?TIA.
상세:
application.yml for movie-api 마이크로 서비스는 다음과 같습니다.
server:
port: 8090
logging:
config: classpath:log4j2.yml
spring:
application:
name: movie-api
movie-api 모듈의 스프링 부트 앱:
@SpringBootApplication
public class MovieApiApplication {
public static void main(String[] args) {
SpringApplication.run(MovieApiApplication.class, args);
}
}
컨트롤러는 다음과 같습니다.
@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);
}
}
조사를 하고 @Bloodysock의 도움을 받아 확인한 결과, 'client-app' 마이크로 서비스에 원격 서버 등록이 누락되어 있었습니다.이 문서는 Spring Cloud Netflix에 있습니다.
없는 은 유레카, 유레카 없는 리본으로 했습니다.application.ymlclient-app★★★★★★★★★★★★★★★★★★★:
movie-api:
ribbon:
listOfServers: http://localhost:8090
문제는 서비스가 요청된 서비스의 호스트를 인식하지 못한다는 것입니다.Eureka를 사용하는 경우 .properties 파일에 다음 행을 추가합니다.
eureka.client.fetchRegistry=true
또는 .yml 파일:
eureka:
client:
fetch-registry: true
그러면 서비스가 Eureka와 대화하고 요청된 서비스의 호스트를 찾을 수 있습니다.
근본 원인을 찾기 위해 2시간이나 허비할 뻔했어요.클라이언트 어플리케이션에서 Enable Eureka Client를 잘못 Import한 것이 문제의 근본 원인입니다.Import를 삭제하여 이 문제를 해결했습니다.놀랍게도 @EnableDiscoveryClient는 다음과 같은 의존관계를 필요로 하지 않습니다.단, Eureka Naming 서버를 사용하는 경우에는 이 서버를 사용해야 합니다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
Spring Cloud 셋업에서 application.properties/application.yml 내의 서버 지정을 지원하지 않는 경우 Configuration클래스에서 서비스 URL을 설정해야 합니다.
application.properties [Spring Boot v2.0.0]의 경고 메시지를 적어 둡니다.릴리즈, 봄 클라우드 스타팅 및 봄 클라우드 스타팅 리본 버전 1.4.3.릴리스]
그래서 다음과 같이 Configuration클래스를 작성했습니다.
@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;
}
}
다음으로 이 설정을 사용하도록 Spring Boot Application을 다음과 같이 설정했습니다.
@SpringBootApplication
@EnableFeignClients("my-package.currencyconversionservice")
@RibbonClient(name = "currency-conversion-service", configuration = LocalRibbonClientConfiguration.class)
public class CurrencyConversionServiceApplication {
// nothing new here...
}
Feign Proxy 클래스를 변경할 필요가 없습니다.문제의 완전한 해결 방법으로서 이 투고만을 목적으로 한 투고:
@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);
}
그게 다예요.문제는 해결되었다.
Zuul 게이트웨이의 application.properties 파일에 이 행을 추가합니다.
movie-api.ribbon.listOfServers=movie://localhost:8080
일반적으로 - {{name-of-service}}.ribbon.listOfServers=subl-of-service}
이건 나한테 효과가 있었어.
문제는 서비스가 요청된 서비스의 호스트를 인식하지 못한다는 것입니다.Eureka 및 zuul을 사용하는 경우 zuul .properties 또는 .yml 파일에 다음 행을 추가합니다.
Eureka.클라이언트fetch-module=true
그런 것 같다ClientAppApplication는, 유레카 서버의 주소를 모릅니다.applation.yml을 확인할 수 있습니다.
eureka
instance:
hostname: cloud-feignorder-consume
client:
register-with-eureka: false #default true
fetch-registry: true #default true
마지막 행은 속성 'eureka.client'를 확인해야 합니다.fetch-fail'을 클릭합니다.사실인지 아닌지는 확실합니다.그러면 클라이언트는 Eureka 서버에서 서버 목록을 가져올 수 있습니다.
클라이언트 앱에 application.properties 파일이 아닌 application.yml 파일이 없는 경우 클라이언트 앱을 재시작하기 전에 다음과 같이 속성을 설정할 수 있습니다.
currency-exchange-service.ribbon.listOfServers : http://localhost:8000, http://localhost:8001
저는 이 오류에 직면했고, 구글이 처음으로 반환하는 질문이기 때문에 이 질문에 제 의견을 덧붙이고 싶습니다.도움이 됐으면 좋겠다.
프로젝트에서는 스프링 부트를 사용하고 있습니다.2.3.4.REALEASE및 Eureka 클라이언트3.1.3제 사례를 해결한 것은 Eureka Client를 버전으로 바꾼 것입니다.2.1.6.RELEASE.
나는 어떤 이유로든 최신 버전이 Spring의 이전 버전을 깨는 것이라고 믿는다.
이 시점에서 제 프로젝트를 체크할 수 있습니다.
https://github.com/mahonrimaia/course-microservices/tree/08e1db607729d37752bac5c68cd98c4a7dbfe20d
Eureka Client와 함께 Ribbon을 추가해야 합니다.그렇지 않으면 서비스를 가져올 수 없습니다.
pom.xml에는 다음이 있습니다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
그리고 내 서비스 프록시:
@FeignClient(name = "movie-api")
@RibbonClient(name = "movie-api")
public interface MovieApi {
@RequestMapping(method = RequestMethod.GET, value = "/movies/{id}")
Movie getMovie(@PathVariable("id") Long id);
}
언급URL : https://stackoverflow.com/questions/41401009/load-balancer-does-not-have-available-server-for-client
'programing' 카테고리의 다른 글
| HttpClient용 공급자 없음 (0) | 2023.03.08 |
|---|---|
| MongoCredential 인증 예외 및 분류되지 않은 Mongo DB 예외 (0) | 2023.03.08 |
| 각각 $.를 사용하여 Json 데이터에 대한 jquery 루프 (0) | 2023.03.08 |
| 왜 반대하지 않는 거죠?키는 TypeScript에서 키 타입을 반환합니까? (0) | 2023.03.08 |
| Larabel에서 최대 파일 크기를 검증하는 방법 (0) | 2023.03.03 |
