源碼剖析 啟動(dòng)Eureka Server(一)@EnableEurekaServer注解

Spring Cloud Netflix Eureka項(xiàng)目將Netflix公司的Eureka項(xiàng)目加以封裝彼水,以適配Spring Boot自動(dòng)化配置的機(jī)制阀趴,通過注解在Spring Boot項(xiàng)目啟動(dòng)時(shí)啟動(dòng)Eureka Server巫橄。
我們通過閱讀相關(guān)源碼,看看這一過程是如何實(shí)現(xiàn)的。


回顧我們的eureka-demo中的eureka-server項(xiàng)目壳坪,在我們的項(xiàng)目啟動(dòng)類Server上有一個(gè)@EnableEurekaServer注解暇昂。

@SpringBootApplication
@EnableEurekaServer
public class Server {
    //...
}

查看這個(gè)注解的定義

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {
}

可以看到它Import導(dǎo)入了EurekaServerMarkerConfiguration類

@Configuration
public class EurekaServerMarkerConfiguration {
    @Bean
    public Marker eurekaServerMarkerBean() {
        return new Marker();
    }
    class Marker {
    }
}

這個(gè)EurekaServerMarkerConfiguration會(huì)往Spring容器中注入一個(gè)eurekaServerMarkerBean莺戒,這個(gè)Marker是一個(gè)空類,那在這里起到什么作用呢急波?
仔細(xì)查看這個(gè)類的注釋从铲,可以看到它只是一個(gè)開關(guān)標(biāo)記,用來激活EurekaServerAutoConfiguration類的澄暮。

/**
 * Responsible for adding in a marker bean to activate
 * {@link EurekaServerAutoConfiguration}
 *
 * @author Biju Kunjummen
 */

查看EurekaServerAutoConfiguration類的定義

@Configuration
@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
@EnableConfigurationProperties({ EurekaDashboardProperties.class,
        InstanceRegistryProperties.class })
@PropertySource("classpath:/eureka/server.properties")
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter
  • @Configuration注解表示這是一個(gè)配置類名段,通過@Bean注解聲明一些注入到Spring IOC容器中的Bean阱扬。
  • @ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class),表示只要Spring容器中有EurekaServerMarkerConfiguration.Marker.class類的實(shí)例存在伸辟,那么就會(huì)將這個(gè)EurekaServerAutoConfiguration也注入到Spring容器中麻惶。
  • @Import(EurekaServerInitializerConfiguration.class)表明它導(dǎo)入了EurekaServerInitializerConfiguration這個(gè)類。
  • 此外信夫,這個(gè)EurekaServerAutoConfiguration繼承自WebMvcConfigurer窃蹋,可以用來定義Spring MVC的一些配置。

在這個(gè)類中忙迁,我們并沒有發(fā)現(xiàn)與啟動(dòng)Eureka相關(guān)的代碼脐彩,那么我們來看看它引入的這個(gè)EurekaServerInitializerConfiguration。

@Configuration
public class EurekaServerInitializerConfiguration
        implements ServletContextAware, SmartLifecycle, Ordered {

可以看到姊扔,這也是一個(gè)配置類惠奸,同時(shí)它實(shí)現(xiàn)了ServletContextAware接口,可以在Servlet容器啟動(dòng)后得到ServletContext容器上下文恰梢;它還實(shí)現(xiàn)了SmartLifecycle佛南,這樣在spring 生命周期中會(huì)調(diào)用這個(gè)類相關(guān)的方法。比如在spring初始化時(shí)嵌言,會(huì)調(diào)用它start方法嗅回。

@Override
    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //TODO: is this class even needed now?
                                                eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);
                    log.info("Started Eureka Server");
                    publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));
                    EurekaServerInitializerConfiguration.this.running = true;
                    publish(new EurekaServerStartedEvent(getEurekaServerConfig()));
                }
                catch (Exception ex) {
                    // Help!
                    log.error("Could not initialize Eureka servlet context", ex);
                }
            }
        }).start();
    }

start方法中啟動(dòng)了一個(gè)后臺(tái)線程,它會(huì)執(zhí)行這一行代碼摧茴。

eurekaServerBootstrap.contextInitialized(EurekaServerInitializerConfiguration.this.servletContext);

eurekaServerBootstrap是EurekaServerInitializerConfiguration類的成員變量绵载,對(duì)應(yīng)的類是EurekaServerBootstrap。
來看看這個(gè)類的contextInitialized方法

public void contextInitialized(ServletContext context) {
        try {
            initEurekaEnvironment();//初始化Eureka運(yùn)行環(huán)境
            initEurekaServerContext();//初始化Eureka運(yùn)行上下文
            context.setAttribute(EurekaServerContext.class.getName(), this.serverContext);
        }
        catch (Throwable e) {
            log.error("Cannot bootstrap eureka server :", e);
            throw new RuntimeException("Cannot bootstrap eureka server :", e);
        }
    }

這個(gè)方法調(diào)用了initEurekaEnvironment()苛白,初始化Eureka運(yùn)行環(huán)境娃豹;調(diào)用了initEurekaServerContext(),初始化Eureka運(yùn)行上下文购裙。關(guān)于這兩個(gè)方法的細(xì)節(jié)懂版,我們?cè)诤竺娴奈恼略偌?xì)說。

至此Eureka Server就隨著Spring容器的一起啟起了躏率。


相關(guān)流程圖如下:

Eureka源碼剖析(一)注解方式啟動(dòng)Eureka Server.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末躯畴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薇芝,更是在濱河造成了極大的恐慌蓬抄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夯到,死亡現(xiàn)場(chǎng)離奇詭異嚷缭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)黄娘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門峭状,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逼争,你說我怎么就攤上這事优床。” “怎么了誓焦?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵胆敞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我杂伟,道長(zhǎng)移层,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任赫粥,我火速辦了婚禮观话,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘越平。我一直安慰自己频蛔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布秦叛。 她就那樣靜靜地躺著晦溪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挣跋。 梳的紋絲不亂的頭發(fā)上三圆,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音避咆,去河邊找鬼舟肉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牌借,可吹牛的內(nèi)容都是我干的度气。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼膨报,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼磷籍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起现柠,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤院领,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后够吩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體比然,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年周循,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了强法。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片万俗。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饮怯,靈堂內(nèi)的尸體忽然破棺而出闰歪,到底是詐尸還是另有隱情,我是刑警寧澤蓖墅,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布库倘,位于F島的核電站,受9級(jí)特大地震影響论矾,放射性物質(zhì)發(fā)生泄漏教翩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一贪壳、第九天 我趴在偏房一處隱蔽的房頂上張望饱亿。 院中可真熱鬧,春花似錦寥袭、人聲如沸路捧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杰扫。三九已至,卻和暖如春膘掰,著一層夾襖步出監(jiān)牢的瞬間章姓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工识埋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凡伊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓窒舟,卻偏偏與公主長(zhǎng)得像系忙,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惠豺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容