2

응용 프로그램 시작 후 일부 초기화 스크립트를 실행하는 서비스가 있습니다 (ApplicationListener<ApplicationReadyEvent> 구현). 이 스크립트에서는 RestTemplate@LoadBalanced으로 다른 서비스를 호출해야합니다. 서비스 호출이 호출 될 때 원격 서버의 인스턴스에 대한 정보는 없으므로 검색 서버에 접속하지 않았으므로 (필자는 추측합니다) 내 init 스크립트가 실행되기 전에발견 서비스 (유레카)에 대한로드 밸런싱 리본 클라이언트 초기화

java.lang.IllegalStateException: No instances available for api-service 
    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:79) 

그래서 방법은 어떻게 응용 프로그램 시작시 검색 서버에서 사용 가능한 서비스의 목록을 얻을 수 있는가?

감사

편집 : 문제는 현재의 환경에서 (DEV) 모든 서비스를 하나 개의 서비스 (API 서비스)에서 함께 연결되어 있다는 사실에 더 관련이있다. api-service 내에서 self에 대해 모르는 @LoadBalanced 클라이언트 api-service를 호출하려고합니다. api-service (self)가 제공 될 때를 아는 일부 청취자 또는 비슷한 것을 등록 할 수 있습니까?

here은 샘플 응용 프로그램입니다.

EurekaEventListener initializerListener = new InitializerListener(discoveryClient, restTemplate); 
discoveryClient.registerEventListener(initializerListener); 
:이

지금

public static class InitializerListener implements EurekaEventListener { 

    private EurekaClient eurekaClient; 
    private RestOperations restTemplate; 

    public InitializerListener(EurekaClient eurekaClient, RestOperations restTemplate) { 
     this.eurekaClient = eurekaClient; 
     this.restTemplate = restTemplate; 
    } 

    @Override 
    public void onEvent(EurekaEvent event) { 
     if (event instanceof StatusChangeEvent) { 
      if (((StatusChangeEvent) event).getStatus().equals(InstanceInfo.InstanceStatus.UP)) { 
       ResponseEntity<String> helloResponse = restTemplate.getForEntity("http://api-service/hello-controller/{name}", String.class, "my friend"); 
       logger.debug("Response from controller is {}", helloResponse.getBody()); 
       eurekaClient.unregisterEventListener(this); 
      } 
     } 
    } 
} 

EurekaListener

를 만든 다음 이런 식으로 등록 할 수있는 해결책이 될 수있다 : 나는 작업 this method

EDIT2을하는 방법을 주로 관심

그러나 응용 프로그램이 검색 서비스에 처음 등록 된 경우에만 실행됩니다. 다음에 API 서비스를 중지하고 다시 실행하면 이벤트가 게시되지 않습니다. 내가 잡을 수있는 다른 사건이 있습니까?

답변

4

현재 Camden 및 그 이전 버전에서는 다른 응용 프로그램을 쿼리하기 전에 응용 프로그램을 Eureka에 등록해야합니다. 귀하의 전화는 등록주기의 초기 단계 일 가능성이 높습니다. 도움이 될 InstanceRegisteredEvent이 있습니다. Dalston 릴리스 트레인에서이 작업을 계획하고 있습니다.

+0

이벤트를 'InstanceRegisteredEvent'로 변경하더라도 동일한 예외가 발생합니다 (인스턴스를 사용할 수 없으므로 github에 푸시했습니다). 나를 도울 수있는 다른 것이 있습니까? 이벤트의 구성 객체가 'EurekaInstanceConfigBean'으로 캐스팅 될 수 있으며 거기에서 대상 서비스의 IP 주소와 포트를 얻을 수 있지만이 경우에는 @LoadBalanced 나머지 템플릿을 사용할 수 없다고 생각합니다. 어떻게 든이 문제를 조사 할 수 있도록 도와 주시면 알려주세요. 현재 proect에서이 기능을 사용할 필요가 있습니다. 감사합니다. – bilak

+0

청취자를 만들었지 만 (편집 된 질문 참조) 응용 프로그램을 다시 시작할 때마다 실행되지 않는 문제가 있습니다. – bilak

+0

응용 프로그램이 레지스트리 서버에 등록 할 때마다 호출되는 이벤트를 수신 할 수 있습니까? – bilak