这是我项目的配置<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
<alibaba.nacos.version>2.0.3</alibaba.nacos.version>
————————————————
我的现象:本地eclpse 启动或者jar启动都没问题;linux服务器,有的可以有的不行。就是找不到nacos上的配置文件。(不想看我啰嗦的直接看最下黑体部分)。
继上两个帖子之后,我一直在看nacos-client源码,2.x之后是用了rpc。读不到配置是因为RpcClient currentConnection这个初始化没有成功,是个null。
在启动项目过程中,会有一个线程读取配置,还有个线程去负责生成rpc链接相关东西。rpcclient类中start方法中有段代码:
int startUpRetryTimes = RETRY_TIMES;
while (startUpRetryTimes > 0 && connectToServer == null) {
try {
startUpRetryTimes--;
ServerInfo serverInfo = nextRpcServer();
LoggerUtils.printIfInfoEnabled(LOGGER, "[{}] Try to connect to server on start up, server: {}", name,
serverInfo);
connectToServer = connectToServer(serverInfo);
} catch (Throwable e) {
LoggerUtils.printIfWarnEnabled(LOGGER,
"[{}]Fail to connect to server on start up, error message={}, start up retry times left: {}",
name, e.getMessage(), startUpRetryTimes);
}
}
这段代码就是重试获取rpc链接,默认RETRY_TIMES是3. 不知道自己电脑无论是eclipse还是打jar运行jar,在重试三次过程中都能获取到链接,但是放服务器上3次就不行,这是为啥呢?
最后一个做底层语言的同事找到原因,因为服务器上配置了dns,项目启动的时候会连这玩意,这里会导致浪费时间,所以在试了3次时还没创建好连接。下面解决方案。
解决办法两种:
动服务器配置。1 将项目所在服务器中/etc/hosts中加入127.0.0.1 aaa,aaa是你机器的名称;2或者vim /etc/resolv.conf 注释掉里面dns。这里要感谢大坤同志。
改源码。可以调整重试次数,大一点,反正connectToServer不null就结束了;或者直接加sleep。(eclpse项目 maven dependencies中找到nacos-common包找到com.alibaba.nacos.common.remote.client.RpcClient, 然后打开,复制出来代码,在项目里建个类,考进去,按照原路径创建。就可以改了。)