eureka解析hostname为localhost问题(转)
公司的springcloud已经上线运⾏,但是最近测试环境⽼是会出现⼀个诡异的问题,就是zuul⽆法进⾏服务转发,报错信息如下
ption.ZuulException: Forwarding error
Caused by: java.lang.RuntimeException: org.HttpHostConnectException: Connect to dai:9210 [dai/10.20.9.155] failed: Connection refused (Connectio
n refused) ptions.Exceptions.propagate(Exceptions.java:58)
HttpHostConnectException: Connect to dai:9210 [dai/10.20.9.155] failed: Connection refused (Connection refused)
Caused by: java.ConnectException: Connection refused (Connection refused)
此调⽤的接⼝原来⼀直是可以调⽤的,于是试着直接调⽤后⾯的服务,发现服务的接⼝是可以调⽤的,⼜试着进⾏域名,及ip的连通测试,发现都没有问题,这就让⼈郁闷了,都没有问题,为啥会⽆法进⾏请求
转发呢。突然想到,zuul的服务地址是从eureka同步是来的,于是跑去eureka查看了⼀下服务信息,结果发现了问题,hostname被解析成localhost了,如下图
这就奇怪,怎么会解析成localhost呢,但是同⼀台机器部署了另外⼀个服务就没有问题。起先怀疑是配置的问题,但是对⽐了⼀下,和其它项⽬没有差别,为啥只有这个项⽬不⾏呢?
IntetUtils.class
public InetUtils.HostInfo findFirstNonLoopbackHostInfo() {
InetAddress address = this.findFirstNonLoopbackAddress();
if (address != null) {
vertAddress(address);
} else {
InetUtils.HostInfo hostInfo = new InetUtils.HostInfo();
hostInfo.setHostname(DefaultHostname());
hostInfo.setIpAddress(DefaultIpAddress());
return hostInfo;
}
}
public InetUtils.HostInfo convertAddress(final InetAddress address) {
InetUtils.HostInfo hostInfo = new InetUtils.HostInfo();
Future result = utorService.submit(new Callable<String>() {
public String call() throws Exception {
HostName();
}
});
String hostname;
try {
hostname = (((long)TimeoutSeconds(), TimeUnit.SECONDS);
} catch (Exception var6) {
this.log.info("Cannot determine local hostname");
hostname = "localhost";
}
hostInfo.setHostname(hostname);
hostInfo.HostAddress());
return hostInfo;
}
发现了上⾯⼀段代码,⾮常可疑。⼤概意思应该是调另外⼀个线程去解析⽹卡等信息,如果⼀定时间内没有结果,就默认⽤localhost作为⽤户名,那么就看⼀下这个时间是多少
@ConfigurationProperties("spring.cloud.inetutils")
public class InetUtilsProperties {
public static final String PREFIX = "spring.cloud.inetutils";
private String defaultHostname = "localhost";
private String defaultIpAddress = "127.0.0.1";
@Value("${spring.util.timeout.sec:${SPRING_UTIL_TIMEOUT_SEC:1}}")
private int timeoutSeconds = 1;
private List<String> ignoredInterfaces = new ArrayList();
private boolean useOnlySiteLocalInterfaces = false;
private List<String> preferredNetworks = new ArrayList();
好吧,默认是1秒,正常来说,1秒应该是⾜够了,但是我们测试环境的是虚拟机,⽽且性能不是特别好,所以更加怀疑是这个地⽅,但是怎么证明⼀下呢,这个调底层操作,不太好重现。想了半天,代码翻看了⼏遍,突然发现,他报错的地⽅有打⽇志。那就好办,去⽇志⾥搜索⼀下,如图
springcloud怎么读音⾄此确定是这个问题了。
但是我没有到spring.util.timeout.sec的配置项,最后到了⼀个cloud的⽹上配置项spring.cloud.inetutils.timeout-seconds
根据说明显⽰也是配置⽹卡信息读取超时。
后来我再l中设置了如下配置解决了这个问题
spring:
profiles: prd
cloud:
inetutils:
timeout-seconds: 6
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论