Лента Netflix выдает Нет доступных экземпляров для исключения MY-MICROSERVICE

В моем приложении используются Eureka и Ribbon. Я пытаюсь заставить два микросервиса общаться друг с другом. Ниже мой метод беспокойства.

@Autowired @LoadBalanced
private RestTemplate client;

@Autowired
private DiscoveryClient dClient;

public String getServices() {      
    List<String> services = dClient.getServices();
    List<ServiceInstance> serviceInstances = new ArrayList<>();
    List<String> serviceHosts = new ArrayList<>();       

    for(String service : services) {
        serviceInstances.addAll(dClient.getInstances(service));
    }

    for(ServiceInstance service : serviceInstances) {
       serviceHosts.add(service.getHost());
    }        

    //throws No instances available exception here
    try {
        System.out.println(this.client.getForObject("http://MY-MICROSERVICE/rest/hello", String.class, new HashMap<String, String>()));
    }
    catch(Exception e) {
        e.printStackTrace();
    }

    return serviceHosts.toString();
}

Метод возвращает массив из двух имен хостов (IP). Таким образом, DiscoveryClient может видеть экземпляры двух служб, зарегистрированных в Eureka. Но RestTemplate или, точнее, лента выдает исключение IllegalStateExcpetion: нет доступных экземпляров.

DynamicServerListLoadBalancer for client MY-MICROSERVICE initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=MY-MICROSERVICE,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@23edc38f
java.lang.IllegalStateException: No instances available for MY-MICROSERVICE
        at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:119)
        at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:99)
        at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:58)

Даже панель управления Eureka показывает две зарегистрированные службы. Я чувствую, что проблема именно с лентой. Вот мой файл конфигурации.

spring.application.name="my-microservice"

logging.level.org.springframework.boot.autoconfigure.logging=INFO

spring.devtools.restart.enabled=true
spring.devtools.add-properties=true

server.ribbon.eureka.enabled=true
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/

Другой микросервис также имеет те же конфигурации, за исключением другого имени. В чем проблема?


person Kameswaran Ganesh    schedule 18.09.2019    source источник


Ответы (1)


Решено. Я использовал application.yml с сервером Eureka и application.properties с клиентом. Как только я преобразовал все в yml, все работает нормально.

spring:
 application:
  name: "my-microservice"
 devtools:
  restart:
   enabled: true
  add-properties: true

logging:
 level:
  org.springframework.boot.autoconfigure.logging: INFO

eureka:
 client:
  serviceUrl:
   defaultZone: "http://localhost:8761/eureka/"

Это файл yml для обоих приложений, которые отличаются только именем приложения.

person Kameswaran Ganesh    schedule 24.09.2019