SpringCloud 服務(wù)注冊(cè)IP錯(cuò)誤的解決
SpringCloud 服務(wù)注冊(cè)IP錯(cuò)誤
1、錯(cuò)誤原因
在服務(wù)注冊(cè)的時(shí)候,是使用 spring.cloud.client.ipAddress 這個(gè)變量,如果本機(jī)有多個(gè)網(wǎng)卡,那么可能會(huì)把不是本機(jī)以太網(wǎng)的網(wǎng)卡地址注冊(cè)上去。
使用 ipconfig 可以看到,本機(jī)上有多個(gè)以太網(wǎng)適配器,而每個(gè)以太網(wǎng)適配器,都有一個(gè) IPv4 地址,這時(shí)注冊(cè)上去的 IP,就是其中一個(gè),卻不一定是正確的那個(gè)。
2、處理
2.1、禁用其他網(wǎng)卡
到電腦的 更改適配器 設(shè)置中,將不是本機(jī)以太網(wǎng)的其他網(wǎng)卡禁用
2.2、配置
到電腦的設(shè)備管理器 --> 網(wǎng)絡(luò)適配器 中,可以看到所有的網(wǎng)卡名
在要注冊(cè)的服務(wù)中配置一下內(nèi)容:
//忽略指定正則匹配的網(wǎng)卡的配置,我這里配置了VM虛擬機(jī)和Docker的 spring.cloud.inetutils.ignoredInterfaces=['VMware.*','Hyper-V.*'] //指定默認(rèn)IP,可以使IP段 spring.cloud.inetutils.preferredNetworks=['192.168'] spring.cloud.inetutils.use-only-site-local-interfaces=true
SpringCloud以及Nacos服務(wù)注冊(cè)IP選擇
微服務(wù)部署后,需要相互調(diào)用,其中服務(wù)A調(diào)用服務(wù)B時(shí)發(fā)現(xiàn)無(wú)法調(diào)用。其中服務(wù)注冊(cè)和發(fā)現(xiàn)以及配置中心使用Nacos
分析:
檢查了多遍代碼后,沒(méi)有發(fā)現(xiàn)調(diào)用方式有問(wèn)題,所以只能是網(wǎng)絡(luò)問(wèn)題。通過(guò)postman直接調(diào)用服務(wù)B,發(fā)現(xiàn)可以調(diào)通,但是使用服務(wù)A不行,于是檢查服務(wù)A在注冊(cè)中心注冊(cè)的IP,發(fā)現(xiàn)和并不是服務(wù)B啟動(dòng)機(jī)器的IP。這就是問(wèn)題所在了。
為什么注冊(cè)的IP和真實(shí)IP不符合呢?原因是Nacos客戶端在注冊(cè)服務(wù)時(shí)會(huì)從機(jī)器網(wǎng)卡中選擇一個(gè)IP來(lái)注冊(cè),當(dāng)機(jī)器存在多個(gè)網(wǎng)卡(例如存在虛擬網(wǎng)卡)時(shí),所選則的IP可能不是真是的物理機(jī)的IP,所以,當(dāng)注冊(cè)了的是非真實(shí)IP后,另一臺(tái)機(jī)器調(diào)用時(shí)是不可能調(diào)通的。
解決:
知道問(wèn)題后,就要解決,查了一下SpringCloud的官方文檔,發(fā)現(xiàn)有一項(xiàng)配置如下:
Sometimes, it is useful to ignore certain named network interfaces so that they can be excluded from Service Discovery registration (for example, when running in a Docker container).
A list of regular expressions can be set to cause the desired network interfaces to be ignored.
You can also force the use of only specified network addresses by using a list of regular expressions.
spring: cloud: inetutils: preferredNetworks: - 192.168 - 10.0
該項(xiàng)配置用于指定首選IP,當(dāng)有多個(gè)網(wǎng)卡時(shí),指定該IP地址后(支持正則),客戶端在選擇IP時(shí)就會(huì)選擇符合preferredNetworks配置的IP地址進(jìn)行注冊(cè)。
同樣的,Nacos也可以配置自己的首選IP以及網(wǎng)卡選擇:
spring.cloud.nacos.discovery.ip: spring.cloud.nacos.discovery.networkInterface
我們選擇其中一個(gè)配置就可以,都能達(dá)到相同的效果。
擴(kuò)展:
雖然問(wèn)題解決了,但是還是要更深入的了解一下這個(gè)IP選擇的邏輯。翻了一通源碼發(fā)現(xiàn),其大致邏輯如下:
Nacos首先檢查有沒(méi)有ip及networkInterface配置,如果有則使用配置的IP,否則檢查networkInterface,并獲取IP,如果兩者都為空,則使用inetUtils.findFirstNonLoopbackHostInfo().getIpAddress()來(lái)獲取IP:
而findFirstNonLoopbackHostInfo()的部分邏輯如下:
它最終會(huì)返回一個(gè)匹配的IPV4地址,并且排除本機(jī)回環(huán)網(wǎng)絡(luò)(127.0.0.0-127.255.255.255),并且匹配是否是首選網(wǎng)絡(luò)(如果配置了preferredNetworks)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java中l(wèi)ong(Long)與int(Integer)之間的轉(zhuǎn)換方式
這篇文章主要介紹了java中l(wèi)ong(Long)與int(Integer)之間的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10如何解決springboot數(shù)據(jù)庫(kù)查詢時(shí)出現(xiàn)的時(shí)區(qū)差異問(wèn)題
這篇文章主要介紹了如何解決springboot數(shù)據(jù)庫(kù)查詢時(shí)出現(xiàn)的時(shí)區(qū)差異問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Java連接Oracle數(shù)據(jù)庫(kù)實(shí)例解析
數(shù)據(jù)庫(kù)的操作是當(dāng)前系統(tǒng)開(kāi)發(fā)必不可少的開(kāi)發(fā)部分之一。接下來(lái)通過(guò)本文給大家介紹Java連接Oracle數(shù)據(jù)庫(kù)實(shí)例解析,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06Java實(shí)現(xiàn)高效隨機(jī)數(shù)算法的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)高效隨機(jī)數(shù)算法的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Java 知識(shí)難點(diǎn)之異常的認(rèn)知與使用詳解
所謂異常是指程序在運(yùn)行時(shí)出現(xiàn)錯(cuò)誤時(shí)提示調(diào)用者的機(jī)制,異常的種類有很多,不同種類的異常有不同的含義,也有不同的處理方式,通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09java基于odbc連接oracle的實(shí)現(xiàn)方法
這篇文章主要介紹了java基于odbc連接oracle的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了連接操作的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-09-09