eureka hostname作用_eureka解析hostname为localhost问题 (转)

公司的springcloud已经上线运行,但是最近测试环境老是会出现一个诡异的问题,就是zuul无法进行服务转发,报错信息如下

com.netflix.zuul.exception.ZuulException: Forwarding error

Caused by: java.lang.RuntimeException: org.apache.http.conn.HttpHostConnectException: Connect to core01.develop.etongdai.com:9210 [core01.develop.etongdai.com/10.20.9.155] failed: Connection refused (Connectio

n refused)at rx.exceptions.Exceptions.propagate(Exceptions.java:58)

che.http.conn.HttpHostConnectException: Connect to core01.develop.etongdai.com:9210 [core01.develop.etongdai.com/10.20.9.155] failed: Connection refused (Connection refused)

Caused by: java.net.ConnectException: Connection refused (Connection refused)

此调用的接口原来一直是可以调用的,于是试着直接调用后面的服务,发现服务的接口是可以调用的,又试着进行域名,及ip的连通测试,发现都没有问题,这就让人郁闷了,都没有问题,为啥会无法进行请求转发呢。突然想到,zuul的服务地址是从eureka同步是来的,于是跑去eureka查看了一下服务信息,结果发现了问题,hostname被解析成localhost了,如下图

这就奇怪,怎么会解析成localhost呢,但是同一台机器部署了另外一个服务就没有问题。起先怀疑是配置的问题,但是对比了一下,和其它项目没有差别,为啥只有这个项目不行呢?

看来只能去翻源码了,通过一篇文章,我了解了一下eureka的地址解析过程,链接:http://www.itmuch.com/spring-cloud-code-read/spring-cloud-code-read-eureka-registry-ip/

IntetUtils.class

public InetUtils.HostInfo findFirstNonLoopbackHostInfo() {

InetAddress address = this.findFirstNonLoopbackAddress();

if (address != null) {

return this.convertAddress(address);

} else {

InetUtils.HostInfo hostInfo = new InetUtils.HostInfo();

hostInfo.setHostname(this.properties.getDefaultHostname());

hostInfo.setIpAddress(this.properties.getDefaultIpAddress());

return hostInfo;

}

}

