springCloud 출현: Load balancer does not have available server for client: SERVICE - XXX 의 오류 해결 방법

16964 단어 오류 기록
현재 제 프레임 워 크 구 조 는 대체적으로 전단 요청 입 니 다. zuul 을 통 해 user 의 인터페이스 제공 모듈, user 인터페이스 제공 모듈 은 user 서비스 모듈 의 업무 기능 (feign 호출) 을 호출 하고 user 서비스의 업무 기능 은 base 서비스 모듈 의 업무 기능 (수 동 호출) 을 호출 해 야 합 니 다. 대체적으로 전단 요청 - > userApi - > userService - > baseService 입 니 다.이 절 차 는 두 곳 에서 이 문제 가 발생 했다.
1 인터페이스 모듈 에서 이 오류 발생
zuul 직접 에이전트 의 인터페이스 층 (즉, zuul 이 직접 전송 하 는 층, 나 는 user 인터페이스 제공 층, userApi) 의 application. yml 에 부하 균형 을 설정 하면 이 문제 가 발생 할 수 있 습 니 다.
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.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:173) ~[spring-cloud-netflix-zuul-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:119) ~[spring-cloud-netflix-zuul-2.1.3.RELEASE.jar:2.1.3.RELEASE]
	at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:117) ~[zuul-core-1.3.1.jar:1.3.1]
-------------------------            --------------------------------
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: SERVICE-USERAPI
	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]

SERVICE - USERAPI 는 제 서비스 이름 입 니 다. 제 가 userApi 모듈 에 다음 과 같은 코드 를 설 정 했 기 때 문 입 니 다.
ribbon:
  eureka:
    enabled: true

zuul 은 자신의 역방향 에이전트 와 부하 균형 기능 이 있 습 니 다. 해결 방법 은 이 설정 을 없 애 면 됩 니 다.
2. 서비스 모듈 에서 이 문제 가 발생 합 니 다.
때때로 업무 층 의 서비스 에서 다른 서비스 제공 자의 서 비 스 를 호출 할 수 있 습 니 다. 이 때 수 동 으로 서 비 스 를 호출 하 는 방식 (feign 호출 을 사용 할 때 도 마찬가지) 을 사용 하면 restTemplate 에서 @ LoadBalanced 를 열 었 지만 설정 파일 에서 부하 균형 이 켜 지지 않 으 면 이 오류 도 발생 할 수 있 습 니 다.해결 방법 은 다음 과 같 습 니 다. 1 호출 된 서비스 프로필 (여 기 는 baseService 의 application. yml) 에 추가 합 니 다.
ribbon:
  eureka:
    enabled: true

2 restTemplate (userService 에서 열 림) 의 부하 균형 능력 동시 오픈
/**
 * springCloud       
 *
 * @author lgs
 */
@Configuration
public class SpringCloudConfig {

    /**
     *       
     *
     * @return
     * @LoadBalanced  RestTemplate                
     */
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

이 두 설정 을 더 한 후에 다른 서 비 스 를 수 동 으로 호출 하 는 것 도 부하 균형 능력 이 있 습 니 다 (userService 는 baseService 의 서 비 스 를 호출 합 니 다).
 @Override
    public ResponseInfo findAllDataBase() {
        MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
        multiValueMap.add("name", "lgs");
        //    post  
        ResponseInfo responseInfo = restTemplate.postForObject(ServiceEnum.SERVICE_BASE.getServicePath() + "/base/sayHello", multiValueMap, ResponseInfo.class);
        return responseInfo;
    }

기록 오류, 조금씩 성장.

좋은 웹페이지 즐겨찾기