欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringCloud及Nacos服務注冊IP選擇問題解決方法

 更新時間:2024年01月09日 11:25:38   作者:算了吧,你不配  
這篇文章主要介紹了SpringCloud及Nacos服務注冊IP選擇問題,為什么注冊的IP和真實IP不符合呢,原因是Nacos客戶端在注冊服務時會從機器網(wǎng)卡中選擇一個IP來注冊,所以,當注冊了的是非真實IP后,另一臺機器調(diào)用時是不可能調(diào)通的,知道問題原因就是解決方法,一起看看吧

一、SpringCloud以及Nacos服務注冊IP選擇問題

場景:

微服務部署后,需要相互調(diào)用,其中服務A調(diào)用服務B時發(fā)現(xiàn)無法調(diào)用。其中服務注冊和發(fā)現(xiàn)以及配置中心使用Nacos

分析:

檢查了多遍代碼后,沒有發(fā)現(xiàn)調(diào)用方式有問題,所以只能是網(wǎng)絡問題。通過postman直接調(diào)用服務B,發(fā)現(xiàn)可以調(diào)通,但是使用服務A不行,于是檢查服務A在注冊中心注冊的IP,發(fā)現(xiàn)和并不是服務B啟動機器的IP。這就是問題所在了。

為什么注冊的IP和真實IP不符合呢?原因是Nacos客戶端在注冊服務時會從機器網(wǎng)卡中選擇一個IP來注冊,當機器存在多個網(wǎng)卡(例如存在虛擬網(wǎng)卡)時,所選則的IP可能不是真是的物理機的IP,所以,當注冊了的是非真實IP后,另一臺機器調(diào)用時是不可能調(diào)通的。

解決:

知道問題后,就要解決,查了一下SpringCloud的官方文檔,發(fā)現(xiàn)有一項配置如下:

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

該項配置用于指定首選IP,當有多個網(wǎng)卡時,指定該IP地址后(支持正則),客戶端在選擇IP時就會選擇符合preferredNetworks配置的IP地址進行注冊。

同樣的,Nacos也可以配置自己的首選IP以及網(wǎng)卡選擇:

spring.cloud.nacos.discovery.ip:
spring.cloud.nacos.discovery.networkInterface

我們選擇其中一個配置就可以,都能達到相同的效果。

擴展:

雖然問題解決了,但是還是要更深入的了解一下這個IP選擇的邏輯。翻了一通源碼發(fā)現(xiàn),其大致邏輯如下:

Nacos首先檢查有沒有ip及networkInterface配置,如果有則使用配置的IP,否則檢查networkInterface,并獲取IP,如果兩者都為空,則使用inetUtils.findFirstNonLoopbackHostInfo().getIpAddress()來獲取IP:

而findFirstNonLoopbackHostInfo()的部分邏輯如下:

它最終會返回一個匹配的IPV4地址,并且排除本機回環(huán)網(wǎng)絡(127.0.0.0-127.255.255.255),并且匹配是否是首選網(wǎng)絡(如果配置了preferredNetworks)。

二、注冊為指定IP和端口

如果選擇固定Ip注冊可以配置

spring.cloud.nacos.discovery.ip = 192.168.0.118
spring.cloud.nacos.discovery.port = 9000

如果選擇固定網(wǎng)卡配置項

spring.cloud.nacos.discovery.networkInterface = eth0

如果想更豐富的選擇,可以使用spring cloud 的工具 InetUtils進行配置

具體說明可以自行檢索: 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.*,正則表達式
spring.cloud.inetutils.preferred-networks=10.34.12 # 選擇符合前綴的IP作為服務注冊IP
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces

更多配置

spring.cloud.nacos.discovery.server-addr #Nacos Server 啟動監(jiān)聽的ip地址和端口
spring.cloud.nacos.discovery.service #給當前的服務命名
spring.cloud.nacos.discovery.weight #取值范圍 1 到 100,數(shù)值越大,權(quán)重越大
spring.cloud.nacos.discovery.network-interface #當IP未配置時,注冊的IP為此網(wǎng)卡所對應的IP地址,如果此項也未配置,則默認取第一塊網(wǎng)卡的地址
spring.cloud.nacos.discovery.ip # 優(yōu)先級最高
spring.cloud.nacos.discovery.port # 默認情況下不用配置,會自動探測
spring.cloud.nacos.discovery.namespace # 常用場景之一是不同環(huán)境的注冊的區(qū)分隔離,例如開發(fā)測試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務)隔離等。 spring.cloud.nacos.discovery.access-key # 當要上阿里云時,阿里云上面的一個云賬號名
spring.cloud.nacos.discovery.secret-key # 當要上阿里云時,阿里云上面的一個云賬號密碼
spring.cloud.nacos.discovery.metadata #使用Map格式配置,用戶可以根據(jù)自己的需要自定義一些和服務相關的元數(shù)據(jù)信息
spring.cloud.nacos.discovery.log-name # 日志文件名
spring.cloud.nacos.discovery.enpoint # 地域的某個服務的入口域名,通過此域名可以動態(tài)地拿到服務端地址
ribbon.nacos.enabled # 是否集成Ribbon 默認為true

三、通過內(nèi)網(wǎng)ip注冊為指定外網(wǎng)ip

Nacos注冊中心是: https://github.com/alibaba/nacos

