上面兩篇文章我們分別對eureka服務端以及客戶端的啟動流程源碼進行了分析,我們知道客戶端啟動之后需要去獲取服務列表以及注冊自己、發送心跳等。那這些接口都是在哪里提供的呢?本文就來看一下這些接口都是怎么實現的
一、服務注冊
如果大家還有印象,我們在服務端注冊的時候有提到jersey,在服務端啟動的時候會把jersey注入到容器中,我們再回顧一下這里
從上面的兩張圖我們可以知道,在注入bean之前,需要掃描EUREKA_PACKAGES下的javax.ws.rs.Path注解,javax.ws.rs.Path注解相當於SpringMvc中的RequestMapping注解,在jersey中對外提供的接口都叫資源,他對外提供的接口都在com.netflix.eureka.resources包下。接下來我們看一下com.netflix.eureka.resources.ApplicationResource,這是jersey用來處理與特定請求相關的資源
com.netflix.eureka.resources.ApplicationResource#addInstance 這個方法就是用來對外提供注冊接口的,接下來我們看看里面都做了啥
一堆判斷最后委托給注冊中心進行注冊,接下來我們可以下注冊中心怎么注冊的進入com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#register
我們可以看到,這里主要就是獲取過期剔除時間(默認90s)然后條用父類的注冊信息,最后拷貝到其他集群節點去。接下來我們看一下父類是怎么注冊的。進入到com.netflix.eureka.registry.AbstractInstanceRegistry#register
嗯?這。。這不是eureka服務端注冊使用的那個方法嗎?由於這個方法在服務端啟動流程中已經說過了,這里就不繼續看了。
接下來我們看一下拷貝到其他對等節點的方法com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#replicateToPeers
看到這里熟不熟悉?com.netflix.discovery.shared.transport.EurekaHttpClient是之前總用來發送請求的嗎,在客戶端啟動流程分析中我們可沒少見他啊。這里我們就不具體往下看了。好了,到這里我們的服務注冊接口就已經看完了
二、服務續約(心跳)
續約是在com.netflix.eureka.resources.InstanceResource#renewLease中
進入com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#renew
可以看到這里也是先跟新自己然后再同步到其他對等節點中。進入com.netflix.eureka.registry.AbstractInstanceRegistry#renew
進入com.netflix.eureka.lease.Lease#renew
這里就是把上次更新的時間戳加上續約期限回到com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#renew
我們可以看到這里同步到集群對等節點的方法和注冊同步是一樣的只是傳入的參數不一樣而已
三、取消續約
取消續約是在com.netflix.eureka.resources.InstanceResource#cancelLease中
進入com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#cancel
同樣的套路進入com.netflix.eureka.registry.AbstractInstanceRegistry#cancel
在進入com.netflix.eureka.registry.AbstractInstanceRegistry#internalCancel
進入com.netflix.eureka.lease.Lease#cancel
可以發現,這里只是更新了一下剔除時間
接下來我們看一下服務端對客戶端暴露獲取服務列表的接口
進入com.netflix.eureka.resources.ApplicationsResource#getContainers方法中
可以看到這里直接調用com.netflix.eureka.registry.ResponseCacheImpl#getGZIP方法, 進入該方法
進入com.netflix.eureka.registry.ResponseCacheImpl#getValue方法
可以看到這里是直接從一個readOnlyCacheMap中獲取數據,如果沒有再從readWriteCacheMap中獲取數據,再將獲取到的數據放入緩存
接下來我們看看這兩個緩存到底是什么東西
可以看到這個readOnlyCacheMap就是一個concurrentHashMap,而readWriteCacheMap 則是com.google.common.cache.LoadingCache類型的這是guava緩存
到這里我們就知道了eureka提供獲取服務列表接口的了
但是我們可以繼續看一下前面提到的這兩個緩存是什么時候初始化以及數據變更的
我們先來看看com.netflix.eureka.registry.ResponseCacheImpl#ResponseCacheImpl的構造方法
我們可以看到,在這個構造方法中我們傳過來了com.netflix.eureka.registry.AbstractInstanceRegistry這就是咱們eureka的注冊器啊,而這里他又注冊了對key的移除事件監聽
接着往下看,看看這個任務里做了啥
可以看到這里就是從readWriteCacheMap中同步緩存到readOnlyCacheMap中
好了,到這里咱們基本就大功告成了!注冊、查詢、續約、注銷接口都已經說完了