领导让我研究 Eureka 源码 | 启动过程

作者:微信小助手

发布时间:2021-10-09T18:59:35

最近在倒腾 Eureka 源码,大环境太卷了,必须得卷点源码才行,另外呢,能够读懂开源项目的源码、解决项目中遇到的问题是实力的象征,是吧?如果只是会用些中间件,那是不够的,和 CRUD 区别不大。

话不多说,源码走起。本篇是 Eureka 源码分析的开篇,后续会持续分享源码解析的文章。

首先呢,Eureka 服务的启动入口在这里:EurekaBootStrap.java 的 contextInitialized 方法。

启动的整个流程图在文末,不想看源码剖析的,可以直接看文末流程图。

关于源码的获取直接到官网下载就好了。https://github.com/Netflix/eureka

本文已收录到我的 github:https://github.com/Jackson0714/PassJava-Learning

一、初始化环境

打开源码,找到这个启动类,EurekaBootStrap.java,在这个路径下:

\eureka\eureka-core\src\main\java\com\netflix\eureka\EurekaBootStrap.java

启动时序图给大家画好了:

初始化环境时序图

启动代码:

@Override
public void contextInitialized(ServletContextEvent event) {
    initEurekaEnvironment();
    initEurekaServerContext();
    // 省略非核心代码
}

分为两步,初始化环境和初始化上下文,先来看第一步。

初始化环境的方法是 initEurekaEnvironment(),点进去看下这个方法做了什么。

String dataCenter = ConfigurationManager.    getConfigInstance().getString(EUREKA_DATACENTER);

就是获取配置管理类的一个单例。单例的实现方法用的是 双重检测 +volatile

public static AbstractConfiguration getConfigInstance() {
   if (instance == null) {
        synchronized (ConfigurationManager.class{
            if (instance == null) {
                instance = getConfigInstance(false));
    &nbs