前言
我們都知道,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
嗎?
好,帶着這個問題,我們來修改一點配置:
我們兩個服務的把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地址不行。。。 如果有哪位知道答案,麻煩告知,不甚感激。。。,如果我後面知道了答案,會在這裏公佈出來。