public InetUtils.HostInfo convertAddress(final InetAddress address) {

InetUtils.HostInfo hostInfo = new InetUtils.HostInfo();

Future result = this.executorService.submit(new Callable() {

public String call() throws Exception {

return address.getHostName();

}

});

String hostname;

try {

hostname = (String)result.get((long)this.properties.getTimeoutSeconds(), TimeUnit.SECONDS);

} catch (Exception var6) {

this.log.info("Cannot determine local hostname");

hostname = "localhost";

}

hostInfo.setHostname(hostname);

hostInfo.setIpAddress(address.getHostAddress());

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 ignoredInterfaces = new ArrayList();

private boolean useOnlySiteLocalInterfaces = false;

private List preferredNetworks = new ArrayList();

好吧,默认是1秒,正常来说,1秒应该是足够了,但是我们测试环境的是虚拟机,而且性能不是特别好,所以更加怀疑是这个地方,但是怎么证明一下呢,这个调底层操作,不太好重现。想了半天,代码翻看了几遍,突然发现,他报错的地方有打日志。那就好办,去日志里搜索一下,如图

至此确定是这个问题了。

这个地方后来确认了一下是因为dns解析慢引起的,看了下面这篇文章确认的:http://xhao.io/2016/04/host-ip/

但是我没有找到spring.util.timeout.sec的配置项,最后找到了一个cloud的网上配置项spring.cloud.inetutils.timeout-seconds

根据说明显示也是配置网卡信息读取超时。

后来我再novaplan.yml中设置了如下配置解决了这个问题

spring:

profiles: prd

cloud:

inetutils:

timeout-seconds: 6

在k8s中搭建可解析hostname的DNS服务

2016-01-25更新 上篇文章总结k8s中搭建hbase时,遇到Pod中hostname的DNS解析问题,本篇将通过修改kube2sky源码来解决这个问题. 1 前言 kube2sky在Githu ...

深入解析hostname

结论:/etc/sysconfig/network 确实是hostname的配置文件,hostname的值跟该配置文件中的HOSTNAME有一定的关联关系,但是没有必然关系,hostname的值来自内 ...

白话SpringCloud | 第三章:服务注册与发现(Eureka)-下

前言 上一章节,讲解了在单机模式下的服务注册与发现的相关知识点及简单示例.而在实际生产或者在这种微服务架构的分布式环境中,需要考虑发生故障时,各组件的高可用.而其实高可用,我的简单粗俗理解就是,通过系 ...

Eureka 入门,带视频

疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

【转】Eureka集群

Eureka作为SpringCloud的服务发现与注册中心,在整个的微服务体系中,处于核心位置.单一的eureka服务,显然不能满足高可用的实际生产环境,这就要求我们配置一个能够应对各种突发情况,具有 ...

Mysql 服务在本机,需要单机调试Mysql数据库 发生 不认识hostname‘localhost’

今天在本机安装Mysql Server然后用Workbench打开,连接本机数据库 hostname:localhost port:3306 弹出:localhost 不能连接 错误-1042 尝试了 ...

spring cloud 入门系列三:使用Eureka 搭建高可用服务注册中心

在上一篇中分享了如何使用Eureka 进行服务治理,里面搭建的服务注册中心是单体的, 但是在实际的应用中,分布式系统为了防止单体服务宕机带来严重后果,一般都会采用服务器集群的形式,服务注册中心也是一样 ...

玩转Spring Cloud之服务注册发现(eureka)及负载均衡消费(ribbon、feign)

如果说用Spring Boot+Spring MVC是开发单体应用(或单体服务)的利器,那么Spring Boot+Spring MVC+Spring Cloud将是开发分布式应用(快速构建微服务)的 ...

.NET Core微服务之基于Steeltoe使用Eureka实现服务注册与发现

Tip: 此篇已加入.NET Core微服务基础系列文章索引 =>  Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...

随机推荐

No.25

每天三件事必做: 1.背单词: 2.跑步: 3.读书.

[Java] jackson注解

Jackson(http://jackson.codehaus.org)库是基于java语言的开源json格式解析工具.相对于javajson解析的其他库,诸如json-lib.gson包,Jacks ...

UICollectionView 自定义组头组尾的XIB方法

UICollectionView的加载方式和Tableview很像,基本上加载的方法都差不多,尤其是它的数据源的方法和代理方法基本上类似,只不过是名字上有点细微的差别而已.这里面不赘述. 1. UIC ...

让PictureBox支持URL显示图片

[ToolboxItem(true)] public class PictureBoxURL : PictureBox { private string _url = ""; pu ...

SSIS的CheckPoint用法

在SSIS的Package Property中有CheckPoints的属性目录,CheckPoint是SSIS的Failover Feature.通过简单的配置CheckPoint,能够在Packa ...

iOS 深入理解UINavigationController 和 UIViewController 之间的关系

创建三个类 BasicViewController : UIViewController SecondViewController : UIViewController ThirdViewContro ...

WIN7,WIN8,WIN8.1,64位客户端使用32位的ODBC配置

运行64位的ODBC管理器,点开始-->运行-->odbcad32回车即可打开,但打开后看不到32位的驱动, 如果要运行32位的ODBC管理器,该怎么办呢,其实很简单, 只要执行C:\Wi ...

可以使用QT给龙芯开发软件

直接apt-get install libqt5core5a就有了,也许是一个很好的小众市场机会呢 至于系统,可以使用debian mips https://www.debian.org/devel/ ...

myeclipse8.6安装svn插件

1.从官方网站下载site-1.6.16.zip,网址:subclipse.tigris.org: 2.将解压出来的features与plugins,复制到任意目录:Genuitec/MyEclips ...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: eureka.instance.hostnameEureka客户端配置属性之一,用于指定Eureka客户端注册Eureka服务器时使用的主机名。该属性的值应该是一个有效的主机名或IP地址。当Eureka客户端启动并向Eureka服务器注册时,它将使用此属性指定的主机名作为自己的标识符。这有助于其他服务在调用该服务时正确地识别它。 ### 回答2: eureka.instance.hostname是Netflix Eureka注册中心中的一个配置参数,用于指定本服务实例的主机名。在使用Netflix Eureka构建分布式系统时,各个服务实例需要向注册中心注册自己的信息,包括服务名、IP地址、端口号等。而eureka.instance.hostname参数则用于告诉注册中心本服务实例的主机名是什么。 eureka.instance.hostname作用主要有以下几点。 1. 用于注册服务实例的地址 当一个服务实例向Eureka注册中心注册时,Eureka需要确定它所在的地址。如果实例注册时没有指定主机名,则Eureka将使用实例在注册中心的IP地址或服务器的本地主机名。这可能会导致映射到注册中心的服务实例地址不可访问,或者多个实例在同一主机上时无法正确识别。因此,设置eureka.instance.hostname可以确保注册中心正确标识实例的地址。 2. 用于支持多网卡环境 在多网卡环境下,如果服务实例采用默认设置,Eureka将仅使用第一个网卡的IP地址。由于本机有多个网卡,可能会导致与实际情况不符的结果。通过设置eureka.instance.hostname,可以在同一主机上运行多个实例并将服务与预期的IP地址进行匹配。 3. 支持集群环境下的负载均衡 在使用Netflix Eureka搭建分布式系统时,可以通过将多个实例注册到相同的Eureka注册中心上,实现实例的群集。设置eureka.instance.hostname可以在群集环境中实现负载均衡,从而优化系统性能并提高可靠性。 总之,eureka.instance.hostname是Netflix Eureka注册中心中一个重要的配置参数,它在构建分布式系统时扮演着至关重要的角色。只有在正确地设置和使用这个参数,才能确保服务能够正确注册并被其他服务实例正确地访问。 ### 回答3: eureka.instance.hostname属性是在Eureka注册表中注册服务时,服务的主机名或IP地址。这个属性指定服务在Eureka服务器上的标识,可以是一个主机名或者是IP地址。在Eureka注册表中,每个服务都需要有一个唯一的标识,而eureka.instance.hostname属性就是这个标识的一部分。 当服务向Eureka服务器注册时,Eureka服务器会读取该属性并将其保存在注册表中。此后,其他服务或客户端可以通过该属性来查找并调用该服务。如果没有指定该属性,则Eureka服务器将使用默认的主机名或IP地址,这可能导致服务名称冲突或IP地址不正确。 在实际的应用中,通常会将eureka.instance.hostname设置为当前主机名或IP地址,以确保服务的唯一性和可识别性。同时,这个属性也决定了在服务启动时Eureka客户端自动注册注册表中的实例的主机名或IP地址。 总的来说,eureka.instance.hostname属性在Eureka注册表中扮演着非常重要的角色,它是服务注册和发现的基础,也是保证服务的唯一性和可靠性的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值