记一次使用nacos2踩到的坑

前言

本文素材来源朋友学习nacos2.1.1踩到的坑。直接上正菜

坑点一:出现端口被占用

因为是学习使用,朋友就在物理机搭建了搭建了nacos伪集群,即ip都一样,端口分别为8848,8847,8849。然而启动nacos服务器后,一台正常启动,其他两台都报了端口被占用

出现这种情况的原因,官网有做了解释

image.png

通过官网我们可以很容易得知,这个端口被占用主要是因为grpc引起的,因为他端口的生成方式,是由主端口+1000、主端口+1001生成。

解决方法

集群的端口不要采用相邻数字,步长尽量搞大点。比如设置为7777、8888、9999之类的

坑二:微服务项目启动出现com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING异常

这个问题出现在朋友在项目中配置的nacos地址为nginx地址,配置示例如下

spring.cloud.nacos.discovery.server-addr=nginx ip

一开始朋友nginx的配置示例如下

upstream nacos-cluster { 
        server 127.0.0.1:7777;
        server 127.0.0.1:8888;
        server 127.0.0.1:9999;
   }
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass http://nacos-cluster;
        }
        }

浏览器通过nginx访问没问题,但是项目中把nacos服务地址配置为nginx ip就报了

com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING

这个异常信息,后面朋友查资料,官网上有写

image.png

于是他就将转发方式改为TCP,他的nginx版本是1.9+以上版本,默认就支持TCP代理了,不用额外安装stream模块。nginx配置TCP的示例形如下


stream {
    upstream nacos-cluster-grpc{
        # nacos2版本,grpc端口与要比主端口多1000,主端口为7777、8888、9999
        server 127.0.0.1:8777;
        server 127.0.0.1:9888;
        server 127.0.0.1:10999; 
    }
    server{
       listen 9848;
        proxy_pass nacos-cluster-grpc;
    }
}

当朋友配置好nginx tcp代理转发后,通过telnet命令

telnet 127.0.0.1 9848

来看是否能正常转发给nacos服务端,经过验证,网络可以连通。接着朋友在微服务项目的nacos配置填写如下地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:9848 #nginx代理tcp的地址

本来以为万事大吉,结果项目一启动,仍然报

com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING

于是朋友懵了,啥情况?就来找我交流一下


image.png

其实在nacos官网的FAQ就有提到相应的解题思路了

image.png

因为我们在nginx配置的代理tcp端口为9848,这个端口可以看成是grpc的端口,因为grpc的端口 = nacos主端口 + 1000,因此我们套这个公式就可以得出,nacos的主端口为 = 9848 - 1000 = 8848,而我们微服务项目配置nacos端口,其实配置是主端口,因此实际上我们配置要写成

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #nginx代理tcp端口 - 1000

配置这个后,果然成功注册。这个思路是官网带给我们的,但作为一个有点追求的程序员应该不会仅仅满足与此,我们可以直接根据控制台报出的异常来获取答案

异常排查过程就省略了,直接贴出关键的解题代码

1、首先解析主端口号的核心代码

位置在

com.alibaba.nacos.common.remote.client.RpcClient#resolveServerInfo
ServerInfo private RpcClient.ServerInfo resolveServerInfo(String serverAddress) {
        Matcher matcher = EXCLUDE_PROTOCOL_PATTERN.matcher(serverAddress);
        if (matcher.find()) {
            serverAddress = matcher.group(1);
        }

        String[] ipPortTuple = serverAddress.split(":", 2);
        int defaultPort = Integer.parseInt(System.getProperty("nacos.server.port", "8848"));
        String serverPort = (String)CollectionUtils.getOrDefault(ipPortTuple, 1, Integer.toString(defaultPort));
        return new RpcClient.ServerInfo(ipPortTuple[0], NumberUtils.toInt(serverPort, defaultPort));
    }

2、其次设置grpc端口的核心代码

位置在:

com.alibaba.nacos.common.remote.client.grpc.GrpcClient#connectToServer

[图片上传失败...(image-17c2d3-1660878696992)]
端口设置就是在截图圈红部分,然后从this.rpcPortOffset()我们可以发现

public int rpcPortOffset() {
        return Integer.parseInt(System.getProperty("nacos.server.grpc.port.offset", String.valueOf(Constants.SDK_GRPC_PORT_DEFAULT_OFFSET)));
    }

这个偏移量是可以通过nacos.server.grpc.port.offset进行修改,不修改默认就是1000。因此跟踪源码,我们可以得出另外一种解法。在微服务的nacos配置仍然填代理的nginx 的tcp地址,示例

spring.cloud.nacos.discovery.server-addr=127.0.0.1:9848 #nginx代理tcp的地址

同时启动的时候,加上

-Dnacos.server.grpc.port.offset=0

或者在主启动类硬编码也 可以

    System.setProperty("nacos.server.grpc.port.offset","0");

注: 这边很重要的细节点就是:GRPC port = 主端口 + grpc端口偏移量,这个计算出来的端口值要和nginx代理tcp 端口值相等。

总结

因为朋友用的是目前最新版的nacos2,所以有些问题搜索引擎不是那么好找答案,因此遇到这种问题,最好的解题思路就是官网和相应的github,还有就是源码跟踪了。

后面那个
Client not connected, current status:STARTING,其实还有一种解法,就是把客户端版本调低到1.x版本,因为这个问题本质上是连接不上grpc问题,因此我们可以不用grpc,直接用http就好了,而2.x服务端版本是同时支持http和grpc,因此客户端版本调成1.x,他就是以http的方式和服务端进行交互。不过是不建议这么做,因为你升级了2.x,有一方面就是为高性能,如果把版本降低,那还不如直接使用1.x就好了。

还有文中的那两种解法,我个人是建议不要改偏移量,直接通过主端口 + 1000这种方式去算就好了

附录

本文很多关于nacos2解题思路都是出自官网这篇文章

https://nacos.io/zh-cn/docs/2.0.0-compatibility.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容