SpringCloud Eureka服務治理之服務註冊服務發現

什麼是Eureka

Netflix Eureka 是一款由 Netflix 開源的基於 REST 服務的註冊中心,用於提供服務發現功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服務套件的一部分,基於 Netflix Eureka 進行瞭二次封裝,主要負責完成微服務架構中的服務治理功能。

Spring Cloud Eureka 是一個基於 REST 的服務,並提供瞭基於 Java 的客戶端組件,能夠非常方便的將服務註冊到 Spring Cloud Eureka 中進行統一管理。

Eureka核心概念服務註冊和服務發現

服務註冊

  • 註冊中心

拆開來看註冊和中心。註冊比如用戶註冊,就是將自己的信息註冊在某個平臺上。中心可以理解成一個統一管理信息的平臺。所以註冊中心顧名思義是統一管理所有註冊信息的平臺。

  • 服務註冊

指的是服務在啟動時將自身的信息註冊到註冊中心中,方便信息進行統一管理。服務註冊是客戶端向註冊中心提交信息的動作。

服務發現

  • 服務發現

指的是從註冊中心獲取對應服務的信息,是客戶端向註冊中心拉取pull信息的動作。

Eureka實戰

  • Eureka 的架構主要分為 Eureka Server 和 Eureka Client 兩部分,Eureka Client 又分為 Applicaton Service 和 Application Client,Applicaton Service 就是服務提供者,Application Client 就是服務消費者。
  • Eureka Client 會向 Eureka Server 發送請求,進行註冊,並將自己的一些信息發送給 Eureka Server。
  • 註冊成功後,每隔一定的時間,Eureka Client 會向 Eureka Server 發送心跳來續約服務,也就是匯報健康狀態。 如果客戶端長時間沒有續約,那麼 Eureka Server 將在 90 秒(默認)內從服務器註冊表中刪除客戶端的信息。
  • Eureka Client 還會定期從 Eureka Server 拉取註冊表信息,然後通過Ribbon 組件根據負載均衡算法得到一個目標,並發起遠程調用。
  • 應用正常停止時也會通知 Eureka Server 移除相關信息,信息成功移除後,其他客戶端會更新服務的信息,這樣就不會調用已經下線的服務瞭,當然這個會有延遲,有可能會調用到已經失效的服務,所以在客戶端會開啟失敗重試功能來避免這個問題。
  • Eureka Server 會有多個節點組成一個集群,保證高可用。Eureka Server 沒有集成其他第三方存儲,而是存儲在內存中,內部維護一個註冊表的概念。
  • 所以 Eureka Server 之間會將註冊信息復制到集群中的 Eureka Server 的所有節點。 這樣數據才是共享狀態,任何的 Eureka Client 都可以在任何一個 Eureka Server 節點查找註冊表信息。

Eureka服務端單節點構建

打開start.spring.io/ 或者阿裡雲的快速start start.aliyun.com/bootstrap.h… ,開始構建對應的服務端項目。推薦使用阿裡雲的快速start,因為訪問速度更快些。

自動生成完成後,在resource目錄下,新建application.yml文件替換原來的application.properties。內容如下:

#應用名稱
spring:
  application:
    name: eureka-server
server:
  port: 8001
eureka:
  client:
    # 是否將自己實例註冊到Eureka Server中
    register-with-eureka: false
    # 是否應從Eureka Server獲取Eureka註冊表信息
    fetch-registry: false

在SpringBoot的啟動類上添加@EnableEurekaServer 註解,表示是Eureka 服務端。 上述配置完成後,一個單節點的Eureka服務端就配置完成瞭,啟動效果如下:

訪問http://localhost:8761/ 可以進入eureka控制臺。

目前還沒有任何一個服務註冊到 Eureka 中,不過從上圖中,我們還是可以看到關於 Eureka 服務器內存、CPU 、IP等的相關信息。

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進入自我保護模式(SELF PRESERVATION MODE)。

Eureka服務端集群構建

單個 Eureka 服務可能存在的單點失效問題,我們通常都需要構建一個 Eureka 服務器集群來確保註冊中心本身的可用性。與傳統的集群構建方式不同,如果我們把 Eureka 也視為一個服務,也就是說 Eureka服務自身也能註冊到其他 Eureka 服務上,從而實現相互註冊,並構成一個集群。 同樣可以通過單節點構建步驟構建兩個Eureka Server服務A和B。對應的yml配置如下:

server: 
  port: 8761 
eureka: 
  instance: 
    hostname: eurekaA 
  client: 
    serviceUrl:
	   defaultZone: http:// eurekaB:8762/eureka/ 
server: 
  port: 8762 
eureka: 
  instance: 
    hostname: eurekaB 
  client: 
    serviceUrl:
	   defaultZone: http://eurekaA:8761/eureka/ 

**eureka.instance.hostname **是Eureka 實例管理類配置項 ,用於指定當前 Eureka 服務的主機名稱。 需要在本機的hosts文件中添加以下信息:

127.0.0.1 eurekaA 
127.0.0.1 eurekaB

  • 我們可以看到服務端A和B隻調整瞭端口和地址的引用。構建 Eureka 集群模式的關鍵點在於使用客戶端配置項 eureka.client.serviceUrl.defaultZone 用於指向集群中的其他 Eureka 服務器。
  • 所以 Eureka 集群的構建方式實際上就是將自己作為服務並向其他註冊中心註冊自己,這樣就形成瞭一組互相註冊的服務註冊中心以實現服務列表的同步。
  • 這個場景下 register-with-eureka(是否將自己實例註冊到Eureka Server中) 和 fetch-registry(是否應從Eureka Server獲取Eureka註冊表信息)配置項應該都使用其默認的 true 值,我們不需要對其進行顯式的設置。
  • 如果你嘗試使用本機搭建集群環境,顯然 eureka.instance.hostname 配置項中的 eureka1 和 eureka2 是無法訪問的,所以需要在本機hosts 文件中添加以下信息。
  • 現在啟動這兩個 Eureka 服務,然後分別打開 http://127.0.0.1:8761/ 和 http://127.0.0.1:8762/ 端點可以看到各自的服務註冊效果。

Eureka客戶端構建

客戶端引入的pom坐標有差異,需要引入客戶端坐標:

<dependency> 
     <groupId>org.springframework.cloud</groupId> 
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 
</dependency> 

在啟動類上需要加@EnableDiscoveryClient註解表示是Eureka客戶端。

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientProviderApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaClientProviderApplication.class, args);
	}
}

yml配置如下:

spring: 
  application: 
	name: eureka-client  
server: 
  port: 8081 
eureka: 
  client: 
    serviceUrl: 
    #指定eureka服務端地址,如果是集群則通過逗號分隔
	  defaultZone: http://localhost:8761/eureka/ 

配置完成後可以在eureka控制臺查看到相關註冊信息。

以上就是SpringCloud Eureka服務治理服務註冊和服務發現的詳細內容,更多關於SpringCloud Eureka服務的資料請關註WalkonNet其它相關文章!

推薦閱讀: