我们有一个基于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是否被设置或未设置在扫描路径中的某个位置???
答案 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
并使用这些值。