2016-05-11 11 views
2

Ich habe eine einfache Einrichtung mit einem Eureka Service Registrierungsserver, einem Service für die öffentliche API und einen Service, der von der öffentlichen API mit RestTemplate aufgerufen wird. Eureka sagt mir, dass die Dienste erfolgreich registriert sind, aber wenn ich den Service rufenMicroservices - RestTemplate UnknownHostException

@Service 
public class MyServiceService { 

    @Autowired 
    private RestTemplate restTemplate; 

    private final String serviceUrl; 

    public MyServiceService() { 
     this.serviceUrl = "http://MY-SERVICE"; 
    } 

    public Map<String, String> getTest() { 

     Map<String, String> vars = new HashMap<>(); 
     vars.put("id", "1"); 

     restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); 

     return restTemplate.postForObject(serviceUrl+"/test", "", Map.class, vars); 
    } 
} 

ich die folgende Ausnahme mein Setup zu illustrieren

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
    nested exception is org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://MY-SERVICE/test": MY-SERVICE; 
    nested exception is java.net.UnknownHostException: MY-SERVICE] with root cause java.net.UnknownHostException: MY-SERVICE 

Ich habe ein Beispielprojekt bekommen, vielleicht könnte jemand eine nehmen schau es dir an und sag mir, was mit meiner Einrichtung nicht stimmt.

https://github.com/KenavR/spring-boot-microservices-example

dank

+0

Es scheint, als ob die ' RestTemplate, der injiziert wird, ist nicht der Lastausgleich. Da Sie Spring Cloud Angel.SR6 in Ihrem Projekt verwenden, sollte die Last automatisch ausgeglichen werden. Der einzige Vorschlag, den ich mir vorstellen kann, ist, dass Sie Ihre 'RestTemplate' mit' @ LoadBalanced' annotieren und sehen, ob das einen Unterschied macht. –

+0

Ich habe das in der Vergangenheit versucht und nun wieder, leider bleibt der Fehler gleich. – KenavR

+1

Haben Sie Spring Cloud Brixton.RELEASE versucht, wurde es heute veröffentlicht. Beachten Sie, dass Sie bei Brixton eine eigene '@LoadBalanced @Bean RestTemplate' definieren müssen, da Brixton diese nicht mehr standardmäßig erzeugt. Dann kannst du es wie üblich "autowire". Abgesehen davon könnten Sie versuchen, Ihren Service mit der Service-ID in Kleinbuchstaben "http: // my-service/test" aufzurufen. –

Antwort

4

Wie patrick-grimard vorgeschlagen Brixton Schalten und Ändern der Code die Probleme benötigt wurden behoben. Arbeitslösung ist auf Github.

Auch geändert die gepostete id von Anfrage param an Anfrage Körper, die auch die Art, wie ich es der Anfrage hinzufügen geändert.

Service-Endpunkt

@RequestMapping(method = RequestMethod.POST, produces = "application/json; charset=utf-8") 
public @ResponseBody Map<String, String> getTest(@RequestBody Map<String, Long> params) { 

    Map<String, String> response = new HashMap<>(); 

    response.put("name", "My Service"); 

    return response; 
} 

RestTemplate Schöpfung

@Configuration 
public class PublicAPIConfiguration { 
    @LoadBalanced 
    @Bean 
    RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 
} 

Calling Service

@Service 
public class MyServiceService { 

    @Autowired 
    private RestTemplate restTemplate; 

    private final String serviceUrl; 

    public MyServiceService() { 
     this.serviceUrl = "http://my-service"; 
    } 

    public Map<String, String> getTest() { 

     Map<String, Long> vars = new HashMap<>(); 
     vars.put("id", 1L); 

     return restTemplate.postForObject(serviceUrl+"/test", vars, Map.class); 
    } 
}