記一次使用nacos2踩到的坑

前言

本文素材來(lái)源朋友學(xué)習(xí)nacos2.1.1踩到的坑。直接上正菜

坑點(diǎn)一:出現(xiàn)端口被占用

因?yàn)槭菍W(xué)習(xí)使用炉旷,朋友就在物理機(jī)搭建了搭建了nacos偽集群庶香,即ip都一樣掠河,端口分別為8848,8847,8849担平。然而啟動(dòng)nacos服務(wù)器后救崔,一臺(tái)正常啟動(dòng),其他兩臺(tái)都報(bào)了端口被占用

出現(xiàn)這種情況的原因纬黎,官網(wǎng)有做了解釋

image.png

通過(guò)官網(wǎng)我們可以很容易得知本今,這個(gè)端口被占用主要是因?yàn)間rpc引起的主巍,因?yàn)樗丝诘纳煞绞剑怯芍鞫丝?1000铐达、主端口+1001生成檬果。

解決方法

集群的端口不要采用相鄰數(shù)字唐断,步長(zhǎng)盡量搞大點(diǎn)脸甘。比如設(shè)置為7777偏灿、8888、9999之類(lèi)的

坑二:微服務(wù)項(xiàng)目啟動(dòng)出現(xiàn)com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING異常

這個(gè)問(wèn)題出現(xiàn)在朋友在項(xiàng)目中配置的nacos地址為nginx地址铆遭,配置示例如下

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

一開(kāi)始朋友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;
        }
        }

瀏覽器通過(guò)nginx訪問(wèn)沒(méi)問(wèn)題枚荣,但是項(xiàng)目中把nacos服務(wù)地址配置為nginx ip就報(bào)了

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

這個(gè)異常信息啼肩,后面朋友查資料,官網(wǎng)上有寫(xiě)

image.png

于是他就將轉(zhuǎn)發(fā)方式改為T(mén)CP害碾,他的nginx版本是1.9+以上版本慌随,默認(rèn)就支持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;
    }
}

當(dāng)朋友配置好nginx tcp代理轉(zhuǎn)發(fā)后州叠,通過(guò)telnet命令

telnet 127.0.0.1 9848

來(lái)看是否能正常轉(zhuǎn)發(fā)給nacos服務(wù)端凶赁,經(jīng)過(guò)驗(yàn)證逆甜,網(wǎng)絡(luò)可以連通交煞。接著朋友在微服務(wù)項(xiàng)目的nacos配置填寫(xiě)如下地址

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

本來(lái)以為萬(wàn)事大吉斟或,結(jié)果項(xiàng)目一啟動(dòng),仍然報(bào)

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

于是朋友懵了御毅,啥情況怜珍?就來(lái)找我交流一下


image.png

其實(shí)在nacos官網(wǎng)的FAQ就有提到相應(yīng)的解題思路了

image.png

因?yàn)槲覀冊(cè)趎ginx配置的代理tcp端口為9848绘面,這個(gè)端口可以看成是grpc的端口揭璃,因?yàn)間rpc的端口 = nacos主端口 + 1000,因此我們套這個(gè)公式就可以得出歼秽,nacos的主端口為 = 9848 - 1000 = 8848情组,而我們微服務(wù)項(xiàng)目配置nacos端口,其實(shí)配置是主端口肆氓,因此實(shí)際上我們配置要寫(xiě)成

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

配置這個(gè)后底瓣,果然成功注冊(cè)。這個(gè)思路是官網(wǎng)帶給我們的拨扶,但作為一個(gè)有點(diǎn)追求的程序員應(yīng)該不會(huì)僅僅滿(mǎn)足與此茁肠,我們可以直接根據(jù)控制臺(tái)報(bào)出的異常來(lái)獲取答案

異常排查過(guò)程就省略了垦梆,直接貼出關(guān)鍵的解題代碼

