nacos那邊可以看到服務(wù),但是健康狀態(tài)在1和0來回變更,查看日志,一直有這條日志的報錯。
本身使用沒什么問題,可以使用
default.ERROR: Nacos instance heartbeat failed: [0] caused: errCode: 400, errMsg: Current service DEFAULT_GROUP@@finance is persistent service, can't register ephemeral instance. ;. {"name":"main","trace":[]}
是不是webman這邊要實現(xiàn)什么功能啊
插件版本是1.2.2,我看默認(rèn)這個字段就是字符串類型的'false'
nacos版本是2.2.3 php版本是8.1。環(huán)境是centos7.6
我看了源碼,請求的nacos接口,都是v1,目前nacos比較新的版本都是2.x.x,2.x的文檔,沒有心跳的api,是不是因為這個原因。但是我看v2的文檔,它是兼容v1的
你的這個是因為之前注冊的是臨時實例,將臨時實例修改為非臨時實例時,nacos會報400錯誤,具體可自行百度can't register ephemeral instance相關(guān)內(nèi)容
按照目前的條件,ephemeral這個字段一直都默認(rèn)的‘false’,應(yīng)該是注冊的非臨時實例吧。心跳的發(fā)送信息,我也打印看了,也是非臨時實例的心跳。但是還是提示service DEFAULT_GROUP@@finance is persistent service, can't register ephemeral instance
按照網(wǎng)上的說法,把raft文件夾內(nèi)的清除,重啟nacos。其實并未解決問題。因為從開始就注冊的非臨時實例,后續(xù)發(fā)送的心跳也是非臨時實例的心跳參數(shù),目前還是這個錯誤日志。但是我覺得應(yīng)該不是該插件的問題了
我這邊經(jīng)過多個nacos-server版本的測試。2.0.3及之前的,沒有 is persistent service, can't register ephemeral instance這個報錯,但是會出現(xiàn)2個實例,1個健康,1個不健康這個問題。2.0.3之后的,沒有這個2個實例的問題,但是會出現(xiàn)is persistent service, can't register ephemeral instance
好的,感謝感謝,辛苦了。我這邊查了一些資料,資料上說,對于臨時實例,需要服務(wù)提供者主動向nacos發(fā)送心跳,5s一次,15s不發(fā),就從服務(wù)中剔除。對于永久實例,變成了由nacos主動探測服務(wù)提供者,它的探測周期是 2000 毫秒 + 隨機(jī)數(shù)(5000 毫秒以內(nèi)),如果檢測異常會將此服務(wù)實例,標(biāo)記為非健康實例,但不會把服務(wù)實例向臨時實例那樣進(jìn)行刪除。
在nacos2.0.4版本下,我嘗試在app.php中將要注冊的實例,'ephemeral' => 'true',主動標(biāo)記為臨時實例,則一切正常了,也不會出現(xiàn)心跳的錯誤日志了??赡茏兿嗟恼f明,對于永久實例,是不需要服務(wù)提供者主動心跳的
以上猜測,僅供參考,對nacos,我還是初學(xué)者
我好像找到原因了。根據(jù)上面的規(guī)則,永久實例是需要接受探測的,因為我的nacos是在容器內(nèi),如果配置的是127.0.0.1的話,nacos容器對宿主機(jī)的探測肯定是失敗的,我調(diào)整后,讓容器可以訪問宿主后,這個永久實例開始保持健康了,但是日志中仍然有主動心跳報錯的日志,應(yīng)該是需要移除那些永久實例的主動心跳
總的來說,如果nacos部署在docker的話,永久實例要保證容器內(nèi)的nacos可以訪問到服務(wù)提供者,這種容器內(nèi)的nacos-server其實建議直接使用臨時實例即可。
如果nacos是單獨部署的,或者mse的這種,可以使用永久實例,但是最好等待插件修復(fù)永久實例主動心跳的bug
總的來說,如果nacos部署在docker的話,永久實例要保證容器內(nèi)的nacos可以訪問到服務(wù)提供者,這種容器內(nèi)的nac> os-server其實建議直接使用臨時實例即可。
如果nacos是單獨部署的,或者mse的這種,可以使用永久實例,但是最好等待插件修復(fù)永久實例主動心跳的bug
其實也不是,因為本地測試時候下意識會注冊127.0.0.1,所以nacos如果在docker容器中會探測不到,但在實際生產(chǎn)環(huán)境中,填寫127.0.0.1的場景基本上不存在,所以大可不必?fù)?dān)心;
而當(dāng)nacos使用docker進(jìn)行本地開發(fā)環(huán)境部署的時候,為了保持統(tǒng)一,大概率其他項目也會同時使用docker環(huán)境,所以如果想要在開發(fā)環(huán)境中使用,其實注冊的時候通過host.docker.internal即可
心跳的發(fā)送信息如下:
{
["serviceName"]=>
string(11) "finance"
["ip"]=>
string(9) "127.0.0.1"
["port"]=>
int(9514)
["groupName"]=>
string(13) "DEFAULT_GROUP"
["namespaceId"]=>
string(0) ""
["ephemeral"]=>
bool(false)
["beat"]=>
string(58) "{"ip":"127.0.0.1","port":9514,"serviceName":"finance"}"
}