SpringCloud及Nacos服務(wù)注冊(cè)IP選擇問題解決方法
一、SpringCloud以及Nacos服務(wù)注冊(cè)IP選擇問題
場(chǎng)景:
微服務(wù)部署后,需要相互調(diào)用,其中服務(wù)A調(diào)用服務(wù)B時(shí)發(fā)現(xiàn)無法調(diào)用。其中服務(wù)注冊(cè)和發(fā)現(xiàn)以及配置中心使用Nacos
分析:
檢查了多遍代碼后,沒有發(fā)現(xiàn)調(diào)用方式有問題,所以只能是網(wǎng)絡(luò)問題。通過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。這就是問題所在了。
為什么注冊(cè)的IP和真實(shí)IP不符合呢?原因是Nacos客戶端在注冊(cè)服務(wù)時(shí)會(huì)從機(jī)器網(wǎng)卡中選擇一個(gè)IP來注冊(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)通的。
解決:
知道問題后,就要解決,查了一下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ò)展:
雖然問題解決了,但是還是要更深入的了解一下這個(gè)IP選擇的邏輯。翻了一通源碼發(fā)現(xiàn),其大致邏輯如下:
Nacos首先檢查有沒有ip及networkInterface配置,如果有則使用配置的IP,否則檢查networkInterface,并獲取IP,如果兩者都為空,則使用inetUtils.findFirstNonLoopbackHostInfo().getIpAddress()來獲取IP:
而findFirstNonLoopbackHostInfo()的部分邏輯如下:
它最終會(huì)返回一個(gè)匹配的IPV4地址,并且排除本機(jī)回環(huán)網(wǎng)絡(luò)(127.0.0.0-127.255.255.255),并且匹配是否是首選網(wǎng)絡(luò)(如果配置了preferredNetworks)。
二、注冊(cè)為指定IP和端口
如果選擇固定Ip注冊(cè)可以配置
spring.cloud.nacos.discovery.ip = 192.168.0.118 spring.cloud.nacos.discovery.port = 9000
如果選擇固定網(wǎng)卡配置項(xiàng)
spring.cloud.nacos.discovery.networkInterface = eth0
如果想更豐富的選擇,可以使用spring cloud 的工具 InetUtils進(jìn)行配置
spring.cloud.inetutils.default-hostname
spring.cloud.inetutils.default-ip-address
spring.cloud.inetutils.ignored-interfaces[0]=eth0 # 忽略網(wǎng)卡,eth0
spring.cloud.inetutils.ignored-interfaces=eth.* # 忽略網(wǎng)卡,eth.*,正則表達(dá)式
spring.cloud.inetutils.preferred-networks=10.34.12 # 選擇符合前綴的IP作為服務(wù)注冊(cè)IP
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces
更多配置
spring.cloud.nacos.discovery.server-addr #Nacos Server 啟動(dòng)監(jiān)聽的ip地址和端口
spring.cloud.nacos.discovery.service #給當(dāng)前的服務(wù)命名
spring.cloud.nacos.discovery.weight #取值范圍 1 到 100,數(shù)值越大,權(quán)重越大
spring.cloud.nacos.discovery.network-interface #當(dāng)IP未配置時(shí),注冊(cè)的IP為此網(wǎng)卡所對(duì)應(yīng)的IP地址,如果此項(xiàng)也未配置,則默認(rèn)取第一塊網(wǎng)卡的地址
spring.cloud.nacos.discovery.ip # 優(yōu)先級(jí)最高
spring.cloud.nacos.discovery.port # 默認(rèn)情況下不用配置,會(huì)自動(dòng)探測(cè)
spring.cloud.nacos.discovery.namespace # 常用場(chǎng)景之一是不同環(huán)境的注冊(cè)的區(qū)分隔離,例如開發(fā)測(cè)試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等。 spring.cloud.nacos.discovery.access-key # 當(dāng)要上阿里云時(shí),阿里云上面的一個(gè)云賬號(hào)名
spring.cloud.nacos.discovery.secret-key # 當(dāng)要上阿里云時(shí),阿里云上面的一個(gè)云賬號(hào)密碼
spring.cloud.nacos.discovery.metadata #使用Map格式配置,用戶可以根據(jù)自己的需要自定義一些和服務(wù)相關(guān)的元數(shù)據(jù)信息
spring.cloud.nacos.discovery.log-name # 日志文件名
spring.cloud.nacos.discovery.enpoint # 地域的某個(gè)服務(wù)的入口域名,通過此域名可以動(dòng)態(tài)地拿到服務(wù)端地址
ribbon.nacos.enabled # 是否集成Ribbon 默認(rèn)為true
三、通過內(nèi)網(wǎng)ip注冊(cè)為指定外網(wǎng)ip
Nacos注冊(cè)中心是: https://github.com/alibaba/nacos
各個(gè)服務(wù)通過Nacos客戶端將服務(wù)信息注冊(cè)到Nacos上,當(dāng)Nacos服務(wù)注冊(cè)的IP默認(rèn)選擇出問題時(shí),可以通過查閱對(duì)應(yīng)的客戶端文檔,來選擇配置不同的IP。
大多公司服務(wù)器環(huán)境會(huì)有兩套ip,一套是對(duì)內(nèi)網(wǎng),一套是對(duì)外網(wǎng)。即同一臺(tái)服務(wù)器,有對(duì)應(yīng)兩個(gè)ip(例:10.0.0.1,100.0.0.1)。
在使用nacos做為注冊(cè)中心,由于內(nèi)網(wǎng)環(huán)境的因素,A服務(wù)注冊(cè)上去的ip可能是100.0.0.1,B服務(wù)注冊(cè)上去的ip可能是10.0.0.2,經(jīng)驗(yàn)證10之間調(diào)用互通,100之間也互通。但10調(diào)用100不同,或者反之也不行。
解決方案:
配置文件加如下配置:
nacos-ip-100.0.0.1 = 10.0.0.1 spring.cloud.nacos.discovery.ip = ${nacos-ip-${spring.cloud.client.ip-address}}
四、Nacos服務(wù)注冊(cè)地址為內(nèi)網(wǎng)IP的解決辦法
問題
最近在使用Spring Cloud Alibaba
這一套微服務(wù)解決方案,但是在服務(wù)注冊(cè)的時(shí)候,網(wǎng)關(guān)死活找不到微服務(wù)地址,自己的微服務(wù)通過網(wǎng)關(guān)怎么也訪問不到。
查找原因
仔細(xì)一查才發(fā)現(xiàn),網(wǎng)關(guān)去訪問了一個(gè)莫名其妙的IP地址,
去Nacos服務(wù)詳情去看,果然,我的微服務(wù)注冊(cè)到Nacos的IP地址上也是這個(gè)地址,
然后我去我電腦查找這個(gè)IP地址,還真有這么一個(gè)地址,那么問題來了,Nacos為什么會(huì)隨意找個(gè)本機(jī)IP地址然后注冊(cè)上去?
Nacos服務(wù)注冊(cè)的IP
Nacos注冊(cè)中心是: https://github.com/alibaba/nacos
各個(gè)服務(wù)通過Nacos客戶端將服務(wù)信息注冊(cè)到Nacos上
當(dāng)Nacos服務(wù)注冊(cè)的IP默認(rèn)選擇出問題時(shí),可以通過查閱對(duì)應(yīng)的客戶端文檔,來選擇配置不同的網(wǎng)卡或者IP
(參考o(jì)rg.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties的配置
)
解決辦法
例如,使用了Spring cloud alibaba(官方文檔)作為Nacos客戶端,
服務(wù)默認(rèn)獲取了內(nèi)網(wǎng)IP 192.168.1.21,
可以通過配置spring.cloud.inetutils.preferred-networks=10.34.12
,使服務(wù)獲取內(nèi)網(wǎng)中前綴為10.34.12的IP
如何配置
# 如果選擇固定Ip注冊(cè)可以配置 spring.cloud.nacos.discovery.ip = 10.2.11.11 spring.cloud.nacos.discovery.port = 9090 # 如果選擇固定網(wǎng)卡配置項(xiàng) spring.cloud.nacos.discovery.networkInterface = eth0 # 如果想更豐富的選擇,可以使用spring cloud 的工具 InetUtils進(jìn)行配置 # 具體說明可以自行檢索: https://github.com/spring-cloud/spring-cloud-commons/blob/master/docs/src/main/asciidoc/spring-cloud-commons.adoc spring.cloud.inetutils.default-hostname spring.cloud.inetutils.default-ip-address spring.cloud.inetutils.ignored-interfaces[0]=eth0 # 忽略網(wǎng)卡,eth0 spring.cloud.inetutils.ignored-interfaces=eth.* # 忽略網(wǎng)卡,eth.*,正則表達(dá)式 spring.cloud.inetutils.preferred-networks=10.34.12 # 選擇符合前綴的IP作為服務(wù)注冊(cè)IP spring.cloud.inetutils.timeout-seconds spring.cloud.inetutils.use-only-site-local-interfaces
更多配置
spring.cloud.nacos.discovery.server-addr #Nacos Server 啟動(dòng)監(jiān)聽的ip地址和端口 spring.cloud.nacos.discovery.service #給當(dāng)前的服務(wù)命名 spring.cloud.nacos.discovery.weight #取值范圍 1 到 100,數(shù)值越大,權(quán)重越大 spring.cloud.nacos.discovery.network-interface #當(dāng)IP未配置時(shí),注冊(cè)的IP為此網(wǎng)卡所對(duì)應(yīng)的IP地址,如果此項(xiàng)也未配置,則默認(rèn)取第一塊網(wǎng)卡的地址 spring.cloud.nacos.discovery.ip # 優(yōu)先級(jí)最高 spring.cloud.nacos.discovery.port # 默認(rèn)情況下不用配置,會(huì)自動(dòng)探測(cè) spring.cloud.nacos.discovery.namespace # 常用場(chǎng)景之一是不同環(huán)境的注冊(cè)的區(qū)分隔離,例如開發(fā)測(cè)試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等。 spring.cloud.nacos.discovery.access-key # 當(dāng)要上阿里云時(shí),阿里云上面的一個(gè)云賬號(hào)名 spring.cloud.nacos.discovery.secret-key # 當(dāng)要上阿里云時(shí),阿里云上面的一個(gè)云賬號(hào)密碼 spring.cloud.nacos.discovery.metadata #使用Map格式配置,用戶可以根據(jù)自己的需要自定義一些和服務(wù)相關(guān)的元數(shù)據(jù)信息 spring.cloud.nacos.discovery.log-name # 日志文件名 spring.cloud.nacos.discovery.enpoint # 地域的某個(gè)服務(wù)的入口域名,通過此域名可以動(dòng)態(tài)地拿到服務(wù)端地址 ribbon.nacos.enabled # 是否集成Ribbon 默認(rèn)為true
五、較合理的實(shí)現(xiàn)方式
1.使用docker進(jìn)行部署
- 項(xiàng)目打包的時(shí)候指定映射后的注冊(cè)IP和端口或者ip前綴
- 打包進(jìn)鏡像之后運(yùn)行容器,設(shè)置上方指定的端口映射
- 這樣也能指定局域網(wǎng)的IP也可以通過docker將相關(guān)端口進(jìn)行映射出來
問題,假如需要映射到公網(wǎng)IP?
2.也可以通過網(wǎng)關(guān)進(jìn)行整改,所有服務(wù)都走網(wǎng)關(guān),
- 只需要將網(wǎng)關(guān)部署到連接內(nèi)網(wǎng)服務(wù)的網(wǎng)卡上面,將網(wǎng)關(guān)的端口進(jìn)行映射出去供外部調(diào)用
- 問題,服務(wù)間的調(diào)用需要保證注冊(cè)網(wǎng)絡(luò)是統(tǒng)一網(wǎng)絡(luò)
3.通過自定義主機(jī)域名,或者本地dns服務(wù),
- 給每個(gè)服務(wù)指定域名
- 服務(wù)注冊(cè)時(shí)候需要將域名進(jìn)行者注冊(cè)上去,
問題:可能會(huì)更麻煩但是對(duì)于網(wǎng)絡(luò)較為復(fù)雜的情況會(huì)改善一點(diǎn)勞動(dòng)量
到此這篇關(guān)于SpringCloud以及Nacos服務(wù)注冊(cè)IP選擇問題的文章就介紹到這了,更多相關(guān)SpringCloud Nacos服務(wù)注冊(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springCloud集成nacos config的過程
- SpringCloud-Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)方式
- SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查
- springcloud nacos的賦值均衡和動(dòng)態(tài)刷新
- Alibaba?SpringCloud集成Nacos、openFeign實(shí)現(xiàn)負(fù)載均衡的解決方案
- SpringCloud Nacos集群搭建過程詳解
- springcloud+nacos實(shí)現(xiàn)灰度發(fā)布示例詳解
- springCloud集成nacos啟動(dòng)時(shí)報(bào)錯(cuò)原因排查
- Spring Cloud Nacos配置管理方案
相關(guān)文章
logback TimeBasedRollingPolicy按天生成日志源碼解析
這篇文章主要為大家介紹了logback TimeBasedRollingPolicy按天生成日志源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11解決Spring運(yùn)行時(shí)報(bào)錯(cuò):Consider defining a bean o
該文章主要講述了在使用Spring框架時(shí),如果遇到某個(gè)bean未找到的錯(cuò)誤,應(yīng)該在配置文件中定義該bean,解決方法是在對(duì)應(yīng)的類上添加@Component注解2025-01-01ssm框架+PageHelper插件實(shí)現(xiàn)分頁(yè)查詢功能
今天小編教大家如何通過ssm框架+PageHelper插件實(shí)現(xiàn)分頁(yè)查詢功能,首先大家需要新建一個(gè)maven工程引入jar包,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-06-06VSCode中開發(fā)JavaWeb項(xiàng)目的詳細(xì)過程(Maven+Tomcat+熱部署)
這篇文章主要介紹了VSCode中開發(fā)JavaWeb項(xiàng)目(Maven+Tomcat+熱部署),本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Java面試synchronized偏向鎖后hashcode存址
這篇文章主要為大家介紹了Java面試中synchronized偏向鎖后hashcode存址詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05JVM堆內(nèi)存溢出后,其他線程是否可繼續(xù)工作的問題解析
這篇文章主要介紹了JVM 堆內(nèi)存溢出后,其他線程是否可繼續(xù)工作?,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Java輕松使用工具類實(shí)現(xiàn)獲取wav時(shí)間長(zhǎng)度
在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來獲取一個(gè)wav文件的時(shí)間長(zhǎng)度,感興趣的同學(xué)繼續(xù)往下閱讀吧2021-10-10