1仅孩、首先解析主端口號(hào)的核心代碼

位置在

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杠氢、其次設(shè)置grpc端口的核心代碼

位置在:

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

[圖片上傳失敗...(image-17c2d3-1660878696992)]
端口設(shè)置就是在截圖圈紅部分另伍,然后從this.rpcPortOffset()我們可以發(fā)現(xiàn)

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

這個(gè)偏移量是可以通過(guò)nacos.server.grpc.port.offset進(jìn)行修改摆尝,不修改默認(rèn)就是1000。因此跟蹤源碼勺爱,我們可以得出另外一種解法讯检。在微服務(wù)的nacos配置仍然填代理的nginx 的tcp地址,示例

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

同時(shí)啟動(dòng)的時(shí)候围段,加上

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

或者在主啟動(dòng)類(lèi)硬編碼也 可以

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

注: 這邊很重要的細(xì)節(jié)點(diǎn)就是:GRPC port = 主端口 + grpc端口偏移量投放,這個(gè)計(jì)算出來(lái)的端口值要和nginx代理tcp 端口值相等灸芳。

總結(jié)

因?yàn)榕笥延玫氖悄壳白钚掳娴膎acos2,所以有些問(wèn)題搜索引擎不是那么好找答案烙样,因此遇到這種問(wèn)題谒获,最好的解題思路就是官網(wǎng)和相應(yīng)的github,還有就是源碼跟蹤了。

后面那個(gè)
Client not connected, current status:STARTING儒洛,其實(shí)還有一種解法,就是把客戶(hù)端版本調(diào)低到1.x版本卦停,因?yàn)檫@個(gè)問(wèn)題本質(zhì)上是連接不上grpc問(wèn)題,因此我們可以不用grpc僵芹,直接用http就好了小槐,而2.x服務(wù)端版本是同時(shí)支持http和grpc凿跳,因此客戶(hù)端版本調(diào)成1.x,他就是以http的方式和服務(wù)端進(jìn)行交互茧彤。不過(guò)是不建議這么做疆栏,因?yàn)槟闵?jí)了2.x,有一方面就是為高性能珠洗,如果把版本降低博助,那還不如直接使用1.x就好了。

還有文中的那兩種解法蛔糯,我個(gè)人是建議不要改偏移量窖式,直接通過(guò)主端口 + 1000這種方式去算就好了

附錄

本文很多關(guān)于nacos2解題思路都是出自官網(wǎng)這篇文章

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萝喘,一起剝皮案震驚了整個(gè)濱河市阁簸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌启妹,老刑警劉巖饶米,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车胡,死亡現(xiàn)場(chǎng)離奇詭異匈棘,居然都是意外死亡析命,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)昼浦,“玉大人,你說(shuō)我怎么就攤上這事鸟蟹∈雇茫” “怎么了虐沥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)镐依。 經(jīng)常有香客問(wèn)我天试,道長(zhǎng)喜每,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任枫笛,我火速辦了婚禮刚照,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘海诲。我一直安慰自己檩互,他們只是感情好闸昨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布饵较。 她就那樣靜靜地躺著,像睡著了一般循诉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狈蚤,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天脆侮,我揣著相機(jī)與錄音勇劣,去河邊找鬼。 笑死幻捏,一個(gè)胖子當(dāng)著我的面吹牛退敦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓮下,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼讽坏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼例证!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胀葱,失蹤者是張志新(化名)和其女友劉穎漠秋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抵屿,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庆锦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧葛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搂抒。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尿扯,靈堂內(nèi)的尸體忽然破棺而出求晶,到底是詐尸還是另有隱情衷笋,我是刑警寧澤芳杏,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站右莱,受9級(jí)特大地震影響蚜锨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慢蜓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一亚再、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晨抡,春花似錦氛悬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至调煎,卻和暖如春镜遣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背士袄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工悲关, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娄柳。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓寓辱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赤拒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秫筏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容