在学习SpringCloud时,发现单机启动服务端会一直抛出异常

Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to localhost:8761 timed out
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:144) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:134) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118) ~[httpclient-4.5.3.jar:4.5.3]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[httpclient-4.5.3.jar:4.5.3]
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:173) ~[jersey-apache-client4-1.19.1.jar:1.19.1]
… 10 common frames omitted

在控制台,启动后会一直刷新报错:

Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to localhost:8761 timed out

这个原因是在Eureka的EurekaClientConfigBean中,默认的服务器配置为
在这里插入图片描述
如上图:http://localhost:8761/eureka

一、自连接解决

我们8761这个端口并没有应用,所以我们一种解决方法就是覆盖此配置,在配置文件中设置让其Server自己连自己:

eureka.client.service-url.defaultZone=http://localhost:9090/eureka

更改后可以发现,服务端注册地址改为了我们自己,并且控制台不再报错

在这里插入图片描述

二、修改配置解决

碰到这个问题,我们还有一种思考方式,进入源码查看,看看这个peer集群在单机情况下能否关闭

在这里插入图片描述

启动时可以看到,是在PeerEurekaNodes类中进行的添加集群节点,进入查看源码

protected List<String> resolvePeerUrls() {
    InstanceInfo myInfo = applicationInfoManager.getInfo();
    String zone = InstanceInfo.getZone(clientConfig.getAvailabilityZones(clientConfig.getRegion()), myInfo);
    List<String> replicaUrls = EndpointUtils
            .getDiscoveryServiceUrls(clientConfig, zone, new EndpointUtils.InstanceInfoBasedUrlRandomizer(myInfo));

    int idx = 0;
    while (idx < replicaUrls.size()) {
        if (isThisMyUrl(replicaUrls.get(idx))) {
            replicaUrls.remove(idx);
        } else {
            idx++;
        }
    }
    return replicaUrls;
}

会发现有一个resolvePeerUrls的方法,我们打断点看看,会不会进来:

在这里插入图片描述

正确进入,并且发现,如果isThisMyUrl()判断为true的话,会将这个默认节点删除,这就是我们想要的!

再进入isThisMyUrl打断点看看:

在这里插入图片描述

会发现格式化后url为localhost,而instance.getHostName()为计算机的名称,这里就有说法了,是不是只要在EurekaInstanceConfigBean中配置hostName这个属性,就能实现8761这个节点的去除,即不再报错呢?

先看下这个类中是否有这个属性:

在这里插入图片描述

果然有,进入到配置文件中配置试一下

eureka.instance.hostname = localhost

再次启动,看看节点是否被删除

在这里插入图片描述

果然执行了删除节点的方法,并且控制台不报错了。

总结
# 直接删除peer节点,单机启动
eureka.instance.hostname = localhost
#自连接解决
#eureka.client.service-url.defaultZone=http://localhost:9090/eureka
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