Spring RestTemplate netflix loadblancer没有配置httpClient头主机

时间:2017-07-13 18:00:43

标签: spring-boot apache-httpclient-4.x resttemplate netflix-eureka

我们有一个基于Spring Cloud Netflix Loadbalancer的复杂应用程序,可以在微服务ms1<client>-->ms2<server>之间进行调用 我们使用restTemplate.exchange调用URI主机名,该主机名是用于FQDN查找的Eureka密钥。

此配置适用于其他微服务,实际上restTemplate bean适用于不同组件的微服务调用。

接收其余的呼叫是Cloud Foundry Go-router,我认为它只是一个ngineX代理服务器,httpClient请求应该将头部变量设置为&#34; Host&#34;:&#34; FQDN&#34 ;这允许代理将请求路由到空间中的适当实例。

问题:

来自ms的httpClient调用ms

CompletionException. cause: org.springframework.web.client.HttpClientErrorException: 404 NOT_FOUND 这是来自CF go-router(简单代理服务器)的响应,请求永远不会得到http - &gt; ms实例。

当RestClient配置请求时,它设置标题&#34; Host&#34;如localhost:8090或ms主机名是什么???

讨论相关问题: 显然我们这里有配置问题。 关于netflix ribbon负载均衡器客户端如何设置httpClient标头的任何建议? 什么包类拦截器做这个魔术? 什么配置变量会影响这个?

代码调试表明netflix.client.SimpleVipAddressResolver正在运行。

我们已经将调试一直跟踪到Apache httpClient,并且它将标头Host设置为ms主机名,它也在netflix httpClient包装器中设置为该值。

我尝试创建一个简单的参考实现,但不能。

有关故障排除的任何建议吗? 在哪里查看或阅读有关com.netflix包裹的文档?

使用卡姆登弹簧。使用个人资料

从内存调试;

ClientClassName:com.netflix.niws.client.http.RestClient
VipAddressResolverClassName:com.netflix.client.SimpleVipAddressResolver
NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
NFLoadBalancerClassName:com.netflix.loadbalancer.ZoneAwareLoadBalancer
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.AvailabilityFilteringRule
EnablePrimeConnections:false, 
CustomSSLSocketFactoryClassName:null, 
TrustStorePassword:null, 
EnableConnectionPool:true, 
listOfServers:, 
OkToRetryOnAllOperations:false, 
RequestIdHeaderName:null

我们怀疑某些application.properties,.yml或bootstrap.yml是否被设置或未设置在扫描路径中的某个位置???

1 个答案:

答案 0 :(得分:0)

我们刚刚将平台春季启动1.3.x升级为1.4.2。 ms入站控制器具有注释

@RequestHeader HttpHeaders httpHeaders

我们附加到restTemplate.execute作为参数的内容最终发布到rest-netflix-httpClient,因为请求标头用于调用ms。 CF上的Go-Router必须使用该值来执行代理实例。

显然,在升级的某个地方,发生了两件事之一,

A)版本1.3.2中的启动控制器@RequestHeader未放置标题Host

B)以前版本的spring Cloud-netflix-ribbon使用功能区查找覆盖了Host httpHeader值。

无论哪种方式,都没有特殊的拦截器。 Spring cloud netflix Eureka将采用你提供的任何httpHeader(即使该标题是关键:Host并使用这些值。