圖檔來源https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
從注解開始了解源碼
繼續跟進EurekaServerMarkerConfiguration.class 發現什麼都沒有做隻是執行了一下marker()
@EnableEurekaServer 隻是做了這點事情,那麼猜測一定是在@SpringBootApplication 有相關操作,并且一定會有對marker()的處理 ,帶着這些疑問我們繼續看springbootApplication注解
關鍵在于@EnableAutoConfiguration
@EnableAutoConfiguration 自動配置。既然是自動配置 那麼可以看下它都配置那些bean
最終繼續跟進注解@import相關的class資訊會找到AutoConfigurationImportSelector.class
這個類主要的功能是自動加載相關bean.
此方法就會看到加載的bean資訊,我們本次需要關注EurekaServerAutoConfiguration就在其中,既然加載這個bean 就去看看這個bean都做些什麼事情。
@ConditionalOnBean(Marker.class) 這個是表示隻有在spring容器
裡面含有Market這個執行個體的時候,才會加載目前這個Bean)也就是我們看到@EurekaServer注解裡的做marker()調用,通知開啟EurekaServer
關注EurekaServerAutoConfigutation.class 會發現都是注入一些相關的bean 其中有一個eurekaServerBootstrap的注入
繼續跟進eurekaServerBootsrtap都提供了那些方法
// 初始化Eureka的環境變量
initEurekaEnvironment();
// 初始化Eureka的上下文
initEurekaServerContext();
// 從相鄰的eureka節點複制清單 這個是叢集處理同步通知
int registryCount = this.registry.syncUp();
// 開啟一個定時任務 用于管理服務清單
this.registry.openForTraffic(this.applicationInfoManager, registryCount);
繼續跟進openfortraffic會找到PeerAwareInstanceRegistryImpl.class
expectedNumberOfRenewsPerMin // 計算每分鐘最大續約數
numberOfRenewsPerMinThreshold//每分鐘最小續約數
發現調用postinit 這個方法主要是開啟定時每60秒更新下清單類别 逾時續約的剔除
這個定時就是一個timertask來執行的 EvictionTask---evict()方法
通過看evict方法 其實報存 服務清單清單的是一個map資料
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry = new ConcurrentHashMap();
key 存儲服務的名字
value 存儲中繼資料
我們知道 EurekaServer 管理清單的實作了
EurekaServerAutoConfiguration初始化完成之後EurekaServerInitializerConfiguration.class的start方法來完成啟動
到此 EurakaServer的管理清單清單的代碼分析完畢,叢集通知資料同步也在EurekaServerAutoConfiguration中 有興趣的可以自己看下 大緻原理一樣的