A place to hold mainly reading notes, and some technical stuff occasionally. 这里主要是一些读书笔记、感悟;还有部分技术相关的内容。
目录[-]
信创环境下微服务无法注册到注册中心
前段时间曾写过几篇关于微服务项目国产化迁移适配的文章,当时申请的主机是在统信操作系统,达梦8以及 TongWeb7
环境的测试适配,这几天要将微服务直接部署至实际线上环境:银河麒麟操作系统,达梦8数据库以及 TongWeb7
中间件。
按道理有了之前的测试迁移适配过程,该爬的坑应该都爬过了,可是这次在服务注册Nacos时遇到了问题,单单这个问题就耗费了我两天时间,不可思议。。
一开始部署时的环境如下:
以下是一次服务启动的报错信息。
10:09:20.807 [main] ERROR c.a.n.c.r.c.g.GrpcClient - [printIfErrorEnabled,99] - Server check fail, please check server 172.27.204.156 ,port 9848 is available , error ={}
java.util.concurrent.TimeoutException: Waited 3000 milliseconds (plus 89577 nanoseconds delay) for com.alibaba.nacos.shaded.io.grpc.stub.ClientCalls$GrpcFuture@6b0c2d26[status=PENDING, info=[GrpcFuture{clientCall={delegate={delegate=ClientCallImpl{method=MethodDescriptor{fullMethodName=Request/request, type=UNARY, idempotent=false, safe=false, sampledToLocalTracing=true, requestMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@314c508a, responseMarshaller=com.alibaba.nacos.shaded.io.grpc.protobuf.lite.ProtoLiteUtils$MessageMarshaller@10b48321, schemaDescriptor=com.alibaba.nacos.api.grpc.auto.RequestGrpc$RequestMethodDescriptorSupplier@6b67034}}}}}]]
10:09:29.921 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 1 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:33.124 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 2 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:36.427 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 3 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:39.830 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 4 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:43.333 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 5 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:46.936 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 6 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:50.639 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 7 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:54.442 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Fail to connect server, after trying 8 times, last try server is {serverIp = '172.27.204.156', server main port = 8848}, error = unknown
10:09:55.575 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Success to connect a server [172.27.204.156:8848], connectionId = 1654135795360_172.27.204.156_57512
10:09:55.575 [com.alibaba.nacos.client.remote.worker] INFO c.a.n.c.r.client - [printIfInfoEnabled,60] - [cab27046-f921-49d6-9ae0-f125fdc81af3_config-0] Notify connected event to listeners.
在这个日志之后就没有反应了。。过一段时间会报错,主要是因为没有读到配置中心数据导致的 bean
依赖条件不满足。
从日志可以看出,先是报了个9848连不上的错误,然后就是每3秒(默认的超时时间timeout)尝试连接一次,直到第8次才会连接成功,但是再往下将客户端连接成功的消息通知到其他监听者时,没有后续了。。最终的结果是客户端的微服务无法注册到注册中心,并且不能读取配置中心的配置信息。从整个过程看,从一开始的 java -jar
启动命令开始,大概一分钟左右之后才会打印出第一条日志信息,然后又是大概一分钟左右,才会继续打印日志,这让人一度怀疑国产化的机器性能不要太差。。
我尝试了以下手段进行排查,可是并没有解决问题。
针对上述思路逐一进行排查。
Java8
重新编译(以前修改Nacos
源码适配达梦8用的是Java11
)了Nacos2.0.4
源码,同时将客户端中nacos-client
从2.0.3
修改为2.0.4
,以排除因版本不一致导致的问题。VPN
,我在本地开发环境直接直接启动本地微服务,连接服务器上的Nacos
是可以正常注册的。Oracle
的JDK1.8
作为服务器上的Java
环境。首先通过命令 alternatives --config java
查看默认的 Java
版本,发现用的是 OpenJDK
,下面改用 F
官方的 JDK1.8
# 从Oracle官方下载jdk-8u333-linux-aarch64.rpm,上传至信创服务器
# 安装
rpm -ivh jdk-8u333-linux-aarch64.rpm
# 配置环境变量:vi /etc/profile
# By Heartsuit: set java environment
export JAVA_HOME=/usr/java/jdk1.8.0_333-aarch64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=${JAVA_HOME}/jre
# 刷新配置:source /etc/profile
# 测试一下环境变量是否生效
echo $JAVA_HOME
# 配置默认的java
alternatives --config java
# 查看配置的Java版本是否生效
java -version
然后,重新启动 Nacos
,因为 Nacos
要用到 JAVA_HOME
,然而,报错依旧。
telnet
完成测试,端口都OK。GitHub
上看Issues
:https://github.com/alibaba/nacos/issues。主要搜索了以下两个问题相关的 Issues
,并没有解决方案。
Server check fail, please check server 172.27.204.156, port 9848 is available, error ={}
Notify connected event to listeners
显然,很不幸,以上方法都没有解决问题,甚至连原因都没有确定,我开始慌了。。
那么,开始死磕。
我再次分析了日志,发现每次启动jar服务都很慢,而且在连接Nacos成功之前大概需要1分钟左右的时间,这是怎么回事,是我打包有问题还是信创服务器性能差;申请的生产环境服务配置基本是8C16G标准,我开始怀疑是我打包有问题。
然后我就建了个 SpringBoot
空项目,在里面就写了个测试的 Controller
,包含一个 /hello
测试接口,暴露8000端,打包,上传,在信创服务器上直接启动,发现依然很慢,不过等了一会儿打印了以下内容,让我瞬间意识到问题了。
InetAddress.getLocalHost().getHostName() took 40029 milliseconds to respond.
直观地看,就是说我们的 SpringBoot
项目在获取主机名时耗费的时间过长了。简单查了这个错误信息后,解决方案便是设置下服务主机的DNS。所以解决方法非常简单:
/etc/hosts
;hostname
vi /etc/hosts
由于生产环境下涉及到的主机比较多,可以使用以下一行命令完成上述操作。
echo -e "127.0.0.1\t`hostname`" >> /etc/hosts
之后,重启微服务,发现启动速度飞快,并且成功注册到Nacos注册中心与配置中心,这TM才正常嘛。
Note:中间还遇到读取配置文件编码问题:
java -jar -Dfile.encoding=utf-8 service-name.jar
解决的过程很是曲折,问题终究还是解决了,可是,解决得很偶然。
至于为什么没有配置本地DNS会导致服务注册不上,我认为跟信创的网络环境有关系,因为信创本身的目的是为了安全,那么其内部的安全措施肯定是一套又一套,一层又一层。一开始我们申请的主机基本是铁板一块,用到的端口需要专门申请,不必要的端口不允许开放。那么,安全措施导致了内部网络环境复杂,可Nacos对各项的超时时间又比较敏感,导致客户端无法注册,也无法读取配置中心的信息。
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!