04_吃透eureka源码之核心启动类EurekaBootStrap contextInitialized方法分析(1)

1,EurekaBootStrap eureka工程启动的入口类

这个类实现了 ServletContextListener ,当容器启动的时候就调用contextInitialized方法,并且把Servlet的容器事件对象传给EurekaBootStrap
在这里插入图片描述

2,我们来看看contextInitialized

@Override
public void contextInitialized(ServletContextEvent event) {
    try {
        //第一步初始化eureka环境,通过配置管理来管理配置
        initEurekaEnvironment();
        //第二步初始化eureka容器
        initEurekaServerContext();
        //第三步获取当前的ServletContext
        ServletContext sc = event.getServletContext();
        //第四步把EurekaServerContext放在ServletContext上下文中
        sc.setAttribute(EurekaServerContext.class.getName(), serverContext);

    } catch (Throwable e) {
        logger.error("Cannot bootstrap eureka server :", e);
        throw new RuntimeException("Cannot bootstrap eureka server :", e);
    }
}

继续跟进,还记得我给大家说的看源码不要太抓细节了,我们看源码其实大部分的命名都可以看得出来,大概是什么意思,如果你想把每行代码都要理解的话,不现实,我也不建议去读每个代码的细节,我本人读源码就抓最有价值的东西,比如运行的大方向流程,架构思想,设计模式,功能设计原理和机制。这样读源码就不会让你很难受,要不然你就读不下去。
我们大概看一下这个方法,ConfigurationManager这个类基本上就可以知道是一个配置管理,ConfigurationManager.getConfigInstance()很明显是一个获取配置的实例对象。其他的基本上就是一个set和get的使用,我们就不用太关注了。

    protected void initEurekaEnvironment() throws Exception {
        logger.info("Setting the eureka configuration..");

        String dataCenter = ConfigurationManager.getConfigInstance().getString(EUREKA_DATACENTER);
        if (dataCenter == null) {
            logger.info("Eureka data center value eureka.datacenter is not set, defaulting to default");
            ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, DEFAULT);
        } else {
            ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, dataCenter);
        }
        String environment = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT);
        if (environment == null) {
            ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, TEST);
            logger.info("Eureka environment value eureka.environment is not set, defaulting to test");
        }
    }

继续跟进ConfigurationManager.getConfigInstance()方法中看看。
在这里插入图片描述

通过volatile进行申明AbstractConfiguration
学过volatile的开发都知道,这个关键字保证了,多线程之间数据的可见性保证和内存屏障禁止指令重排的。
在这里插入图片描述
synchronized (ConfigurationManager.class) 对当前的类进行枷锁,然后进行初始化,这个就是比较典型的dubbo check + volatile的单列模式。到此我觉得源码到此就可以了,不用太进行细节的源码读取,我们基本上知道,他整体就是通过一个单列模式进行配置的初始化和管理,用于后续其他组件的配置获取和管理用的就可以了。

给大家补充一下,dubbo check + volatile
可以借助这个模式用在我们自己平时的项目中,借鉴和吸收别人好的思想和代码编写,也是我们学习源码重要的原因。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值