2017-01-10 18 views
1

Я используюлента с Spring Облако и Eureka java.lang.IllegalStateException: Нет экземпляров, доступных для локального хоста

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-netflix</artifactId> 
    <version>1.2.3.RELEASE</version> 
    <type>pom</type> 
    <scope>import</scope> 
</dependency> 

Мой главный класс:

@SpringBootApplication 
//@Configuration 
@ComponentScan(basePackages = "com.mypackage") 
@EnableAutoConfiguration 
@EnableEurekaClient 
@EnableSwagger2 
public class App 
{ 
public static void main(String[] args) 
{ 

    SpringApplication.run(App.class, args); 
} 

@LoadBalanced 
@Bean(name="template") 
RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 
} 

Моя визитная служба:

@Autowired 
private RestTemplate template; 

ResponseEntity<String> avs = template.exchange("http://localhost:7075/xyz/json/authenticate",HttpMethod.POST ,request,String.class); 

Исключая это событие

java.lang.IllegalStateException: Нет экземпляров, доступных для локального хоста на org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute (RibbonLoadBalancerClient.java:90) в org.springframework.cloud.client.loadbalancer .RetryLoadBalancerInterceptor $ 1.doWithRetry (RetryLoadBalancerInterceptor.java:60) на org.springframework.cloud.client.loadbalancer.RetryLoadBalancerInterceptor $ 1.doWithRetry (RetryLoadBalancerInterceptor.java:48) в org.springframework.retry.support.RetryTemplate.doExecute (RetryTemplate.java:276) at org.springframework.retry.support.RetryTemplate.execut е (RetryTemplate.java:157)

ответ

2

При использовании @LoadBalancedRestTemplate имя хоста должно быть ServiceID не фактическое имя хоста. В вашем случае, он пытается найти запись eureka для localhost и не может ее найти. См. the documentation о том, как использовать несколько объектов RestTemplate, одна балансировка нагрузки, одна нет.

@Configuration 
public class MyConfiguration { 

    @LoadBalanced 
    @Bean 
    RestTemplate loadBalanced() { 
     return new RestTemplate(); 
    } 

    @Primary 
    @Bean 
    RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

public class MyClass { 
    @Autowired 
    private RestTemplate restTemplate; 

    @Autowired 
    @LoadBalanced 
    private RestTemplate loadBalanced; 

    public String doOtherStuff() { 
     return loadBalanced.getForObject("http://stores/stores", String.class); 
    } 

    public String doStuff() { 
     return restTemplate.getForObject("http://example.com", String.class); 
    } 
} 
+0

Благодаря @spencergibb, еще одна вещь, у меня есть уведомления с Netflix (1.0.3) его необходимо создать шаблон Rest Load Load, но в 1.2.3 его нет. – atiwari54

+0

Нет, это там. Возможно, что-то не так с вашей конфигурацией. – spencergibb

1

Из того, что я прочитал, возникает проблема при попытке Autowire RestTemplate при использовании этого облака Netflix. Однако я нашел обходное решение. Во-первых объявить новый @Component класс и в нем создать метод, который возвращает RestTemplate:

@Component 
public class RestTemplateComponentFix{ 

@Autowired 
SomeConfigurationYouNeed someConfiguration; 

@LoadBalanced 
public RestTemplate getRestTemplate() { 
     // TODO set up your restTemplate 
     rt.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 
     return rt; 
    } 

} 

После этого просто Autowire в restTemplateComponentFix в своем классе, и когда, когда вам нужно шаблон остальные вызвать метод restTemplate(). Что-то вроде этого:

@Service 
public class someClass{ 

    @Autowired 
    RestTemplateComponentFix restTemplateComponentFix; 

    public void methodUsingRestTemplate(){ 
     // Some code... 
     RestTemplate rt = restTemplateComponentFix.getRestTemplate(); 
     // Some code... 
    } 
} 

Холодная часть является то, что вы можете легко проверить блок этот код что-то вроде:

RestTemplate rt = Mockito.mock(RestTemplate.class) 
when(restTemplateComponentFix.getRestTemplate()).thenReturn(rt); 
when(rt.someMethod()).thenReturn(something);