經過上一篇文章對注冊中心有了大體了解之后,本文將對eurekaServer的源碼進行分析。
大家肯定在想一個問題,咱們要看源碼應該如何入手呢?可以想一想,咱們的eurekaServer項目都做了啥?
1、導入eureka服務端的坐標
2、添加@EnableEurekaServer注解到啟動類上
這時候大家肯定就和我一樣想去看看EnableEurekaServer里面都做了啥,接下來我們就來看看這個類做了啥
接下來我們看一下org.springframework.cloud.netflix.eureka.server.EnableEurekaServer注解里面都做了啥
我們可以看到這里面主要就是引入了org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration類,其他的啥也沒做那么我們接下來看看org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration這個類里面又做了啥
可以看到這里啥也沒做,就直接注入了一個marker,而這個marker里面啥也沒有。這就奇怪了,eureka是從哪里做事情的呢?咱們把目光回到第二張圖里面的注釋里面去,也就是回到org.springframework.cloud.netflix.eureka.server.EnableEurekaServer類中看看類的注釋
哦,好像知道了點什么,他是說org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration這個類是自動配置eurekaServer的類。其實咱們不看這個注釋,仔細想想springboot自動裝配bean的規則咱們也可以去看看他的老巢里面有沒有配置相關的工廠信息。
嗯,這里配置的類不就是作者注釋中寫的那個類嗎?接下來我們就看看這個類里都做了啥
我們來到org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration類中
來到這個類中我們從類聲明頭部分就能發現一些信息,接下來我們就把重點發到途中標紅的數字對應的地方
一、EurekaServerAutoConfiguration本身的信息
那這個類都做了啥呢?接下來我們來看看
首先判斷eureka.dashboard.enabled的配置是否為true,如果為true將開啟eureka的儀表盤,也就是管理后台,方便查看server、注冊中心的一些基本信息
接下來注入了一個對等節點注冊器com.netflix.eureka.registry.PeerAwareInstanceRegistry,這個是集群模式下服務注冊需要用到的注冊器。我們都知道,在集群模式下eureka的server節點都是對等的,沒有主從之分
回到EurekaServerAutoConfiguration,接下來又注入了一個com.netflix.eureka.cluster.PeerEurekaNodes這里面主要是存放server集群中的對等節點相關的操作
這里面主要就是對對等節點的存儲以及刷新
回到EurekaServerAutoConfiguration,接下來又注入了eureka上下文com.netflix.eureka.EurekaServerContext
接下來我們看看這個context里面又做了些啥
可以看到在bean初始化完了之后會調用剛剛我們看到的com.netflix.eureka.cluster.PeerEurekaNodes#start方法進行對等節點的更新以及定時任務啟動,然后在調用注冊器的com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#init方法,這個方法里主要就是定期(默認60s)清理到時間還沒(默認90s)發送心跳的服務列表
回到EurekaServerAutoConfiguration,接下來就注入org.springframework.cloud.netflix.eureka.server.EurekaServerBootstrap
接下來再注入一些與Jersey(類似springmvc,web層框架)相關的信息,目的是為了對外提供一些rest接口比如:注冊、心跳、獲取服務列表等接口
到這里EurekaServerAutoConfiguration做的事情基本就完了,接下來我們看一下org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration.Marker里面又做了啥
二、org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration里面的信息
從上圖我們可以看到這里其實就是注入了一個marker,啥也沒做,但是我們充作者注釋匯總可以看出這個類的作用就是為了激活EurekaServerAutoConfiguration生效的而這個地方正是我們點org.springframework.cloud.netflix.eureka.server.EnableEurekaServer進來看到的類嗎?
三、org.springframework.cloud.netflix.eureka.server.EurekaServerInitializerConfiguration里面的內容
我們可以看到這類實現了org.springframework.context.SmartLifecycle接口,而這個接口的作用就是在spring容器加載和初始化完畢執行一些操作,接下來我們看看他到底需要做些什么
放眼望去,也就只有org.springframework.cloud.netflix.eureka.server.EurekaServerInitializerConfiguration#start方法有點內容,而這個start方法里面主要就做了兩件事1、上線文初始化;2、事件發布
那么我們就來看一下這個上下文初始化方法org.springframework.cloud.netflix.eureka.server.EurekaServerBootstrap#contextInitialized,額,EurekaServerBootstrap是不是很熟悉,這不是剛剛在org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration中注入的對象嗎?
可以看到這里面就做了兩件事1、初始化環境信息;2、初始化上線文接下來我們就繼續跟蹤怎么初始化的
我們重點關注一下上圖標紅的數字的地方
1、為非使用IOC的對象提供一個獲取eureka上下文的接口
2、從對等節點中獲取已注冊列表同步到自己的注冊表中
接下來我們看一下com.netflix.eureka.registry.AbstractInstanceRegistry#register這個方法是怎么注冊的
我們可以看到這個注冊器其實內不就是一個currentHashMap,而從注釋上我們可以知道,這個類就是用作處理客戶端所有請求的,包括注冊、續約、注銷、過期以及狀態變更操作。而注冊主要就是判斷是否存在當前實例如果不存在則創建一個,並更新續約時間
3、接下類我們再看一下com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl#openForTraffic方法都做了啥
這里也是主要做兩件事1、把服務狀態設置為UP;2、調用父類的postInit方法
接下來我們看看父類里面又做了啥
可以看到這里也做了兩件事:1、開啟續約定時任務;2、開啟過期剔除定時任務
到這里我們的服務端啟動流程的源碼就基本看完了。是不是感覺不是太亂亂的?我們再來梳理一下吧
總結:
1、在Eureka服務端加上@EnableEurekaServer注解目的是為了注入Marker
2、Eureka服務端配置了EurekaServerAutoConfiguration的自動裝配信息。而在EurekaServerAutoConfiguration中注入了集群注冊中心、集群管理節點、以及eureka上下文信息
3、對外客戶端提供rest api接口(注冊、心跳等)
4、EurekaServerInitializerConfiguration在bean都初始化玩之后對eureka上下文進行初始化包括擴集群拷貝、過期剔除等