2015-12-15 8 views
0

Я пытаюсь написать простое приложение Spring Boot, которое может (1) зарегистрироваться на сервере Netflix Eureka и (2) запросить сервер Eureka для получения сведений о других зарегистрированных сервисах ,Приложение Spring Boot с Eureka DiscoveryClient не запускается

В моем классе клиента есть поле @Autowired типа com.netflix.discovery.DiscoveryClient, которое используется для связи с Eureka и запрашивает его, чтобы узнать о других услугах. На моем главном классе у меня есть аннотацию @EnableDiscoveryClient:

@SpringBootApplication 
@EnableDiscoveryClient 
public class AppBootstrap { 

    public static void main(String[] args) { 
     SpringApplication.run(AppBootstrap.class, args); 
    } 

} 

В моем application.yml файл под SRC/основные/ресурсы у меня есть:

eureka: 
    instance: 
     lease-renewal-interval-in-seconds: 10 
     lease-expiration-duration-in-seconds: 20 
     prefer-ip-address: true 
     secure-port: 443 
     non-secure-port: 80 
     metadata-map: 
      instanceId: my-test-instance 
    client: 
     service-url: 
      defaultZone: http://localhost:9080/eureka/ 
     registry-fetch-interval-seconds: 6 
     instance-info-replication-interval-seconds: 6 
     register-with-eureka: true 
     fetch-registry: true 
     heartbeat-executor-thread-pool-size: 5 
     eureka-service-url-poll-interval-seconds: 10 

Когда я начинаю мое приложение службы не загружается, бросая исключение, с корнем в:

Вызванный: java.lang.AbstractMethodError: org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean.getInstanceI г() Ljava/языки/строка; на com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider.get (EurekaConfigBasedInstanceInfoProvider .java: 53) в com.netflix.appinfo.ApplicationInfoManager.initComponent (ApplicationInfoManager.java:90) ... более 25

Я понятия не имею, что здесь происходит. Есть идеи? Я считаю, что приложение все равно должно начаться, даже если конфигурация Eureka неверна, но она падает во время запуска.

Во-вторых, я использую правильный DiscoveryClient? В идеале я хотел бы сделать его общим, чтобы я мог использовать его с Eureka, Consul или ZooKeeper в качестве примеров. Я считаю, что документация не очень хороша для того, чтобы точно определить, что требуется при использовании этих компонентов обнаружения Spring Cloud/Netflix.

+0

Вы используете версию 'eureka-client', которая несовместима с Spring Cloud Netflix. Чтобы избежать подобных проблем, вы должны использовать управление зависимостями Spring Cloud. –

+0

У меня нет большого опыта в управлении зависимостями Spring Cloud. Не могли бы вы привести мне пример? – Boon

+0

Это зависит от того, используете ли вы Maven или Gradle. Попробуйте найти 'bom' в [документации] (http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html). –

ответ

0

Вы можете использовать

org.springframework.cloud.client.discovery.DiscoveryClient 

, то вы можете получить список экземпляров с discoveryClient.getInstances

ServiceInstance instance = discoveryClient.getInstances(service).get(0); 
instance.getUri().toString(); 

Если вы используете другие компоненты, такие как RestTemplate, ленты и т.д. Вам нужно только использовать название услуги (имя, зарегистрированное в eureka), в URL-адресе

restTemplate.getForObject("http://PRODUCTSMICROSERVICE/products/{id}", Product.class, id) 

Вы можете увидеть m Руды здесь

https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka

0

я получил ошибку автоматического связывания в моем опыте, когда я использовал discoveryclient, чтобы получить информацию в классе вне любой функции. Таким образом, я использовал eureka, чтобы узнать порт для моего сервиса, поскольку порт был описан как 0, поэтому служба динамически собирала порт, начиная с приложения загрузки весной. Мне нужно было знать порт программно. В контроллере я использовал код, как показано ниже в неправильном

public class HelloController { 

private static final Logger LOG = LoggerFactory.getLogger(HelloController.class); 

@Autowired 
private DiscoveryClient discoveryClient; 

int port = discoveryClient.getLocalServiceInstance().getPort(); 


@RequestMapping("/hello/{id}") 
public String sayhello(@PathVariable String id) 
{ 
    String s ="A very nice and warm welcome to the world "+id; 
      LOG.info(String.format("calling helloservice for %s",id)); 
    LOG.info(String.format("calling helloservice for port %d",port)); 
    return s; 
} 

После того, как я поставил код порта внутри SayHello методы ошибка пошла прочь.Таким образом, правильный способ возврата порта ниже

public class HelloController { 

private static final Logger LOG = LoggerFactory.getLogger(HelloController.class); 

@Autowired 
private DiscoveryClient discoveryClient; 



@RequestMapping("/hello/{id}") 
public String sayhello(@PathVariable String id) 
{ 
    String s ="A very nice and warm welcome to the world "+id; 
    int port = discoveryClient.getLocalServiceInstance().getPort(); 
    LOG.info(String.format("calling helloservice for %s",id)); 
    LOG.info(String.format("calling helloservice for port %d",port)); 
    return s; 
}