当前位置: 首页 > news >正文

Eureka 学习笔记(1)

一 、contextInitialized()

eureka-core里面,监听器的执行初始化的方法,是contextInitialized()方法,这个方法就是整个eureka-server启动初始化的一个入口。

 @Overridepublic void contextInitialized(ServletContextEvent event) {try {initEurekaEnvironment();initEurekaServerContext();ServletContext sc = event.getServletContext();sc.setAttribute(EurekaServerContext.class.getName(), serverContext);} catch (Throwable e) {logger.error("Cannot bootstrap eureka server :", e);throw new RuntimeException("Cannot bootstrap eureka server :", e);}}

二、initEurekaEnvironment()

我们可以看到第一行代码就是 initEurekaEnvironment();我们点进去可以看到

  /*** Users can override to initialize the environment themselves.*/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()方法,这个方法,其实就是初始化ConfigurationManager的实例,也就是一个配置管理器的初始化的这么一个过程。

ConfigurationManager是什么呢?看字面意思都猜的出来,配置管理器,管理eureka自己的所有的配置,读取配置文件里的配置到内存里,供后续的eureka-server运行来使用。

三、创建AbstractConfiguration

我们点击getConfigInstance,可以看到下面的代码

 public static AbstractConfiguration getConfigInstance() {if (instance == null) {synchronized (ConfigurationManager.class) {if (instance == null) {instance = getConfigInstance(Boolean.getBoolean(DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG));}}}return instance;}

这是使用double check + volatile创建了一个AbstractConfiguration实例。

单例模式一个经典的作用,就是将配置作为单例,但是一般来说如果你要自己解析配置文件,读取配置的话,一般来说除非你是底层自研的框架。此时你可以设计一个ConfigurationManager,就是一个配置管理器,一般这个会做成单例的。

接下来我们看下createDefaultConfigInstance()方法。

private static AbstractConfiguration createDefaultConfigInstance() {ConcurrentCompositeConfiguration config = new ConcurrentCompositeConfiguration();  try {DynamicURLConfiguration defaultURLConfig = new DynamicURLConfiguration();config.addConfiguration(defaultURLConfig, URL_CONFIG_NAME);} catch (Throwable e) {logger.warn("Failed to create default dynamic configuration", e);}if (!Boolean.getBoolean(DISABLE_DEFAULT_SYS_CONFIG)) {SystemConfiguration sysConfig = new SystemConfiguration();config.addConfiguration(sysConfig, SYS_CONFIG_NAME);}if (!Boolean.getBoolean(DISABLE_DEFAULT_ENV_CONFIG)) {EnvironmentConfiguration envConfig = new EnvironmentConfiguration();config.addConfiguration(envConfig, ENV_CONFIG_NAME);}ConcurrentCompositeConfiguration appOverrideConfig = new ConcurrentCompositeConfiguration();config.addConfiguration(appOverrideConfig, APPLICATION_PROPERTIES);config.setContainerConfigurationIndex(config.getIndexOfConfiguration(appOverrideConfig));return config;}

1)创建一个ConcurrentCompositeConfiguration实例,这个东西,其实就是代表了所谓的配置,包括了eureka需要的所有的配置。在初始化这个实例的时候,调用了clear()方法

 public ConcurrentCompositeConfiguration(){clear();}

2)我们点击clear可以看到

  @Overridepublic final void clear(){fireEvent(EVENT_CLEAR, null, null, true);configList.clear();namedConfigurations.clear();// recreate the in memory configurationcontainerConfiguration = new ConcurrentMapConfiguration();containerConfiguration.setThrowExceptionOnMissing(isThrowExceptionOnMissing());containerConfiguration.setListDelimiter(getListDelimiter());containerConfiguration.setDelimiterParsingDisabled(isDelimiterParsingDisabled());containerConfiguration.addConfigurationListener(eventPropagater);configList.add(containerConfiguration);overrideProperties = new ConcurrentMapConfiguration();overrideProperties.setThrowExceptionOnMissing(isThrowExceptionOnMissing());overrideProperties.setListDelimiter(getListDelimiter());overrideProperties.setDelimiterParsingDisabled(isDelimiterParsingDisabled());overrideProperties.addConfigurationListener(eventPropagater);fireEvent(EVENT_CLEAR, null, null, false);containerConfigurationChanged = false;invalidate();}

fireEvent()发布了一个事件(EVENT_CLEAR),fireEvent()这个方法其实是父类的方法,牵扯比较复杂的另外一个项目(ConfigurationManager本身不是属于eureka的源码,是属于netflix config项目的源码,暂不学习。

总的来说,就是往ConcurrentCompositeConfiguration实例加入了一堆别的config,然后搞完了以后,就直接返回了这个实例,就是作为所谓的那个配置的单例

四、初始化数据中心的配置,如果没有配置的话,就是DEFAULT data center

 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);

五、初始化eurueka运行的环境,如果你没有配置的话,默认就给你设置为test环境

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");}

六、initEurekaEnvironment的初始化环境的逻辑,就结束了

七、流程图

参考:Eureka 学习笔记(六)Eureka初始化环境

相关文章:

  • 亿达中国武汉园区入选“武汉市科技金融工作站”及“武汉市线下首贷服务站”
  • 【JavaScript脚本宇宙】玩转图像处理:从基础到高级,这些库你不能错过!
  • 今年的618,似乎很平淡!
  • 计算机网络:运输层 - 概述
  • 【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】
  • 如何编辑和修改ROM,快速上手
  • mysql安装配置教程(Linux+Windows)
  • 工具清单 - Bug追踪管理
  • 01- ES6语法
  • APP渗透、WIFI近源渗透之透明代理下的流量分析与嗅探
  • 深度神经网络——什么是降维?
  • 数据结构——顺序表的实现
  • Spring-boot-logback-spring.xml文件Appender标签下的属性
  • 英码科技携手昇腾打造“三位一体”智慧化工解决方案,使能化工产业管理更高效、智能
  • C# Winform 侧边栏,切换不同页面
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017-09-12 前端日报
  • Android框架之Volley
  • Brief introduction of how to 'Call, Apply and Bind'
  • Elasticsearch 参考指南(升级前重新索引)
  • IndexedDB
  • input的行数自动增减
  • iOS 颜色设置看我就够了
  • JavaScript的使用你知道几种?(上)
  • node 版本过低
  • React-redux的原理以及使用
  • React-生命周期杂记
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vue 2.3、2.4 知识点小结
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 彻底搞懂浏览器Event-loop
  • 汉诺塔算法
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 两列自适应布局方案整理
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 说说动画卡顿的解决方案
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 无服务器化是企业 IT 架构的未来吗?
  • 走向全栈之MongoDB的使用
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云移动端播放器高级功能介绍
  • !$boo在php中什么意思,php前戏
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #14vue3生成表单并跳转到外部地址的方式
  • #565. 查找之大编号
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • ${ }的特别功能
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (八)c52学习之旅-中断实验
  • (二)Kafka离线安装 - Zookeeper下载及安装