Spring Cloud Eureka原理分析(一):註冊過程-服務端

Eureka的官方文檔和Spring Cloud Eureka文檔都有不少含糊的地方,其餘資料也很少,只有讀讀源碼維持生活這樣子……html

本文將不會詳細介紹每一個細節,而是講述一些關鍵的地方,便於查閱。java

一些好的參考資料

Eureka-Server接受註冊請求

正常狀況下會進入PeerAwareInstanceRegistryImpl#register(...)方法:spring

@Override
public void register(final InstanceInfo info, final boolean isReplication) {
   // 租約過時時間
   int leaseDuration = Lease.DEFAULT_DURATION_IN_SECS;
   if (info.getLeaseInfo() != null && info.getLeaseInfo().getDurationInSecs() > 0) {
       leaseDuration = info.getLeaseInfo().getDurationInSecs();
   }
   // 註冊應用實例信息
   super.register(info, leaseDuration, isReplication);
   // Eureka-Server 複製
   replicateToPeers(Action.Register, info.getAppName(), info.getId(), info, null, isReplication);
}
複製代碼

先調用父類 AbstractInstanceRegistry#register(...) 方法完成註冊,再將這個註冊信息複製到同伴節點。bash

咱們先來看註冊部分。網絡

1 註冊表registry的實際結構

registry在AbstractInstanceRegistry中聲明:ide

private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry;
複製代碼

它就是一個ConcurrentHashMap, 其Key爲應用的AppID,Value爲一個Map,其中的鍵值對爲該應用的各個實例。(InstanceId爲鍵,Lease<InstanceInfo>>爲值)spa

Lease表示一個應用實例(Instance)的註冊期限,有租約到期和續租之說。InstanceInfo則表示一個實例的狀態,基本由客戶端(服務實例自己)提供。顯然,由於服務可能朝生夕死,網絡環境變幻無窮,須要知道服務的狀態,決定可不可用。.net

上一個圖,以對LeaseInstanceInfo有個初步印象:code

Lease經過holder持有InstanceInfo

2 核心註冊過程

AbstractInstanceRegistry#register(...) 方法很長,這裏不所有貼出來,不然看得太累。只說一些重要的片斷。其他細節之後須要時補充。cdn

  • 首先從registry中找到應用所對應的數據,記爲gMap。若是沒有,說明以前沒有註冊過(或被刪除了),那就建立一個Map,加到registry中去。
// 以AppName做爲應用的ID
Map<String, Lease<InstanceInfo>> gMap = registry.get(registrant.getAppName());
// 若是沒有,就建立並添加,略
複製代碼
  • 在gMap中找這次註冊的實例對應的Lease。注意應用和實例之間的關係。 若是有,說明以前已經註冊成功過,須要使用其中的一些信息,好比serviceUpTimestamp等。而後設置lease的registrationTimestamplastUpdateTimestamp爲當前時間。
  • 通過一個OverriddenInstanceStatus計算,得出此應用實例當前的狀態。計算輸入包括registry中已有的該實例的lease的狀態,和這次註冊所聲明的狀態,以及服務端一系列rule來判斷。(一樣,這裏的細節若有必要之後再講)最終的InstanceStatus有以下幾種狀態:

  • 設置當前的InstanceInfo的lastUpdatedTimestamp
  • 若是是第一次註冊,設置lease的serviceUpTimestamp
  • recentlyChangedQueue中加一個包裝後的當前的lease,這個是幹啥的咱們後面再講。
  • 調用invalidateCache(),傳入當前的應用名,實例的虛擬IP地址。這是幹啥的且聽下回。

3 複製註冊信息到同伴節點過程

方式出人意料的簡單:依次調用同伴節點的register接口。

Over.

相關文章
相關標籤/搜索