Heartsuit's Simple Blog

A place to hold mainly reading notes, and some technical stuff occasionally. 这里主要是一些读书笔记、感悟;还有部分技术相关的内容。


Project maintained by heartsuit Hosted on GitHub Pages — Theme by mattgraham

信创环境下微服务无法注册到注册中心:Notify connected event to listeners

目录[-]

背景

信创环境下微服务无法注册到注册中心

前段时间曾写过几篇关于微服务项目国产化迁移适配的文章,当时申请的主机是在统信操作系统,达梦8以及 TongWeb7 环境的测试适配,这几天要将微服务直接部署至实际线上环境:银河麒麟操作系统,达梦8数据库以及 TongWeb7 中间件。

按道理有了之前的测试迁移适配过程,该爬的坑应该都爬过了,可是这次在服务注册Nacos时遇到了问题,单单这个问题就耗费了我两天时间,不可思议。。

一开始部署时的环境如下:

  1. Tongweb7
  2. OpenJDK1.8
  3. Nacos2.0.4(修改源码编译后的适配达梦8的版本,可参考之前的文章:信创迁移适配实战-修改Nacos2.0.4源码以连接达梦数据库DM8

报错信息

以下是一次服务启动的报错信息。

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 启动命令开始,大概一分钟左右之后才会打印出第一条日志信息,然后又是大概一分钟左右,才会继续打印日志,这让人一度怀疑国产化的机器性能不要太差。。

我尝试了以下手段进行排查,可是并没有解决问题。

  1. 是我Nacos的版本问题?
  2. 本地服务能不能注册到信创环境下的Nacos?
  3. 是信创环境下的Java版本(JDK或者JRE)问题?
  4. 再看下官方文档,是不是我漏掉了什么?
  5. GitHub上看看Nacos的Issues,看别人有没有遇到类似问题?

问题排查

针对上述思路逐一进行排查。

  1. 使用Java8重新编译(以前修改Nacos源码适配达梦8用的是Java11)了Nacos2.0.4源码,同时将客户端中nacos-client2.0.3修改为2.0.4,以排除因版本不一致导致的问题。
  2. 通过VPN,我在本地开发环境直接直接启动本地微服务,连接服务器上的Nacos是可以正常注册的。
  3. 换了OracleJDK1.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 ,然而,报错依旧。

  1. 查看了官方文档,https://nacos.io/zh-cn/docs/2.0.0-compatibility.html,重新跟运维部确认了9848与9849端口是否开放,并在开发环境下用telnet完成测试,端口都OK。

2022-06-05-NacosPort.png

  1. GitHub上看Issueshttps://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。所以解决方法非常简单:

  1. 获取主机名;
  2. 将127.0.0.1与主机名写入本机DNS中:/etc/hosts
  3. 打完收工。
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!


「说点什么吧😊~~😊」: