由于公司内部办公需要使用内部vpn,导致会新增加一个ip地址,导致udp推送的ip不正确,而springcloud-alibaba 2021.0.1
使用的nacos-client
版本为1.x
,dubbo
获取实例信息数据不及时,一个服务重启时,服务实例信息更新不及时,抛出
java.util.concurrent.ExecutionException: org.apache.dubbo.rpc.RpcException: No provider available from registry 192.168.5.110:8848 for service xxxx:1.0.0 on consumer 192.168.5.125 use dubbo version 2.7.
产生原因
从NacosNamingService中调用获取所有实例方法getAllInstances
的时候,会默认吧是否订阅设置为true
在进入到具体方法实现内部中,可以看到使用了HostReactor
这个类的getServiceInfo
方法,
关于HostReactor
这个类中会开启udp推送
我们在回到getServiceInfo
方法,第一个获取实例的时候,会更新udp订阅信息,包括本机ip和port信息
在更新该服务订阅信息udp信息的时候会获取本机ip
由于这里获取到的本机ip 使用的jdk的 InetAddress.getLocalHost().getHostAddress()
的方法,它的工作原理是获取hostname的所有ip然后去数组的第0个,也就是网卡活跃点最高的ip,并没有去判断该ip是否可以使用,因此导致上报udp的ip不正确
导致的结果
udp的ip不正确导致的结果是nacos中服务订阅者ip也不正确,udp推送的时候也不能及时推送成功,从而导致服务实例信息更新的不够及时,只能依赖长轮询更新服务实例信息
解决办法
-
如果nacos server版本是2.x以上,但是使用的
nacos-client
客户端jar包是1.x
(1.x更新策略是udp+10s定时http)的那么可以尝试更新nacos-client
到2.x
,2.x
以上的版本会使用grpc
长连接进行服务实例信息更新,grpc
默认端口是nacos的http端口8848
加上1000
偏移量 -
添加环境变量参数
com.alibaba.nacos.client.naming.local.ip=192.168.5.125
再次查看服务的订阅者可以看到ip变为正常了