Dubbo消費者無法連接到生產者提供的服務?內網IP?

環境:Cent OS 7.0

背景:

這篇文章的標題可以設置爲如下幾個,因爲他都是同一個解決方法: 
(1)Dubbo註冊zookepper時爲什麼會自動使用內網IP? 
(2)Dubbo消費者無法連接到生產者提供的服務 
(3)。。。

場景還原

1、項目部署架構

最近在開發一個項目,使用到Dubbo服務,以下是項目部署的情況,

這裏寫圖片描述

詳細說明如下(IP地址不具有可連通性,爲了具體情況假設,大家不要試了!):

1、服務器A上部署Dubbo服務的生產者,公網IP:139.229.17.226,內網IP:10.12.11.3;

2、服務器B上部署了Dubbo註冊中心服務ZookeeperDubbo後臺管理界面程序dubbo-admin,公網IP:139.229.17.227,內網IP:10.12.11.4;

3、開發機C是我自己的PC,用於開發Dubbo服務的消費者項目,遠端請求發送的IP地址爲:169.254.45.169
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

服務器A與B是位於公網IP的服務器(阿里雲服務器)。

2、所遇到的問題

1、生產者成功部署到服務器A; 
2、生產者可以成功註冊到Zookeeper中心且Zookeeper服務正常; 
3、所有需要的端口都已經打開(通過防火牆進行設置); 
4、生產者項目、消費者項目使用的Dubbo的IP地址均爲公網IP,且均正確;

在上述的情況下,出現開發機C上的Dubbo消費者無法找到服務器A上運行的Dubbo生產者,並且出現錯誤:


Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.ufind.server.facade.JointModuleFacade. No provider available for the service com.ufind.server.facade.JointModuleFacade:1.0.0 from the url zookeeper://139.229.17.226:2181/com.alibaba.dubbo.registry.RegistryService?anyhost=true&application=UFind_Security&check=false&cluster=failfast&dubbo=2.8.4&executes=10&generic=false&interface=com.ufind.server.facade.JointModuleFacade&methods=pageAllIllegalRequirements,evaluateIdentify,focusOn,listAllRequirementMainPage,findProBaseInfoByProId,firstPartyEvaluate,viewProjectList,getProStatus,firstPartyAcceptance,secondPartyAcceptance,viewThisProject,getEvaluateFirstToSecond,deleteSignUp,secondPartyEvaluate,updateJointIndex,acceptanceIdentity,find,adminAcceptance,getEvaluateSecondToFirst,signUp,getProJointWithSPId,returnFocusOrSignUp,checkIn,listAllAcptRqr,signUpCheck,viewThisProjectSimple,getProJointWithFPId,findWhoSignMyRequire,getProJointWithFPIdShowUserName&organization=MyUFind&owner=liugen.xu&pid=15924&revision=1.0.0-SNAPSHOT&side=consumer&timeout=500000&timestamp=1475137563583&version=1.0.0 to the consumer 169.254.45.169 use dubbo version 2.8.4
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

可以看出服務名爲:com.ufind.server.facade.JointModuleFacade:1.0.0; 
註冊中心:zookeeper://139.229.17.226:2181;

意思就是在這和註冊中心中沒有找到這個服務的提供者,但是在dubbo-admin中確實存在這個服務的:

這裏寫圖片描述

值得注意的是,這個地方的IP地址是我服務器A的內網IP地址,於是又找了一個錯誤的地方如下:

15:18:30 [WARN ] AbstractClient.<init>:112-[]- [DUBBO] Failed to start NettyClient DESKTOP-NT000EP/169.254.45.169 connect to the server /10.12.11.3:20880 (check == false, ignore and retry later!), cause: client(省略具體的服務全稱) failed to connect to server /10.47.184.14:20880 client-side timeout 3000ms (elapsed: 3040ms) from netty client 169.254.45.169 using dubbo version 2.8.4, dubbo version: 2.8.4, current host: 169.254.45.169

com.alibaba.dubbo.remoting.RemotingException: client(省略具體的服務全稱) failed to connect to server /10.47.184.14:20880 client-side timeout 3000ms (elapsed: 3040ms) from netty client 169.254.45.169 using dubbo version 2.8.4
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

意思就是從:server /10.12.11.3:20880中獲取服務的,很明顯的這是一個內網IP地址,但是卻出現在我的開發機C上,也就是說我的本地開發機C是無法找到公網IP服務器的內網IP地址的,所以無法獲取Dubbo生產者提供的服務。

真相是否如此,做了一個實驗,把生產者和消費者都部署到另一臺阿里雲服務器C上,如下:

這裏寫圖片描述

事實證明,結果是正確的,在同一網絡環境下,同樣的配置是沒有問題的,也就是說在統一環境下,內網是可以相互通信的。

因此問題的所在,歸根於我的項目中Dubbo生產者的註冊中心IP、Dubbo服務消費者註冊中心的IP均設置的爲公網IP,但是爲什麼經過註冊中心這一程序,消費者查找生產者的IP地址變爲內網IP地址了呢?

問題根源所在

Dubbo服務的消費者在向Zookeeper服務中心尋找服務的時候,Zookeeper將Dubbo服務生產者的內網地址給了消費者,所以纔會出現:client(省略具體的服務全稱) failed to connect to server /10.47.184.14:20880

這樣的話,對於開發機C來說,這個內網是不具有可達性的,所以找不到服務的提供者。

找到了問題的原因,那麼這個問題是由什麼造成的呢?

這是由於在服務器hosts配置的文件中,將主機名指向了內網IP地址,查看我的服務器A和B的hosts配置文件如下:

服務器A的hosts文件爲:

127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.12.11.3  iZ132oqrrt7uZ
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

服務器B的hosts文件爲:

127.0.0.1 localhost
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.12.11.3  iZ132oqrrt7uZ
10.12.11.4  iZuf6gd6n1wwjoZ
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

可以在上邊看出,主機名都指向了內網IP,因此需要將他們改回具體的公網IP地址,或者直接刪除,就可以解決問題。

分別對應的改成如下所示:

127.0.0.1 localhost
::1             localhost localhost.localdomain localhost6 localhost6.localdomain6
139.229.17.226  iZ132oqrrt7uZ
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
127.0.0.1 localhost
::1             localhost localhost.localdomain localhost6 localhost6.localdomain6
139.229.17.226  iZ132oqrrt7uZ
139.229.17.227  iZuf6gd6n1wwjoZ
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

然後依次重新啓動:Zookeeper服務–>重啓Dubbo服務生產者–>重啓Dubbo服務消費者,既可以成功運行。

這裏寫圖片描述

可以看出上邊的IP地址已經變爲公網的IP地址了,然後在自己的開發機C上重新運行Dubbo消費者項目,也可以成功的運行,得到生產者提供的服務。

總結

如果你在確定你的所有配置是正確的,指定的Zookeeper註冊中心IP地址是正確的,所有使用到的端口都已經通過防火牆的配置的話,遇到無法獲取生產者提供的服務,或者註冊失敗等信息的話,不妨看一下是不是因爲內網IP造成的。

因爲,我的這個項目使用的是阿里雲的雲服務器,有兩臺,即是上文中的服務器A和服務器B,遇到這個問題之後發現阿里雲默認的爲我們將內網IP和主機名進行了關聯,即是hosts文件的配置:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章