1. 程式人生 > >SpringCloud 服務註冊與發現Eureka

SpringCloud 服務註冊與發現Eureka

個人學習SpringCloud系列 Eureka篇

Github Link: https://github.com/panjianlong13/SpringBoot-SpringCloud/tree/master/spring-cloud-eureka


Spring Cloud簡介

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。

Spring Cloud包含了多個子專案(針對分散式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等專案。

 

Eureka介紹

Eureka是什麼

Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位執行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它整合在其子專案spring-cloud-netflix中,以實現SpringCloud的服務發現功能。

Eureka包含兩個元件:Eureka Server和Eureka Client。

Eureka Server提供服務註冊服務,各個節點啟動後,會在Eureka Server中進行註冊,這樣EurekaServer中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到。

Eureka Client是一個java客戶端,用於簡化與Eureka Server的互動,客戶端同時也就是一個內建的、使用輪詢(round-robin)負載演算法的負載均衡器。

 

基本原理

- 處於不同節點的eureka通過Replicate進行資料同步
- Application Service為服務提供者
- Application Client為服務消費者
- Make Remote Call完成一次服務呼叫

服務啟動後向Eureka註冊,Eureka Server會將註冊資訊向其他Eureka Server進行同步,當服務消費者要呼叫服務提供者,則向服務註冊中心獲取服務提供者地址,然後會將服務提供者地址快取在本地,下次再呼叫時,則直接從本地快取中取,完成一次呼叫。

當服務註冊中心Eureka Server檢測到服務提供者因為宕機、網路原因不可用時,則在服務註冊中心將服務置為DOWN狀態,並把當前服務提供者狀態向訂閱者釋出,訂閱過的服務消費者更新本地快取。

服務提供者在啟動後,週期性(預設30秒)向Eureka Server傳送心跳,以證明當前服務是可用狀態。Eureka Server在一定的時間(預設90秒)未收到客戶端的心跳,則認為服務宕機,登出該例項。

 

Eureka與ZooKeeper對比

zookeeper保證CP

當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊資訊,但不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。但是zk會出現這樣一種情況,當master節點因為網路故障與其他節點失去聯絡時,剩餘節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk叢集都是不可用的,這就導致在選舉期間註冊服務癱瘓。在雲部署的環境下,因網路問題使得zk叢集失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的註冊長期不可用是不能容忍的。

Eureka保證AP

Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊或時如果發現連線失敗,則會自動切換至其它節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的資訊可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,此時會出現以下幾種情況:
1. Eureka不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務
2. Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)
3. 當網路穩定時,當前例項新的註冊資訊會被同步到其它節點中

對比總結

Eureka可以很好的應對因網路故障導致部分節點失去聯絡的情況,而不會像zookeeper那樣使整個註冊服務癱瘓。Eureka作為單純的服務註冊中心來說要比zookeeper更加“專業”,因為註冊服務更重要的是可用性,我們可以接受短期內達不到一致性的狀況。


Eureka實戰

新建SpringBoot專案

Eureka pom.xml中新增依賴

Eureka application.yml引數配置

Eureka 程式碼中啟用EurekaServer

服務Project pom.xml中新增依賴

服務Project application.yml引數配置

服務Project 向Eureka註冊

首先啟動Eureka 訪問 http://localhost:8761/

啟動服務Project 可以在Eureka管理介面中找到啟動的Instance

 

訪問服務URL http://localhost:8081/