解決dubbo註冊zookepper服務IP亂入問題的三種方式
阿新 • • 發佈:2019-01-24
最近做一個專案引入了dubbo+zookepper的分散式服務治理框架。在應用的釋出的時候出現一個怪問題。zookepper服務是起在開發伺服器192.168.23.180上。本機起應用服務提供者註冊到192.168.23.180上的dubbo服務可以註冊成功,用dubbo-admin看也是本機的IP:10.1.24.20。本機起的客戶端程式也可以正常呼叫。但是服務提供者釋出到192.168.23.180伺服器上去就不行了。釋出到伺服器上註冊的服務地址就變成了124.232.132.94:20883,這個地址消費者根本就找不到,所以老是報連線超時。按道理來說應該是192.168.23.180是服務提供者的地址才對。開始以為是程式碼裡寫了一個124.232.132.94這樣的地址,搜了一遍沒有找到。搜了一遍伺服器的配置也沒有這樣一個地址。這個地址不知道是從哪裡來的。應為服務提供者和zookepper在一臺機器上,將服務提供者的註冊地址改成127.0.0.1,發現還是一樣的註冊上去後就變成了124.232.132.94。於是懷疑是不是伺服器上做了地址轉發什麼的。
上網找了一些資料發現原來是由於伺服器上配了DNS的問題。
經過測試解決辦法有以下幾個:
1、去掉伺服器上的DNS配置
找到伺服器上的/etc/resolv.conf 將DNS配置去掉或配置成8.8.8.8或配成192.168.23.180這樣這臺伺服器的DNS不可用。
參考配置如下
#nameserver 222.246.129.80
#nameserver 59.51.78.210
#nameserver 8.8.8.8
nameserver 192.168.23.180
#search localdomain
服務啟動的時候會報一個"未知的名稱或服務"的錯誤,但是不要緊,服務可以正常啟動。也可以正常註冊到zookepper,註冊的地址也是真實的伺服器地址。客戶端可以正常訪問。
2、在工程duboo註冊服務配置檔案裡指定IP
把管理控制檯中dubbo/webapps/ROOT/WEB-INF/dubbo.properties檔案中加入dubbo.protocol.host=192.168.23.180,然後在Dubbo服務的dubbo配置檔案<dubbo:protocol
name="dubbo" port="20883" />中加入 host="192.168.23.180",在Dubbo消費者端加入<dubbo:protocol host="192.168.0.123" />的配置。然後重啟Dubbo管理員控制檯、停止消費者端,停止服務提供端,啟動服務提供端,再啟動消費者端。
參考配置如下:
服務提供者provider.xml
<!-- 用dubbo協議在20880埠暴露服務 -->
<dubbo:protocol name="dubbo" host="192.168.23.180" port="20883" />
消費者consumer.xml
<dubbo:protocol host="192.168.23.180" />
配置完了後在dubbo-admin控制檯可以看到服務提供者註冊到zookepper上的dobbo服務已經是正常的192.168.23.180。消費者顯示的還是consumer://124.232.132.94/***** 但不影響呼叫。
3、在伺服器上/etc/hosts,上配置主機名和註冊服務的IP。如:192.168.23.180 host2
沒有配置之前ping 主機名host2 返回的是124.232.132.94
ping host2
PING host2 (124.232.132.94) 56(84) bytes of data.
64 bytes from 124.232.132.94: icmp_seq=1 ttl=55 time=5.67 ms
在/etc/hosts裡配置IP和主機名192.168.23.180 host2 後ping主機名host2返回 192.168.23.180
ping host2
PING host2 (192.168.23.180) 56(84) bytes of data.
64 bytes from host2 (192.168.23.180): icmp_seq=1 ttl=64 time=0.024 ms
配置完後,服務註冊IP地址正常,消費者可以正常訪問。
以上三種方式都可以解決問題,但是第3種方式更加直接方便,更好。