歡迎光臨
每天分享高質量文章

註冊中心 Eureka 原始碼解析 —— 專案結構簡介

本文主要基於 Eureka 1.8.X 版本

  • 1. 概述

    • 1.1 簡介

    • 1.2 專案結構

  • 2. eureka-client

    • 2.1 eureka-client-archaius2

    • 2.2 eureka-client-jersey2

  • 3. eureka-core

    • 3.1 eureka-core-jersey2

  • 4. eureka-resources

  • 5. eureka-server

    • 5.1 eureka-server-governator

  • 6. eureka-examples

  • 7. eureka-test-utils

  • 666. 彩蛋


友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群和【芋艿】搞基嗨皮。

友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群和【芋艿】】搞基嗨皮。

友情提示:歡迎關註公眾號【芋道原始碼】。?關註後,拉你進【原始碼圈】微信群和【芋艿】】搞基嗨皮。


1. 概述

本文主要分享 Eureka 的專案結構,附帶部分簡介和原理。

Eureka 專案地址:https://github.com/Netflix/eureka

  • 請註意下,不是 spring-cloud-netflix-eureka-client / spring-cloud-netflix-eureka-server 。

  • 筆者 Fork 的代碼倉庫 https://github.com/YunaiV/eureka,會隨著這個系列的文章逐漸增加中文註釋,可以先 Star 一下。

推薦 Spring Cloud 書籍

  • 請支持正版。下載盜版,等於主動編寫低級 BUG 。

  • 程式猿DD —— 《Spring Cloud微服務實戰》

  • 周立 —— 《Spring Cloud與Docker微服務架構實戰》

  • 兩書齊買,京東包郵。

1.1 簡介

Eureka 是 Netflix 開源的服務註冊發現組件,分成 Client 和 Server 兩部分。簡化架構如下圖:

  • Eureka-Server :通過 REST 協議暴露服務,提供應用服務的註冊和發現的功能。

  • Application Provider :應用服務提供者,內嵌 Eureka-Client ,通過它向 Eureka-Server 註冊自身服務。

  • Application Consumer :應用服務消費者,內嵌 Eureka-Client ,通過它從 Eureka-Server 獲取服務串列。

  • 請註意下,Application Provider 和 Application Consumer 強調扮演的角色,實際可以在同一 JVM 行程,即是服務的提供者,又是服務的消費者。

1.2 專案結構

Eureka 專案結構如下:

❓❓❓不只 Eureka-Client 、 Eureka-Server ❓❓❓

淡定。我們一起來瞭解每個模塊的功能和結構。

2. eureka-client

eureka-client 模塊為 Eureka-Client 的功能實現:

  • com.netflix.appinfo 包:Eureka-Client 的應用配置。此處的應用指的就是上文提到的 Application Provider,Application Consumer。

  • com.netflix.discovery 包:Eureka-Client 的註冊與發現相關功能。

    • com.netflix.discovery.shared.transport 包:Eureka-Client 對 Eureka-Server RESTful 的 HTTP 客戶端,基於 Jersey Client 實現。Jersey 在下文「2.1 eureka-client-jersey2」詳細解析。

    • com.netflix.discovery.shared.dns 包 :DNS 解析器。

    • com.netflix.discovery.shared.resolver 包:Eureka Endpoint 解析器。在 《Eureka 原始碼解析 —— EndPoint 與 解析器》 有詳細解析。

    • com.netflix.discovery.DiscoveryClient 類:註冊發現客戶端實現類。

    • com.netflix.discovery.guice 包:Eureka 計劃使用 Google Guice 實現依賴註入,參見本文「5.1 eureka-server-governator」。一方面 Guice 是輕量級的依賴註入框架,另一方面避免和業務代碼的 Spring 版本衝突。

      Guice (pronounced ‘juice’) is a lightweight dependency injection framework for Java 6 and above, brought to you by Google.

    • com.netflix.discovery.converters 包:Eureka 內部傳輸資料編解碼轉換器,支持 XML / JSON 格式。

    • com.netflix.discovery.endpoint 包:目前該包正在重構,和下文的 com.netflix.discovery.shared.dns 和 com.netflix.discovery.shared.resolver 用途相近。

    • com.netflix.disvoery.provider 包:目前僅有 DiscoveryJerseyProvider 類。該類宣告自定義的 Jersey 請求和響應的序列化和反序列化實現。

    • com.netflix.disvoery.providers 包:目前僅有 DefaultEurekaClientConfigProvider 類。該類實現 javax.inject.Provider 接口,設置 EurekaClientConfig ( Eureka 客戶端配置 ) 的生成工廠。感興趣的同學,可以點擊《Google-Guice入門介紹》搜索 Provider 關鍵字。

    • com.netflix.discovery.shared 包:Eureka-Client 和 Eureka-Server 註冊發現相關的共享重用的代碼。下文你會看到,Eureka-Server 通過 eureka-core 模塊實現,eureka-core 依賴 eureka-client粗一看,我們會感覺 What ?Eureka-Server 代碼依賴 Eureka-Client 代碼!?這個和 Eureka-Server 多節點註冊信息 P2P 同步的實現有關。一個 Eureka-Server 收到 Eureka-Client 註冊請求後,Eureka-Server 會自己模擬 Eureka-Client 發送註冊請求到其它的 Eureka-Server,因此部分實現代碼就使用到了這個包,在 《Eureka 原始碼解析 —— Eureka-Server 集群同步》 詳細解析。

    • com.netflix.discovery.util 包 :工具類。

