Eureka的官方文檔和Spring Cloud Eureka文檔都有不少含糊的地方,其餘資料也很少,只有讀讀源碼維持生活這樣子……html
本文將不會詳細介紹每一個細節,而是講述一些關鍵的地方,便於查閱。java
正常狀況下會進入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
咱們先來看註冊部分。網絡
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
上一個圖,以對Lease
和InstanceInfo
有個初步印象:code
AbstractInstanceRegistry#register(...)
方法很長,這裏不所有貼出來,不然看得太累。只說一些重要的片斷。其他細節之後須要時補充。cdn
// 以AppName做爲應用的ID
Map<String, Lease<InstanceInfo>> gMap = registry.get(registrant.getAppName());
// 若是沒有,就建立並添加,略
複製代碼
serviceUpTimestamp
等。而後設置lease的registrationTimestamp
和lastUpdateTimestamp
爲當前時間。lastUpdatedTimestamp
serviceUpTimestamp
。recentlyChangedQueue
中加一個包裝後的當前的lease,這個是幹啥的咱們後面再講。invalidateCache()
,傳入當前的應用名,實例的虛擬IP地址。這是幹啥的且聽下回。方式出人意料的簡單:依次調用同伴節點的register接口。
Over.