1. 程式人生 > >Spring Cloud 探索 | Eureka 高可用部署及 unavailable-replicas 問題

Spring Cloud 探索 | Eureka 高可用部署及 unavailable-replicas 問題

Eureka Server除了單點執行之外,還可以通過執行多個例項,並進行互相註冊的方式來實現高可用的部署。所以我們只需要將Eureke Server配置其他可用的 serviceUrl 就能實現高可用部署。

下面我們在上篇文章的基礎上來實現Eureka Server的高可用部署。部署圖如下圖所示:
在這裡插入圖片描述

將 application.yml 檔案複製三分:application-9001.yml,application-9002.yml,application-9003.yml,分別新增配置項如下:

application-9001.yml

spring:
  application:
name: eureka-server security: user: name: lpf password: root server.port: 9001 eureka: instance: hostname: eureka-9001.com instance-id: eureka-9001 client: service-url: defaultZone: http://lpf:[email protected]-9002.com:9002/eureka,http://lpf:[email protected]
-9003.com:9003/eureka logging.level.root: info

application-9002.yml

spring:
  application:
    name: eureka-server
  security:
    user:
      name: lpf
      password: root

server.port: 9002

eureka:
  instance:
    hostname: eureka-9002.com
    instance-id: eureka-9002
  client:
    service-url:
      defaultZone
: http://lpf:[email protected]-9001.com:9001/eureka,http://lpf:[email protected]-9003.com:9003/eureka logging.level.root: info

application-9003.yml

spring:
  application:
    name: eureka-server
  security:
    user:
      name: lpf
      password: root

server.port: 9003

eureka:
  instance:
    hostname: eureka-9003.com
    instance-id: eureka-9003
  client:
    service-url:
      defaultZone: http://lpf:[email protected]-9001.com:9001/eureka,http://lpf:[email protected]-9002.com:9002/eureka

logging.level.root: info

最後,在 hosts 檔案中新增如下內容:

127.0.0.1 eureka-9001.com
127.0.0.1 eureka-9002.com
127.0.0.1 eureka-9003.com

注意:要把 application.yml 檔案中的內容註釋掉,否則會影響 Eureka 的叢集部署。因為Spring Boot優先載入 application.yml 中的內容。

最後的最後,通過 spring.profiles.active 屬性來分別啟動三臺伺服器:

java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9001
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9002
java -jar SpringCloudEurekaServer.jar --spring.profiles.active=9003

此時訪問 9001 的註冊中心:http://eureka-9001.com:9001/ ,如下圖所示,我們可以看到 registered-replicas 中已經有 9002 和 9003 節點的 eureka-server 了。同樣地,訪問 9002 的註冊中心:http://eureka-9002.com:9002/ ,能看到 registered-replicas 中已經有 9001 和 9003 節點,並且這些節點在可用分片(available-replicase)之中。我們也可以嘗試關閉 9001,重新整理http://eureka-9002.com:9002/ ,可以看到 9001 的節點變為了不可用分片(unavailable-replicas)。
在這裡插入圖片描述


相信很多小夥伴在實驗的時候都會出現這樣一個問題:節點出現在 unavailable-replicas 下。下面我們來說一下可能的幾種原因:

原因一:prefer-ip-address 配置項設定錯誤

比如,9001 伺服器設定了prefer-ip-address: true,那麼它註冊到 9002 和 9003 伺服器時應該使用 defaultZone:http://yourIP:9001/eureka/ ,但此時可以發現使用的仍然是 hostname 名,導致錯誤發生。

另一種原因是,三個9001、9002 和 9003 都設定了prefer-ip-address: true,導致最後解析出來的 hostname 都是相同的IP,使副本不可用。

原因二:register-with-eureka 配置項設定錯誤

看網上很多部落格和資料都把此項設定成了 false,此時 eureka 不會註冊到其他伺服器上,所以出現錯誤。

原因三:其他原因

還有一些其他原因大家可以參考這裡:Eureka高可用,節點均出現在unavailable-replicas下


大家有沒有一個疑問:服務例項的註冊資訊會在各個 eureka server 之間同步,那麼,如果幾個伺服器的某個配置引數不一致會出現什麼情況,比如:eureka.server.eviction-interval-timer-in-ms: 7000。

經過測試,每個伺服器會按照自己配置的時間間隔清理登錄檔。