6

Sto lavorando su Spring Boot Eureka Client Application con Ribbon Load Balancer.Nastro con Spring Cloud e Eureka: java.lang.IllegalStateException: Nessuna istanza disponibile per Samarths-MacBook-Pro.local

Ho due istanze del server registrato con Eureka con il nome "TEST". Sul lato client, ho il seguente codice per recuperare il server da Eureka.

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
@EnableEurekaClient 
@RestController 
public class EurekaConsumerApplication { 

@Autowired 
DiscoveryClient discoveryClient; 

@Autowired 
RestTemplate restTemplate; 

@RequestMapping(value = "/",method = RequestMethod.GET) 
String consumer(){ 
InstanceInfo instance = discoveryClient.getNextServerFromEureka("TEST",  false); 

URI uri = UriComponentsBuilder.fromUriString(instance.getHomePageUrl() + "baseDir") 
     .build() 
     .toUri(); 
String baseDir = restTemplate.getForObject(uri, String.class); 

return baseDir; 

} 

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

}

application.yml

spring: 
    application: 
    name: consumer 
info: 
    component: Consumer to fetch configuration 
server: 
    port: 8090 
eureka: 
    instance: 
    leaseRenewalIntervalInSeconds: 3 
    metadataMap: 
    instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${random.value}}} 
client: 
# Default values comes from org.springframework.cloud.netflix.eurek.EurekaClientConfigBean 
    region: default 
    registryFetchIntervalSeconds: 5 
    instanceInfoReplicationIntervalSeconds: 5 
    initialInstanceInfoReplicationIntervalSeconds: 5 
    serviceUrl: 
    defaultZone: http://localhost:8761/eureka/ 
    availabilityZones: 
    default: ${APPLICATION_DOMAIN:${DOMAIN:defaultZone}} 

Tuttavia, quando ho colpito l'endpoint riposante: ricciolo http://localhost:8090/, mi dà il seguente errore: "eccezione": "java.lang .IllegalStateException "," message ":" org.springframework.web.util.NestedServletException: elaborazione della richiesta non riuscita; l'eccezione nidificata è java.lang.IllegalStateException: nessuna istanza disponibile per Samarths-MacBook-Pro.local "," percorso ":"/"}

Stacktrace:

2015-07-22 14:37:35.005 INFO 13841 --- [tp1334391583-19] c.netflix.loadbalancer.BaseLoadBalancer : Client:Samarths-MacBook-Pro.local instantiated a LoadBalancer:DynamicServerListLoadBalancer:{NFLoadBalancer:name=Samarths-MacBook-Pro.local,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null 
2015-07-22 14:37:35.009 INFO 13841 --- [tp1334391583-19] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client Samarths-MacBook-Pro.local initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=Samarths-MacBook-Pro.local,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:org.springf[email protected]681eda37 
2015-07-22 14:37:35.029 WARN 13841 --- [tp1334391583-19] o.eclipse.jetty.servlet.ServletHandler : 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No instances available for Samarths-MacBook-Pro.local 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) 
at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:295) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.eclipse.jetty..ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:68) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
at org.eclipse.jetty.server.Server.handle(Server.java:499) 
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) 
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: No instances available for Samarths-MacBook-Pro.local 
at org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory.createRequest(RibbonClientHttpRequestFactory.java:64) 
at org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76) 
at org.springframework.web.client.Rlate.doExecute(RestTemplate.java:565) 
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:545) 
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:253) 
at com.securityscorecard.eureka.consumer.EurekaConsumerApplication.consumer(EurekaConsumerApplication.java:53) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
... 38 common frames omitted 

Sembra che la mia lista dei server è vuoto.

risposta

7

Il RestTemplate avviato è già connesso alla barra multifunzione. Quindi fai una ricerca a mano e quindi RestTemplate sta cercando di cercare il nome host passato alla barra multifunzione. Hai due opzioni: 1) Non utilizzare il netflix DiscoveryClient e passare il ServiceId come un nome host logico a ribbon(), 2) Non utilizzare ilavviato automaticamente, creare uno nuovo per la classe. La mia scelta sarebbe # 1.

+0

Grazie per il suggerimento. Ho usato una variazione della tua prima scelta per risolvere il mio problema. – Samarth

+0

Un collegamento alla documentazione: http: //projects.spring.io/spring-cloud/spring-cloud.html#_spring_resttemplate_as_a_load_balancer_client –

4

Ho ottenuto questo funzionamento. L'unico cambiamento che ho dovuto fare è stato nel modo in cui stavo usando api RestTemplate.

Codice di errore:

@Autowired 
RestTemplate restTemplate; 

@RequestMapping(value = "/",method = RequestMethod.GET) 
String consumer(){ 
    String baseDir = restTemplate.getForObject("TEST", String.class); 

    return baseDir; 
} 

Codice lavoro:

@Autowired 
RestTemplate restTemplate; 

@RequestMapping(value = "/",method = RequestMethod.GET) 
String consumer(){ 
    String baseDir = restTemplate.getForObject("http://TEST", String.class); 

    return baseDir; 
} 

Soluzione:

Il primo parametro da restTemplate.getForObject dovrebbe avere il formato di un URL. E il nome di dominio dovrebbe essere il nome del servizio che vuoi scoprire.

Es: http://TEST. Qui, TEST è il nome del mio server registrato nel registro di eureka

+1

Sì, è quello che ho detto che dovevi fare. – spencergibb

1

La domanda ha già una risposta, ma ho trovato una soluzione che sembra accurata e ha risolto il nostro problema.

prima dichiarare una nuova classe @Component e in essa creare un metodo che restituisce RestTemplate:

@Component 
public class RestTemplateComponentFix{ 

@Autowired 
SomeConfigurationYouNeed someConfiguration; 

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

} 

Dopo che appena Autowire il restTemplateComponentFix nella tua classe e quando quando è necessario il modello resto chiamare il restTemplate() metodo.Qualcosa di simile a questo:

@Service 
public class someClass{ 

    @Autowired 
    RestTemplateComponentFix restTemplateComponentFix; 

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

Dopo di che è possibile unità di prova con qualcosa di simile:

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