SpringCloud Eureka 高可用
文章目錄
Spring Cloud Eureka 高可用
Eureka和Zookeeper對比
Eureka在高可用方面好一點;Zookeeper在一致性上強一點
高可用客戶端(HA Client)
多用於生產環境,客戶端應用關聯或配置註冊中心伺服器叢集,避免註冊中心單點故障
常見配置手段
- 多註冊中心主機
- 註冊中心DNS
- 廣播(Dubbo)
Spring Cloud Eureka Client
如果Eureka客戶端應用配置多個Eureka註冊伺服器,那麼預設情況只有第一臺可用的伺服器存在註冊資訊。如果第一臺可用的Eureka伺服器Down掉了,那麼Eureka客戶端應用將會選擇下一臺可用的Eureka伺服器。
配置方式:
eureka.client.serviceUrl.defaultZone=http://${eureka.server1.host}:${eureka.server1.port}/ eureka,${eureka.server2.host}:${eureka.server2.port}/eureka
應用元資訊
# 調整獲取所有應用元資訊間隔時間
eureka.client.registryFetchIntervalSeconds = 5
# 調整應用元資訊間隔時間
eureka.client.instanceInfoReplicationIntervalSeconds = 5
這個時間調的越小的話,資訊一致性越強,CPU消耗也越高
例項
客戶端配置
# 客戶端應用名稱 spring.application.name=spring-cloud-eureka-client # 客戶端服務埠,隨機可用 server.port=0 # 管理埠安全關閉 management.security.enabled=false # 客戶端註冊到Eureka伺服器,配置多個註冊中心,以","分隔 eureka.client.serviceUrl.defaultZone = http://localhost:9090/eureka,http://localhost:9091/eureka
伺服器配置
# 伺服器應用名稱
spring.application.name=spring-cloud-eureka-server
# 伺服器服務埠
server.port=9090
# 管理埠安全關閉
management.security.enabled=false
## Eureka 伺服器作為註冊中心,不需要再註冊到其中註冊中心去
## 同時也不需要獲取客戶端資訊
## 取消向註冊中心註冊
eureka.client.register-with-eureka=false
## 取消向註冊中心獲取註冊資訊(服務、例項資訊)
eureka.client.fetch-registry=false
為了啟動多個註冊中心,我們可以通過啟動引數指定不同的埠,這裡我們多指定一個9091
這裡我們注意不能勾選單例啟動模式
然後啟動客戶端,我們會發現兩個註冊中心中只有一有註冊資訊
當我們關掉9090埠的伺服器(有註冊資訊),過一會後,客戶端會註冊到9091埠的伺服器上,並且該伺服器會有註冊資訊。
高可用註冊中心(HA Registry Center)
高可用註冊中心不但需要提供叢集環境,解決單點故障的問題。同時,也優雅地處理註冊中心之間資訊同步的問題。
配置方式:
eureka.server.host1 : eureka.client.serviceUrl.defaultZone=http://${eureka.server2.host}:${eureka.server2.port}/eureka
eureka.server.host2 : eureka.client.serviceUrl.defaultZone=http://${eureka.server1.host}:${eureka.server1.port}/eureka
例項
由客戶端高可用轉變為 伺服器高可用
伺服器配置
在server工程中修改application.properties,並新增application-peer1.properties和application-peer2.properties
- application.properties:
## peer1和peer2公用配置
## 定義 應用名稱
spring.applicaiton.name = spring-cloud-eureka-server
## 管理端安全失效
management.security.enabled = false
## 公用 Eureka 配置
### 向註冊中心註冊
eureka.client.register-with-eureka = true
### 向獲取註冊資訊(服務、例項資訊)
eureka.client.fetch-registry = true
application.properties是它們的公共配置資訊
- application-peer1.properties
## peer1配置
## peer1 埠 9091
## peer2 埠 9092
## 伺服器服務埠
server.port=9091
eureka.instance.hostname=peer1
## peer2主機: peer2,埠: 9092
peer2.server.host = peer2
peer2.server.port = 9092
## 向 peer2 註冊中心註冊
eureka.client.serviceUrl.defaultZone = http://${peer2.server.host}:${peer2.server.port}/eureka
- application-peer2.properties
## peer2配置
## peer1 埠 9091
## peer2 埠 9092
## 伺服器服務埠
server.port=9092
eureka.instance.hostname=peer2
## peer1主機: peer1,埠: 9091
peer1.server.host = peer1
peer1.server.port = 9091
## 向 peer1 註冊中心註冊
eureka.client.serviceUrl.defaultZone = http://${peer1.server.host}:${peer1.server.port}/eureka
這裡面的peer1和peer2指的是高可用系統中的兩臺主機,它們之間可以同步資訊。
同時需要修改hosts檔案 新增 127.0.0.1 peer1 127.0.0.2 peer2
這裡向註冊中心註冊的地址不能是localhost,不然available-replicas中無值
- 啟動peer1 Eureka伺服器
通過啟動引數-spring.profiles.active=peer1
,這樣會讀取application.properties
和application-peer1.properties
同理,啟動peer2
peer1看到的頁面:
peer2看到的頁面:
客戶端配置
# 客戶端應用名稱
spring.application.name=spring-cloud-eureka-client
# 客戶端服務埠,隨機可用
server.port=0
# 管理埠安全關閉
management.security.enabled=false
# 客戶端註冊到Eureka伺服器,配置多個註冊中心,以","分隔
eureka.client.serviceUrl.defaultZone = http://localhost:9091/eureka,http://localhost:9092/eureka
客戶端主要改下注冊中心地址就好了