我有一个服务 owner-consumer-service ,它与另一个服务 owner-service 对话 . 我正在使用Eureka服务器进行服务注册 .

owner-consumer-service 具有带有 @LoadBalanced 注释的 RestTemplate . RestTemplate调用 owner-service 并返回响应 . 我正在使用尤里卡丝带 .

在本地机器上一切正常 .

  • 这两项服务均在尤里卡注册 .

  • 能够直接拨打 owner-service

  • 能够通过 owner-consumer-service 致电 owner-service

然后我在PCF上部署了所有服务和Eureka服务器 .

  • 这两项服务均在尤里卡注册 .

  • 能够直接拨打 owner-service

  • Unable to call owner-service through owner-consumer-service

日志表明 owner-consumer-service 能够解析 owner-service 的主机名,但是restTemplate没有使用该主机名 owner-service 来进行调用,而是导致错误 .

我正在使用 :

  • spring-boot 1.5.9.RELEASE

  • spring-cloud Edgware.SR1

  • spring-cloud-services-starter-service-registry 1.6.1.RELEASE

  • spring-cloud-dependencies 1.6.1.RELEASE

PCF日志:

[nio-8080-exec-4] s.c.a.AnnotationConfigApplicationContext : Refreshing SpringClientFactory-owner-microservice: startup date [Wed Mar 14 11:41:09 UTC 2018]; parent: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@10a035a0
[nio-8080-exec-4] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
[nio-8080-exec-4] c.netflix.config.ChainedDynamicProperty : Flipping property: owner-microservice.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
[nio-8080-exec-4] c.netflix.loadbalancer.BaseLoadBalancer : Client: owner-microservice instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=owner-microservice,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
[nio-8080-exec-4] c.netflix.config.ChainedDynamicProperty : Flipping property: owner-microservice.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
[APP/PROC/WEB/0] [OUT] },Server stats: [[Server:owner-microservice.cf.region.cloud.hh.xxxxx:8080;   Zone:defaultZone;   Total Requests:0;   Successive connection failure:0;    Total blackout seconds:0;   Last connection made:Thu Jan 01 00:00:00 UTC 1970;  First connection made: Thu Jan 01 00:00:00 UTC 1970;    Active Connections:0;   total failure count in last (1000) msecs:0; average resp time:0.0;  90 percentile resp time:0.0;    95 percentile resp time:0.0;    min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
[APP/PROC/WEB/0] [OUT] 2018-03-14 11:41:09.870 INFO 19 --- [nio-8080-exec-4] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client owner-microservice initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=owner-microservice,current list of Servers=[owner-microservice.cf.region.cloud.hh.xxxxx:8080],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;    Instance count:1;   Active connections count: 0;    Circuit breaker tripped count: 0;   Active connections per server: 0.0;]
[APP/PROC/WEB/0] [OUT] ]}ServerList:DiscoveryEnabledNIWSServerList:; clientName:owner-microservice; Effective vipAddresses:owner-microservice; isSecure:false; datacenter:null
[APP/PROC/WEB/0] [OUT] 2018-03-14 11:41:10.821 INFO 19 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty : Flipping property: owner-microservice.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
[APP/PROC/WEB/0] [OUT] at java.net.PlainSocketImpl.socketConnect(Native Method)
[APP/PROC/WEB/0] [OUT] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
[APP/PROC/WEB/0] [OUT] at java.net.Socket.connect(Socket.java:589)
[APP/PROC/WEB/0] [OUT] at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
[APP/PROC/WEB/0] [OUT] at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
[APP/PROC/WEB/0] [OUT] at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
[APP/PROC/WEB/0] [OUT] at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:686)
[APP/PROC/WEB/0] [OUT] at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:334)
[APP/PROC/WEB/0] [OUT] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[APP/PROC/WEB/0] [OUT] at java.lang.reflect.Method.invoke(Method.java:497)
[APP/PROC/WEB/0] [OUT] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870)
[APP/PROC/WEB/0] [OUT] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
[APP/PROC/WEB/0] [OUT] 2018-03-14 11:41:16.035 ERROR 19 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : 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 GET request for "http://owner-microservice/owner/detail/2/": No route to host; nested exception is java.net.NoRouteToHostException: No route to host] with root cause
[APP/PROC/WEB/0] [OUT] at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
[APP/PROC/WEB/0] [OUT] at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
[APP/PROC/WEB/0] [OUT] at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1104)
[APP/PROC/WEB/0] [OUT] at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:998)
[APP/PROC/WEB/0] [OUT] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:729)

从以下日志片段开始,似乎负载均衡器能够找出owner-microservice实例的主机名

NFLoadBalancer:name=owner-microservice,current list of Servers=[owner-microservice.cf.region.cloud.hh.xxxxx:8080],
Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;    Instance count:1;   
Active connections count: 0;    Circuit breaker tripped count: 0;   Active connections per server: 0.0;]

但它没有使用该主机名来提出请求 . 它使用 "http://owner-microservice/owner/detail/2/ 来发出请求:

ERROR 19 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] :
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 GET
request for "http://owner-microservice/owner/detail/2/": No route to host;
nested exception is java.net.NoRouteToHostException: No route to host] 
with root cause

我尝试过的:

  • 使用无架构URL( //owner-microservice/detail/owner/2 ,不带 http:

  • 使用spring-boot 2.0.0.RELEASE和spring-cloud Fincheley.M8

我怎样才能解决这个问题?

我没有添加application.yml,pom和Application类以提高可读性 . 请询问他们是否可以帮助解决问题 .