응용 프로그램 시작 후 일부 초기화 스크립트를 실행하는 서비스가 있습니다 (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 methodEDIT2을하는 방법을 주로 관심
그러나 응용 프로그램이 검색 서비스에 처음 등록 된 경우에만 실행됩니다. 다음에 API 서비스를 중지하고 다시 실행하면 이벤트가 게시되지 않습니다. 내가 잡을 수있는 다른 사건이 있습니까?
이벤트를 'InstanceRegisteredEvent'로 변경하더라도 동일한 예외가 발생합니다 (인스턴스를 사용할 수 없으므로 github에 푸시했습니다). 나를 도울 수있는 다른 것이 있습니까? 이벤트의 구성 객체가 'EurekaInstanceConfigBean'으로 캐스팅 될 수 있으며 거기에서 대상 서비스의 IP 주소와 포트를 얻을 수 있지만이 경우에는 @LoadBalanced 나머지 템플릿을 사용할 수 없다고 생각합니다. 어떻게 든이 문제를 조사 할 수 있도록 도와 주시면 알려주세요. 현재 proect에서이 기능을 사용할 필요가 있습니다. 감사합니다. – bilak
청취자를 만들었지 만 (편집 된 질문 참조) 응용 프로그램을 다시 시작할 때마다 실행되지 않는 문제가 있습니다. – bilak
응용 프로그램이 레지스트리 서버에 등록 할 때마다 호출되는 이벤트를 수신 할 수 있습니까? – bilak