各個服務通過Nacos客戶端將服務信息注冊到Nacos上,當Nacos服務注冊的IP默認選擇出問題時,可以通過查閱對應的客戶端文檔,來選擇配置不同的IP。

大多公司服務器環(huán)境會有兩套ip,一套是對內(nèi)網(wǎng),一套是對外網(wǎng)。即同一臺服務器,有對應兩個ip(例:10.0.0.1,100.0.0.1)。

在使用nacos做為注冊中心,由于內(nèi)網(wǎng)環(huán)境的因素,A服務注冊上去的ip可能是100.0.0.1,B服務注冊上去的ip可能是10.0.0.2,經(jīng)驗證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服務注冊地址為內(nèi)網(wǎng)IP的解決辦法

問題

最近在使用Spring Cloud Alibaba這一套微服務解決方案,但是在服務注冊的時候,網(wǎng)關死活找不到微服務地址,自己的微服務通過網(wǎng)關怎么也訪問不到。

查找原因

仔細一查才發(fā)現(xiàn),網(wǎng)關去訪問了一個莫名其妙的IP地址,
去Nacos服務詳情去看,果然,我的微服務注冊到Nacos的IP地址上也是這個地址,
然后我去我電腦查找這個IP地址,還真有這么一個地址,那么問題來了,Nacos為什么會隨意找個本機IP地址然后注冊上去?

Nacos服務注冊的IP

Nacos注冊中心是: https://github.com/alibaba/nacos
各個服務通過Nacos客戶端將服務信息注冊到Nacos上
當Nacos服務注冊的IP默認選擇出問題時,可以通過查閱對應的客戶端文檔,來選擇配置不同的網(wǎng)卡或者IP
參考org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties的配置

解決辦法

例如,使用了Spring cloud alibaba(官方文檔)作為Nacos客戶端,
服務默認獲取了內(nèi)網(wǎng)IP 192.168.1.21,
可以通過配置spring.cloud.inetutils.preferred-networks=10.34.12,使服務獲取內(nèi)網(wǎng)中前綴為10.34.12的IP

如何配置

# 如果選擇固定Ip注冊可以配置
spring.cloud.nacos.discovery.ip = 10.2.11.11
spring.cloud.nacos.discovery.port = 9090
# 如果選擇固定網(wǎng)卡配置項
spring.cloud.nacos.discovery.networkInterface = eth0
# 如果想更豐富的選擇,可以使用spring cloud 的工具 InetUtils進行配置
# 具體說明可以自行檢索: 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.*,正則表達式
spring.cloud.inetutils.preferred-networks=10.34.12  # 選擇符合前綴的IP作為服務注冊IP
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces

更多配置

spring.cloud.nacos.discovery.server-addr  #Nacos Server 啟動監(jiān)聽的ip地址和端口
spring.cloud.nacos.discovery.service  #給當前的服務命名
spring.cloud.nacos.discovery.weight  #取值范圍 1 到 100,數(shù)值越大,權(quán)重越大
spring.cloud.nacos.discovery.network-interface #當IP未配置時,注冊的IP為此網(wǎng)卡所對應的IP地址,如果此項也未配置,則默認取第一塊網(wǎng)卡的地址
spring.cloud.nacos.discovery.ip  # 優(yōu)先級最高
spring.cloud.nacos.discovery.port  # 默認情況下不用配置,會自動探測
spring.cloud.nacos.discovery.namespace # 常用場景之一是不同環(huán)境的注冊的區(qū)分隔離,例如開發(fā)測試環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務)隔離等。
spring.cloud.nacos.discovery.access-key  # 當要上阿里云時,阿里云上面的一個云賬號名
spring.cloud.nacos.discovery.secret-key # 當要上阿里云時,阿里云上面的一個云賬號密碼
spring.cloud.nacos.discovery.metadata    #使用Map格式配置,用戶可以根據(jù)自己的需要自定義一些和服務相關的元數(shù)據(jù)信息
spring.cloud.nacos.discovery.log-name   # 日志文件名
spring.cloud.nacos.discovery.enpoint   # 地域的某個服務的入口域名,通過此域名可以動態(tài)地拿到服務端地址
ribbon.nacos.enabled  # 是否集成Ribbon 默認為true

五、較合理的實現(xiàn)方式

1.使用docker進行部署

  • 項目打包的時候指定映射后的注冊IP和端口或者ip前綴
  • 打包進鏡像之后運行容器,設置上方指定的端口映射
  • 這樣也能指定局域網(wǎng)的IP也可以通過docker將相關端口進行映射出來

問題,假如需要映射到公網(wǎng)IP?

2.也可以通過網(wǎng)關進行整改,所有服務都走網(wǎng)關,

  • 只需要將網(wǎng)關部署到連接內(nèi)網(wǎng)服務的網(wǎng)卡上面,將網(wǎng)關的端口進行映射出去供外部調(diào)用
  • 問題,服務間的調(diào)用需要保證注冊網(wǎng)絡是統(tǒng)一網(wǎng)絡

3.通過自定義主機域名,或者本地dns服務,

  • 給每個服務指定域名
  • 服務注冊時候需要將域名進行者注冊上去,

問題:可能會更麻煩但是對于網(wǎng)絡較為復雜的情況會改善一點勞動量 

到此這篇關于SpringCloud以及Nacos服務注冊IP選擇問題的文章就介紹到這了,更多相關SpringCloud Nacos服務注冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論