2.1 eureka-client-archaius2

Archaius 是 Netflix 開源的配置管理組件。

Archaius 目前有 1.x 和 2.x 版本,預設情況下,Eureka 使用 1.x 版本。從官方文件上來看,2.x 版本仍然在開發中。

FROM eureka-client-archaius2 README 
This is a version of eureka-client that has been ported to use Archaius 2.x as the backing configuration system. Please note that this client is still work in progress. This client is also only java8 compatible (as Archaius 2.x is only java8 compatible).

2.2 eureka-client-jersey2

Jersey 是 JAX-RS(JSR311)開源參考實現,用於構建 RESTful Web Service。

  • Eureka-Server 使用 Jersey Server 創建 RESTful Server 。

  • Eureka-Client 使用 Jersey Client 請求 Eureka-Server 。

Jersey 目前有 1.x 和 2.x 版本,預設情況下,Eureka 使用 1.x 版本。從官方文件上來看,2.x 版本由社區實現,Netflix 自己暫未使用。

FROM eureka-client-jersey2 README 
Please note that this jersey2 compatible Eureka client (eureka-client-jersey2) is created and maintained by the community. Netflix does not currently use this library internally.

3. eureka-core

eureka-core 模塊為 Eureka-Server 的功能實現:

  • com.netflix.eureka.EurekaBootStrap 類:Eureka-Server 啟動類。

  • com.netflix.eureka.aws 包:與亞馬遜 AWS 服務相關的類。由於筆者和大多數讀者都對 AWS 暫不瞭解,本系列《Eureka 原始碼解析》會跳過和 AWS 相關的代碼。

  • com.netflix.eureka.cluster 包:Eureka-Server 集群資料複製相關的代碼。

  • com.netflix.eureka.lease 包:應用註冊後的租約管理( 註冊 / 取消 / 續期 / 過期 )。

  • com.netflix.eureka.resousrces 包:資源,基於 Jersey Server 實現,相當於 Spring MVC 的控制層代碼。

  • com.netflix.eureka.transport 包:Eureka-Server 對 Eureka-Server 的 RESTful HTTP 客戶端,基於 com.netflix.discovery.shared.transport 封裝實現。

  • com.netflix.eureka.util 包:工具類。

3.1 eureka-core-jersey2

參見本文「2.1 eureka-client-jersey2」。

4. eureka-resources

eureka-resources 模塊,使用 JSP 實現 Eureka-Server 的運維後臺界面。專案結構如下圖:

5. eureka-server

eureka-server 模塊,將 eureka-client + eureka-core + eureka-resources 三者打包成 Eureka-Server 的 war 包。專案結構如下圖:

5.1 eureka-server-governator

eureka-server-governator 模塊,使用 Netflix Governator 管理 Eureka-Server 的生命周期。

FROM http://www.infoq.com/cn/news/2013/02/netflix-opensource 
Governator,一款對 Google Guice 進行擴展的類庫,提供了Classpath掃描及自動系結、生命周期管理、成員屬性驗證等功能。

目前該模塊正在實現階段。

FROM eureka-server-governator README 
This server build is still experimental.

6. eureka-examples

eureka-examples 模塊,提供 Eureka-Client 使用例子。

7. eureka-test-utils

eureka-test-utils 模塊,提供 Eureka 單元測試工具類。

666. 彩蛋

第一篇 Eureka 的文章,如果有地方寫的不正確,還望指出,謝謝。

下一篇 Eureka 除錯環境搭建。

更多 Eureka 內容,推薦閱讀如下文章:

  • 攜程 —— 《深度剖析服務發現組件Netflix Eureka》

  • 程式員DD —— 《Spring Cloud原始碼分析(一)Eureka》

  • 王鴻飛 —— 《Spring Cloud Netflix Eureka原始碼導讀與原理分析》

  • 許進 —— 《Spring Cloud Netflix之Eureka上篇》

赞(0)

分享創造快樂