Eureka服務(wù)注冊中心(高級)

1.Eureka server 高可用集群
在上一個章節(jié),實現(xiàn)了單節(jié)點的Eureka Server的服務(wù)注冊與服務(wù)發(fā)現(xiàn)功能。Eureka Client會定時連接Eureka Server ,獲取注冊表中的信息并緩存到本地。微服務(wù)在消費遠(yuǎn)程API時總是使用本地緩存中的數(shù)據(jù)。因此一般來說,即使Eureka Server發(fā)生宕機(jī),也不會影響到服務(wù)之間的調(diào)用。但如果EurekaServer宕機(jī)時,某些微服務(wù)也出現(xiàn)了不可用的情況, Eureka Server中的緩存若不被刷新,就可能會影響到微服務(wù)的調(diào)用,甚至影響到整個應(yīng)用系統(tǒng)的高可用。因此,在生成環(huán)境中,通常會部署一個高可用的Eureka Server集群。
Eureka Server可以通過運行多個實例并相互注冊的方式實現(xiàn)高可用部署, Eureka Server實例會彼此增量地同步信息,從而確保所有節(jié)點數(shù)據(jù)一致。事實上,節(jié)點之間相互注冊是Eureka Server的默認(rèn)行為。
大概:
|
簡單的說:
部署多個eureka server 節(jié)點集群,互相同步數(shù)據(jù)備份等,
當(dāng)一個eureka server宕機(jī)后,另一個節(jié)點的eureka server繼續(xù)提供服務(wù),達(dá)到高可用的狀態(tài)。
2. eureka server 注冊中心之間相互注冊
1.準(zhǔn)備2個eureka server ,需要相互注冊與發(fā)現(xiàn)
eureka server節(jié)點1 端口9000
eureka server節(jié)點2 端口8000
2.將多個服務(wù)注冊到多個eureka server中
以下是步驟實現(xiàn):
1.準(zhǔn)備2個eureka server ,需要相互注冊與發(fā)現(xiàn)
eureka server 節(jié)點1工程yml配置文件
server:
port: 9000
spring:
application:
name: server-eureka #注冊中心節(jié)點1服務(wù)名稱
# 配置 eureka server 注冊中心
eureka:
instance:
hostname: localhost
client:
#register-with-eureka-: false #是否將自己注冊到注冊中心 (默認(rèn)為true)
#fetch-register: false #是否從eureka中獲取注冊信息
serviceUrl: #配置暴露給eureka client的請求地址
defaultZone: http://${eureka.instance.hostname}:8000/eureka/ #注冊到節(jié)點2 server上
eureka server 節(jié)點12工程yml配置文件
server:
port: 8000
spring:
application:
name: server-eureka2 #注冊中心節(jié)點2服務(wù)名稱
# 配置 eureka server 注冊中心
eureka:
instance:
hostname: localhost
client:
#register-with-eureka-: false #是否將自己注冊到注冊中心 (默認(rèn)為true)
#fetch-register: false #是否從eureka中獲取注冊信息
serviceUrl: #配置暴露給eureka client的請求地址
defaultZone: http://${eureka.instance.hostname}:9000/eureka/ # 注冊到節(jié)點1 server上
以上配置實現(xiàn)兩個eureka server的服務(wù)互相注冊與發(fā)現(xiàn)。
啟動兩個節(jié)點后:
訪問eureka server節(jié)點1
![]() |
訪問eureka server節(jié)點2
|
2.服務(wù)注冊到多個eureka server中
訂單工程服務(wù)(服務(wù)消費者)注冊到多個eureka server中
server:
port: 9002
spring:
application:
name: service-order #訂單服務(wù)名稱(服務(wù)消費者)
# 配置 eureka 服務(wù)注冊與發(fā)現(xiàn) (看這里!!!!)
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/,http://localhost:8000/eureka/ # 向多個注冊中心注冊服務(wù)(逗號分割)
instance:
prefer-ip-address: true # 使用ip地址注冊
商品工程服務(wù)(服務(wù)提供者)注冊到多個eureka server中
server:
port: 9001
spring:
application:
name: service-product #商品服務(wù)名稱(服務(wù)提供者)
# 配置 eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/,http://localhost:8080/eureka/ # 向多個注冊中心注冊地址
instance:
prefer-ip-address: true # 使用ip地址注冊
測試,停止注冊中心節(jié)點2,模擬節(jié)點2宕機(jī)。
|
一個eureka server節(jié)點宕機(jī)了,另一個eureka server還在服務(wù),并不影響整個服務(wù)的運行,從而保證了服務(wù)高可用。
提示:
只要兩個注冊中心互相注冊,就可默認(rèn)自動實現(xiàn)兩個節(jié)點之間的服務(wù)列表信息同步,但是最好還是在服務(wù)提供者注冊到多個注冊中心節(jié)點集群里好一些。
3.Eureka常見問題
1.控制臺顯示服務(wù)ip
在服務(wù)提供者工程中修改顯示id
server:
port: 9001
spring:
application:
name: service-product #商品服務(wù)名稱(服務(wù)提供者)
# 配置 eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/,http://localhost:8080/eureka/ # 向多個注冊中心注冊地址
instance:
prefer-ip-address: true # 使用ip地址注冊
# 看這里,解決在控制臺顯示服務(wù)的ip和端口組成的請求地址
instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注冊中心注冊id(服務(wù)ip請求路徑)
|
2.Eureka的服務(wù)剔除問題
健康檢查:
默認(rèn)30秒給注冊中心發(fā)送心跳
90秒內(nèi)續(xù)約到期時間
在已經(jīng)注冊的微服務(wù)列表中,微服務(wù)會默認(rèn)30秒給注冊中心發(fā)送一次心跳,證明我還活著,90秒內(nèi)沒有發(fā)送心跳(續(xù)約到期時間),證明該微服務(wù)已經(jīng)宕機(jī),那么就需要注冊中心及時剔除掉宕機(jī)微服務(wù)地址信息,注冊中心會自動剔除宕機(jī)的服務(wù)信息。
大概:
|
解決:
在服務(wù)提供者工程yml設(shè)置發(fā)送心跳時間間隔和續(xù)約時間。
server:
port: 9001
spring:
application:
name: service-product #商品服務(wù)名稱(服務(wù)提供者)
# 配置 eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/,http://localhost:8080/eureka/ # 向多個注冊中心注冊地址
instance:
prefer-ip-address: true # 使用ip地址注冊
# 解決在控制臺顯示服務(wù)的ip和端口組成的請求地址
instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注冊中心注冊id(服務(wù)ip請求路徑)
#看這里,發(fā)送心跳間隔與續(xù)約到期時間設(shè)置
lease-renewal-interval-in-seconds: 5 #間隔5秒發(fā)送心跳給注冊中心
lease-expiration-duration-in-seconds: 10 #續(xù)約到期時間 10秒沒發(fā)送心跳代表我宕機(jī)
微服務(wù)每隔5秒給注冊中心發(fā)送心跳證明活著,如果10秒我沒發(fā)送心跳,證明我宕機(jī)了。
服務(wù)提供者微服務(wù)宕機(jī)后,注冊中心會自動剔除該微服務(wù)。
服務(wù)提供者正常運行時:
|
停止服務(wù)提供者模擬宕機(jī):
|
3.Eureka 自我保護(hù)機(jī)制
一般不建議用。
eureka server注冊中心會自動檢測統(tǒng)計所有的微服務(wù)發(fā)送過來的心跳效率是否在85%以上,如果低于85%,則eureka自動開啟自我保護(hù)機(jī)制,不再剔除已經(jīng)注冊的微服務(wù)列表信息,如果某些微服務(wù)宕機(jī)了,但是微服務(wù)列表仍然存在信息,那么就不恰當(dāng),所以不建議使用自我保護(hù)機(jī)制。
注冊中心關(guān)閉自我保護(hù)機(jī)制:
server:
port: 9000
spring:
application:
name: server-eureka #注冊中心節(jié)點1服務(wù)名稱
# 配置 eureka server 注冊中心
eureka:
instance:
hostname: localhost
client:
#register-with-eureka-: false #是否將自己注冊到注冊中心 (默認(rèn)為true)
#fetch-register: false #是否從eureka中獲取注冊信息
serviceUrl: #配置暴露給eureka client的請求地址
defaultZone: http://${eureka.instance.hostname}:8000/eureka/ #注冊到節(jié)點2 server上
# 看這里,關(guān)閉eureka server 自我保護(hù)機(jī)制
server:
enable-self-preservation: false # 關(guān)閉自我保護(hù)機(jī)制 (默認(rèn)是開啟的)
eviction-interval-timer-in-ms: 4000 # 剔除服務(wù)間隔(4秒掃碼刪除一次宕機(jī)的服務(wù)信息)
在開發(fā)測試階段縮短服務(wù)剔除間隔時間,能夠更快的得到服務(wù)數(shù)據(jù),上線可刪掉,使用默認(rèn)的時間。
最后:
測試項目工程結(jié)構(gòu)展示:
聚合maven工程包含的是SpringBoot子工程
|
4.總結(jié):
到此,你已經(jīng)學(xué)會了如何使用Eureka server作為注冊中心,以及解決服務(wù)的注冊與發(fā)現(xiàn)的問題,我們注重的是yml的配置,來實現(xiàn)Erueka的服務(wù)發(fā)現(xiàn)與注冊。









