前言
我們都知道,Eureka可以很簡單的配置高可用,隻需要在Eureka server指定該server的其他小夥伴們就可以很簡單的實作。但是在實際使用的過程中,也有一些需要注意的點。本文會說明。
本文測試用例我們是兩個執行個體來模拟叢集環境。兩個spring-boot的小項目:eureka-server-7001和eureka-server-7002。 win10環境,先配置hosts:
127.0.0.1 eureka7001 eureka7002
本文代碼位址:https://github.com/lchpersonal/eureka-parent
配置檔案 application.yml
eureka-server-7001
server:
port: 7001
eureka:
instance:
hostname: eureka7001 #eureka服務端的執行個體名稱
prefer-ip-address: true
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
#單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址(單機)。
defaultZone: http://eureka7002:7002/eureka/
eureka-server-7002
server:
port: 7002
eureka:
instance:
hostname: eureka7002 #eureka服務端的執行個體名稱
prefer-ip-address: true
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
#單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址(單機)。
defaultZone: http://eureka7001:7001/eureka/
啟動測試
分别啟動兩個項目,打開浏覽器通路
http://eureka7001:7001/
和
http://eureka7002:7002/

現在一切正常,雙方你中有我我中有你,能夠正常的進行資訊的同步。
問題一!!!
問題: DS Replicas下面的 eureka7001
和 eureka7002
是從哪裡得到的? 配置的 hostname
嗎?
eureka7001
eureka7002
hostname
好,帶着這個問題,我們來修改一點配置:
我們兩個服務的把eureka.instance.hostname:的值改成
127.0.0.1
:
eureka:
instance:
hostname: 127.0.0.1 #eureka服務端的執行個體名稱
prefer-ip-address: true
兩個服務的hostname都修改成127.0.0.1.
重新啟動兩個程式:
咦? DS Replicas仍然是eureka7001 和 eureka7002 ,值沒有變。是以暫且可以得出一個結論
結論: DS Replicas下面的值不是
eureka.instance.hostname
。
那麼它是哪裡配置的呢? 縱觀整個配置檔案,隻有以下配置的地方有用到eureka7001和eureka7002
client:
service-url:
defaultZone: http://eureka7002:7002/eureka/
是以可以肯定,DS Replicas的值,來自于defaultZone。
問題二 !!!
問題: 本文是通過一台機器模拟的,那麼我們可不可以不配置域名? 直接使用ip位址來配置所有的資訊呢?
好,改一下配置:
eureka-server-7001改成如下:
server:
port: 7001
eureka:
instance:
hostname: 127.0.0.1
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:7002/eureka/
同樣eureka-server-7002改成如下:
server:
port: 7002
eureka:
instance:
hostname: 127.0.0.1
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:7001/eureka/
啟動測試:
把滑鼠放到連結上面,浏覽器左下角會顯示ip+端口:
同樣eureka7002也有同樣的效果,我這裡就不截圖了。。
是以這裡我們可以做一個結論,
結論: 用127.0.0.1配置也是可以的。
問題三 !!!
問題: 不使用本地環路位址,直接使用真實位址行不行?
看一下我的本機ip位址:
我的連結路由器的ip位址是
192.168.0.125
, 假如我們把上面所有的
127.0.0.1
全部改為
192.168.0.125
可以嗎? 這裡大家是不是認為肯定可以啊? 哈哈,往下看測試結果:
好,改一下配置:
eureka-server-7001改成如下:
server:
port: 7001
eureka:
instance:
hostname: 192.168.0.125
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://192.168.0.125:7002/eureka/
同樣eureka-server-7002改成如下:
server:
port: 7002
eureka:
instance:
hostname: 192.168.0.125
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://192.168.0.125:7001/eureka/
啟動測試:
好像結果并不像我們想的那樣,DS Replicas下面什麼都沒有。。。
其實這個問題是我在搭建Apollo分布式配置中心的時候遇到的問題。Apollo中使用的就是Eureka。 當時我是在同一台機器上,用docker來模拟僞分布式,當時就沒有配置域名,直接使用的事docker主控端的ip位址,發現總有一個節點運作不正常,不能夠正常複制另外一個節點的内容。 這才來研究了一下Eureka。
其實,除了127.0.0.1,你用同一個域名,不同端口也是不行的,例如我們配置hosts
127.0.0.1 eureka.
把所有的ip全部換成同一個域名
eureka
:
server:
port: 7001
eureka:
instance:
hostname: eureka #eureka服務端的執行個體名稱
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka:7002/eureka/
另外一個配置這裡就不貼出來了。。。 啟動測試:
發現是可以的。
除了把ip全部配置成本機真實ip,其它情況都是可以的。目前就是沒搞明白,為什麼把hostname改成真實ip位址不行。。。 如果有哪位知道答案,麻煩告知,不甚感激。。。,如果我後面知道了答案,會在這裡公布出來。