SpringCloud中的Eureka注冊(cè)中心詳細(xì)解讀
Eureka原理
概念:實(shí)現(xiàn)服務(wù)治理,即管理所有的服務(wù)信息和狀態(tài)。 eureka分為兩部分,Server端和Client端 Client端向Server端定時(shí)發(fā)送心跳包。 Server端根據(jù)Clinet端的心跳包,來(lái)維護(hù)一個(gè)服務(wù)列表(判斷服務(wù)是否在線)。
- client功能
- 注冊(cè):每個(gè)微服務(wù)啟動(dòng)時(shí),將自己的網(wǎng)絡(luò)地址等信息注冊(cè)到注冊(cè)中心,注冊(cè)中心會(huì)存儲(chǔ)(內(nèi)存中)這些信息。
- 獲取服務(wù)注冊(cè)表:服務(wù)消費(fèi)者從注冊(cè)中心,查詢服務(wù)提供者的網(wǎng)絡(luò)地址,并使用該地址調(diào)用服務(wù)提供者,為了避免每次都查注冊(cè)表信息,所以client會(huì)定時(shí)去server拉取注冊(cè)表信息到緩存到client本地。
- 心跳:各個(gè)微服務(wù)與注冊(cè)中心通過某種機(jī)制(心跳)通信,若注冊(cè)中心長(zhǎng)時(shí)間和服務(wù)間沒有通信,就會(huì)注銷該實(shí)例。
- 調(diào)用:實(shí)際的服務(wù)調(diào)用,通過注冊(cè)表,解析服務(wù)名和具體地址的對(duì)應(yīng)關(guān)系,找到具體服務(wù)的地址,進(jìn)行實(shí)際調(diào)用。
- server注冊(cè)中心功能
- 服務(wù)注冊(cè)表:記錄各個(gè)微服務(wù)信息,例如服務(wù)名稱,ip,端口等。注冊(cè)表提供 查詢API(查詢可用的微服務(wù)實(shí)例)和管理API(用于服務(wù)的注冊(cè)和注銷)。
- 服務(wù)注冊(cè)與發(fā)現(xiàn):注冊(cè):將微服務(wù)信息注冊(cè)到注冊(cè)中心。發(fā)現(xiàn):查詢可用微服務(wù)列表及其網(wǎng)絡(luò)地址。
- 服務(wù)檢查:定時(shí)檢測(cè)已注冊(cè)的服務(wù),如發(fā)現(xiàn)某實(shí)例長(zhǎng)時(shí)間無(wú)法訪問,就從注冊(cè)表中移除。
1.服務(wù)注冊(cè)
想要參與服務(wù)注冊(cè)發(fā)現(xiàn)的實(shí)例首先需要向Eureka服務(wù)器注冊(cè)信息 注冊(cè)在第一次心跳發(fā)生時(shí)提交
- Renew:續(xù)租,心跳。Eureka客戶需要每30秒發(fā)送一次心跳來(lái)續(xù)租
- Fetch Registry:Eureka客戶端拉取注冊(cè)表信息,并緩存在本地??梢?0秒更新一次。
- Cancel:Eureka客戶端在關(guān)閉時(shí)向Eureka服務(wù)器發(fā)送取消請(qǐng)求。這將從服務(wù)器的實(shí)例注冊(cè)表中刪除實(shí)例,從而有效地將實(shí)例從通信量中取出。
客戶端配置選項(xiàng)
#續(xù)約發(fā)送間隔默認(rèn)30秒,心跳間隔 eureka.instance.lease-renewal-interval-in-seconds=5 #表示eureka client間隔多久去拉取服務(wù)注冊(cè)信息,默認(rèn)為30秒,對(duì)于api-gateway,如果要迅速獲取服務(wù)注冊(cè)狀態(tài),可以縮小該值,比如5秒 eureka.client.registry-fetch-interval-seconds=5 # 續(xù)約到期時(shí)間(默認(rèn)90秒) eureka.instance.lease-expiration-duration-in-seconds=60
服務(wù)器端配置選項(xiàng)
#關(guān)閉自我保護(hù)模式 eureka.server.enable-self-preservation=false #失效服務(wù)間隔 eureka.server.eviction-interval-timer-in-ms=3000
2.Eureka高可用
高可用:可以通過運(yùn)行多個(gè)Eureka server實(shí)例并相互注冊(cè)的方式實(shí)現(xiàn)。Server節(jié)點(diǎn)之間會(huì)彼此增量地同步信息,從而確保節(jié)點(diǎn)中數(shù)據(jù)一致。
寫一個(gè)地址也行(但是server得互相注冊(cè)),EurekaServer會(huì)自動(dòng)同步,但為了避免極端情況,還是寫多個(gè)。 集群中各個(gè)server會(huì)從其他server同步注冊(cè)表信息。
#client配置 eureka: client: #設(shè)置服務(wù)注冊(cè)中心的URL service-url: defaultZone: http://root:root@eureka-7801:7801/eureka/,http://root:root@eureka-7802:7802/eureka/
3.自我保護(hù)機(jī)制
- 默認(rèn)情況下,Eureka Server在一定時(shí)間內(nèi)(90s),沒有接收到某個(gè)微服務(wù)心跳,就會(huì)將該服務(wù)注銷。但是當(dāng)網(wǎng)絡(luò)出現(xiàn)問題、故障,微服務(wù)之間無(wú)法通信,就不應(yīng)該直接注銷了。所以Eureka Server的自我保護(hù)機(jī)制,是在短時(shí)間內(nèi)出現(xiàn)大量客戶端丟失,就不會(huì)從注冊(cè)表中注銷。
- 思想:寧可保留健康的和不健康的,也不盲目注銷任何健康的服務(wù)。
- 關(guān)閉自我保護(hù)
eureka: server: enable-self-preservation: false
4.Eureka 健康檢查
server和client通過心跳保持 服務(wù)列表,而只有狀態(tài)為UP的服務(wù)才能被訪問。看eureka界面中的status。 比如心跳一直正常,服務(wù)一直UP,但是此服務(wù)DB連不上了,無(wú)法正常提供服務(wù)(有的時(shí)候業(yè)務(wù)出現(xiàn)問題catch住異常,也可以手動(dòng)傳輸DOWN讓服務(wù)下線)。 此時(shí),我們需要將 微服務(wù)的健康狀態(tài)也同步到server。只需要啟動(dòng)eureka的健康檢查就行。這樣微服務(wù)就會(huì)將自己的健康狀態(tài)同步到eureka。配置如下即可。 開啟手動(dòng)控制 在client端配置:將自己真正的健康狀態(tài)傳播到server。
eureka: client: healthcheck: enabled: true
Client端配置Actuator
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
改變健康狀態(tài)的Service
@Service public class HealthStatusService implements HealthIndicator{ private Boolean status = true; public void setStatus(Boolean status) { this.status = status; } @Override public Health health() { // TODO Auto-generated method stub if(status) return new Health.Builder().up().build(); return new Health.Builder().down().build(); } public String getStatus() { // TODO Auto-generated method stub return this.status.toString(); }
5.Eureka監(jiān)聽事件
- EurekaInstanceCanceledEvent 服務(wù)下線事件
- EurekaInstanceRegisteredEvent 服務(wù)注冊(cè)事件
- EurekaInstanceRenewedEvent 服務(wù)續(xù)約事件
- EurekaRegistryAvailableEvent 注冊(cè)中心可用事件
- EurekaServerStartedEvent 注冊(cè)中心啟動(dòng)
import org.springframework.cloud.netflix.eureka.server.event.EurekaInstanceCanceledEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class CustomEvent { @EventListener public void listen(EurekaInstanceCanceledEvent e) { System.out.println(e.getServerId()+"下線事件"); } } 將Eureka Client停止后打?。? api-listen-order:30.136.133.9:port下線事件
6.Eureka缺陷
集群之間的同步復(fù)制是通過HTTP的方式進(jìn)行,基于網(wǎng)絡(luò)的不可靠性,集群中的Eureka Server間的注冊(cè)表信息難免存在不同步的時(shí)間節(jié)點(diǎn),不滿足CAP中的C(數(shù)據(jù)一致性)。
到此這篇關(guān)于SpringCloud中的Eureka注冊(cè)中心詳細(xì)解讀的文章就介紹到這了,更多相關(guān)SpringCloud的Eureka注冊(cè)中心內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springcloud本地服務(wù)不注冊(cè)到注冊(cè)中心的解決方案
- SpringCloud zookeeper作為注冊(cè)中心使用介紹
- SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法
- SpringCloud?Eureka服務(wù)注冊(cè)中心應(yīng)用入門詳解
- SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心的方法
- Java之SpringCloud nocos注冊(cè)中心講解
- 淺析SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼
- Springcloud-nacos實(shí)現(xiàn)配置和注冊(cè)中心的方法
- springcloud實(shí)現(xiàn)注冊(cè)中心Eureka
- SpringCloud兩種注冊(cè)中心的實(shí)現(xiàn)
相關(guān)文章
Spring/SpringBoot?@RequestParam注解無(wú)法讀取application/json格式數(shù)據(jù)問題
RequestParam用于將指定的請(qǐng)求參數(shù)賦值給方法中的形參,可以接受簡(jiǎn)單類型屬性,也可以接受對(duì)象類型,一般用于GET請(qǐng)求,下面這篇文章主要給大家介紹了關(guān)于Spring/SpringBoot?@RequestParam注解無(wú)法讀取application/json格式數(shù)據(jù)問題解決的相關(guān)資料,需要的朋友可以參考下2022-10-10Java?String類和StringBuffer類的區(qū)別介紹
這篇文章主要介紹了Java?String類和StringBuffer類的區(qū)別,?關(guān)于java的字符串處理我們一般使用String類和StringBuffer類有什么不同呢,下面我們一起來(lái)看看詳細(xì)介紹吧2022-03-03SpringBoot使用MapStruct生成映射代碼的示例詳解
MapStruct 是一個(gè)用于 Java 的代碼生成器,專門用于生成類型安全的 bean 映射代碼,它通過注解處理器在編譯時(shí)生成映射代碼,從而避免了運(yùn)行時(shí)的性能開銷和潛在的錯(cuò)誤,本文給大家介紹了SpringBoot使用MapStruct生成映射代碼的示例,需要的朋友可以參考下2024-11-11RocketMQ源碼解析topic創(chuàng)建機(jī)制詳解
這篇文章主要為大家介紹了RocketMQ源碼解析topic創(chuàng)建機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08java代理模式(靜態(tài)代理、動(dòng)態(tài)代理、cglib代理)
代理(Proxy)是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象另外的訪問方式;這篇文章主要介紹了Java 中的三種代理模式,需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-07-07Java操作redis設(shè)置第二天凌晨過期的解決方案
這篇文章主要介紹了Java操作redis設(shè)置第二天凌晨過期的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java Spring Controller 獲取請(qǐng)求參數(shù)的幾種方法詳解
這篇文章主要介紹了Java Spring Controller 獲取請(qǐng)求參數(shù)的幾種方法詳解的相關(guān)資料,這里提供了6種方法,需要的朋友可以參考下2016-12-12