Eureka 是一個服務治理元件,它主要包括服務注冊和服務發現,主要用來搭建服務注冊中心。
Eureka 是一個基于 REST 的服務,用來定位服務,進行中間層伺服器的負載均衡和故障轉移。
Eureka Server 作為服務注冊的服務端,它是服務注冊中心,而系統中的其他微服務,使用 Eureka 的用戶端連接配接到 Eureka
Server 服務端,并維持心跳連接配接,Eureka 用戶端是一個 Java 用戶端,用來簡化與伺服器的互動、負載均衡,服務的故障切換等
Zookeeper 保證 CP(保證強一緻性)
在 ZooKeeper 中,當 master 節點因為網絡故障與其他節點失去聯系時,剩餘節點會重新進行 leader 選舉,但是問題在于,選舉 leader 需要一定時間, 且選舉期間整個 ZooKeeper 叢集都是不可用的,這就導緻在選舉期間注冊服務癱瘓。
在雲部署的環境下,因網絡問題使得 ZooKeeper 叢集失去 master 節點是大機率事件,雖然服務最終能夠恢複,但是在選舉時間内導緻服務注冊長期不可用是難以容忍的。
Eureka 保證 AP
Eureka 優先保證可用性,Eureka 各個節點是平等的,某幾個節點挂掉不會影響正常節點的工作,剩餘的節點依然可以提供注冊和查詢服務。而 Eureka 的用戶端在向某個 Eureka 注冊或時如果發現連接配接失敗,則會自動切換至其它節點,隻要有一台 Eureka 還在,就能保證注冊服務可用(保證可用性),隻不過查到的資訊可能不是最新的(不保證強一緻性)。
建立一個 SpringBoot 項目,并且添加 SpringBoot 的相關依賴;springcloud-eureka-server
添加 eureka 的依賴
在 Spring Boot 的入口類上添加一個@EnableEurekaServer 注解,用于開啟 Eureka 注冊中心服務端
在 application.yml檔案中配置 Eureka 服務注冊中心資訊:
啟動main,通路 http://localhost:8761/

建立spring boot項目并導入eureka 用戶端依賴:
在main上添加@EnableEurekaClient 注解
配置服務名稱和注冊中心位址
啟動運作之後,通過在浏覽器位址欄通路我們之前搭建好的 eureka 注冊
由于注冊中心 eureka 本身也是一個服務,如果它隻有一個節點,那麼它有可能發生故障,這樣我們就不能注冊與查詢服務了,是以我們需要一個高可用的服務注冊中心,這就需要通過注冊中心叢集來解決。
Eureka Server 的高可用實際上就是将自己作為服務向其他服務注冊中心注冊自己,這樣就會形成一組互相注冊的服務注冊中心,進而實作服務清單的互相同步,往注冊中心 A 上注冊的服務,可以被複制同步到注冊中心 B 上,是以從任何一台注冊中心上都能查詢到已經注冊的服務,進而達到高可用的效果。
在 8761 的配置檔案中,讓它的 service-url 指向 8763,在 8763 的配置檔案中讓它的 service-url 指向 8761
然後在本地 hosts 檔案配置:C:\Windows\System32\drivers\etc\hosts
127.0.0.1 eureka8761
127.0.0.1 eureka8763
分别啟動兩個注冊中心,通路兩個注冊中心頁面,觀察注冊中心頁面是否正常
在eureka-client服務中配置:
啟動服務提供者服務,然後觀察注冊中心頁面,可以看到服務會在兩個注冊中心上都注冊成功
當 Eureka 注冊中心進入自我保護模式時,在 Eureka Server 首頁會輸出如下警告資訊:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
在沒有 Eureka 自我保護的情況下,如果 Eureka Server 在一定時間内沒有接收到某個微服務執行個體的心跳,Eureka Server 将會登出該執行個體,但是當發生網絡分區故障時,那麼微服務與 Eureka Server 之間将無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是正常的,此時不應該登出這個微服務,如果沒有自我保護機制,那麼 Eureka Server 就會将此服務登出掉。
Eureka 通過“自我保護模式”來解決這個問題——當 Eureka Server 節點在短時間内丢失過多用戶端時(可能發生了網絡分區故障),那麼就會把這個微服務節點進行保護。一旦進入自我保護模式,Eureka Server 就會保護服務系統資料庫中的資訊,不删除服務系統資料庫中的資料(也就是不會登出任何微服務)。當網絡故障恢複後,該 Eureka Server 節點會再自動退出自我保護模式。
但是 Eureka Server 自我保護模式也會給我們帶來一些困擾,如果在保護期内某個服務提供者剛好非正常下線了,此時服務消費者就會拿到一個無效的服務執行個體,此時會調用失敗,對于這個問題需要服務消費者端具有一些容錯機制,如重試,斷路器等。
自我保護常用幾個配置:
伺服器端
#測試時關閉自我保護機制,保證不可用服務及時踢出
用戶端
#每間隔 2s,向服務端發送一次心跳,證明自己依然"存活"
#告訴服務端,如果我 10s 之内沒有給你發心跳,就代表我故障了,将我踢出掉