1. 程式人生 > >Eureka原始碼的自我理解

Eureka原始碼的自我理解

Register:服務註冊 當Eureka客戶端向Eureka Server註冊時,它提供自身的元資料,比如IP地址、埠,執行狀況指示符URL,主頁等。

Renew:服務續約 Eureka客戶會每隔30秒傳送一次心跳來續約。 通過續約來告知Eureka Server該Eureka客戶仍然存在,沒有出現問題。 正常情況下,如果Eureka Server在90秒沒有收到Eureka客戶的續約,它會將例項從其登錄檔中刪除。 建議不要更改續約間隔。

Fetch Registries:獲取註冊列表資訊 Eureka客戶端從伺服器獲取登錄檔資訊,並將其快取在本地。客戶端會使用該資訊查詢其他服務,從而進行遠端呼叫。該註冊列表資訊定期(每30秒鐘)更新一次。每次返回註冊列表資訊可能與Eureka客戶端的快取資訊不同, Eureka客戶端自動處理。如果由於某種原因導致註冊列表資訊不能及時匹配,Eureka客戶端則會重新獲取整個登錄檔資訊。 Eureka伺服器快取註冊列表資訊,整個登錄檔以及每個應用程式的資訊進行了壓縮,壓縮內容和沒有壓縮的內容完全相同。Eureka客戶端和Eureka 伺服器可以使用JSON / XML格式進行通訊。在預設的情況下Eureka客戶端使用壓縮JSON格式來獲取註冊列表的資訊。

Cancel:服務下線 Eureka客戶端在程式關閉時向Eureka伺服器傳送取消請求。 傳送請求後,該客戶端例項資訊將從伺服器的例項登錄檔中刪除。該下線請求不會自動完成,它需要呼叫以下內容: DiscoveryManager.getInstance().shutdownComponent();

Eviction 服務剔除 在預設的情況下,當Eureka客戶端連續90秒沒有向Eureka伺服器傳送服務續約,即心跳,Eureka伺服器會將該服務例項從服務註冊列表刪除,即服務剔除。

1.

裡面的重點實現:

進入

super.selectImports(metadata);

List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader
      .loadFactoryNames(this.annotationClass, this.beanClassLoader)));

spring.factories檔案:

註冊的實現:

1.DiscoveryClient這個類中的initScheduledTasks() 初始化所有定時任務

獲取登錄檔,new CacheRefreshThread()中的run()來重新整理登錄檔

這段程式碼處理了註冊的邏輯,開啟了心跳的定時任務進行續租renew()方法

並初始化了InstanceInfoReplicator

這個類的run方法呼叫了discoveryClient.register()

在通過http請求向server進行註冊,再去看server註冊的處理

ApplicationResource這個類的addInstance()打上斷點

當client進行註冊時,PeerAwareInstanceRegistryImpl中的

1.呼叫註冊 2.同步註冊資訊到其他節點

在AbstractInstanceRegistry類的register是註冊的主邏輯,可以發現註冊資訊是由

ConcurrentHashMap<String, Lease<InstanceInfo>> gNewMap來儲存的

InstanceResource這個類的

則是續租的介面

總結:DiscoveryClient這個類中的initScheduledTasks()開啟定時的登錄檔重新整理執行緒,心跳執行緒以及InstanceInfoReplicator這個類實現註冊

服務端的InstanceResource和ApplicationResource來接受續租和註冊請求,通過AbstractInstanceRegistry實現具體的邏輯