使用restTemplate的时候,报错
之前测试都没有问题,后来突然使用报错。
java.lang.IllegalStateException: No instances available for localhost
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:75) ~[spring-cloud-netflix-core-1.3.1.RELEASE.jar:1.3.1.RELEASE]
at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:55) ~[spring-cloud-commons-1.2.2.RELEASE.jar:1.2.2.RELEASE]
at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:86) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:70) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:659) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE]
后来查找之后发现。我使用了负载均衡
*/
@Configuration
public class MyConfig {
@LoadBalanced//负载均衡
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
所有的访问就必须以应用名访问,也就是生产者注册在Eureka中的ID
错误示范原因:直接使用了url进行请求
@GetMapping("/consumer/product/list")
public List<Product> list(){
return restTemplate.getForObject("http://localhost:8001/product/list",List.class)//使用url访问
修改如下:
//MICROSERVICE-PROVIDER即服务名
@GetMapping("/consumer/product/list")
public List<Product> list(){
return restTemplate.getForObject("http://MICROSERVICE-PROVIDER/product/list",List.class) ;
}
总结:
1、当使用带有负载均衡的restTemplate时,要使用服务名进行访问服务