一、问题描述
因为我们现在项目用的 nacos 做注册中心,后台开发想和前台开发做联调时,后台开发需要起多个服务,很麻烦,加上最近架构师在搞灰度发布,我这边就顺便利用他的这个灰度发布,来简化本地的联调方式,所以就需要把开发的服务注册到测试环境的 nacos 上,在启动服务的时候,出现了这个报错:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
二、问题排查
首先看日志,因为我们使用的 k8s 部署,运维伙伴把 nacos 的8848端口映射出来是31048端口
发现配置中的端口号和日志中的端口号不一致,日志中的多了1000,于是去看这句日志,在 com.alibaba.nacos.common.remote.client.grpc.GrpcClient#serverCheck
里
所以在这里打上断点,想看看 port 属性是如何赋值的,最终在 com.alibaba.nacos.common.remote.client.grpc.GrpcClient#connectToServer
里找到
可以看到,这个 port 在原本端口的基础上,增加了一个偏移量,这个 rpcPortOffset 方法点进去之后,会发现有两个实现
走的是 com.alibaba.nacos.common.remote.client.grpc.GrpcSdkClient ,最终取的是 com.alibaba.nacos.api.common.Constants#SDK_GRPC_PORT_DEFAULT_OFFSET 这个常量,就是1000
再去查阅官方文档,发现,nacos在2.0版本之后增加了 gRPC 的通讯方式,所以增加了端口,这个端口就是在主端口上增加一定的偏移量
所以原因就是 nacos 的9848端口没有映射出来导致
三、解决问题
让运维伙伴增加了9848端口的映射32048端口,问题得到解决
四、后续
ps:虽然改完后,服务可以注册上去了,但是由于我们服务里有很多接口是需要通过 openFeign 去连别的服务的,本地服务想要连 k8s 集群里的服务,是连不上的,所以最后还是没有完成本地开发联调的优化,但是还是有学到东西的,如果有哪位大佬知道怎么解决,欢迎评论区指教。