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初始化环境

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无声短视频:成都柏煜文化传媒有限公司

无声短视频:视觉艺术的独特魅力 在数字化时代的浪潮中,短视频以其简短、直观、易于传播的特点迅速崛起,成为当下最热门的媒体形式之一。而在众多的短视频类型中,无声短视频以其独特的视觉表达方式,逐渐吸引了越来越多…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景: 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时,在配置文件均与eclipse一致的情况下出现了如下报错: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

leetcode118 杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] public List…

信创服务器操作系统的适配迁移分析

浅谈信创服务器操作系统的适配迁移 01 服务器操作系统迁移适配流程复杂 随着CentOS停服临近和红帽RHEL源码权限受限,服务器操作系统安全漏洞风险加剧。国内众多企业面临CentOS、REHL等系统升级替换的挑战。同时,出于安全、功能升级和合规需求&#xff0…

33、循环语句--函数---递归+阶乘

一、函数 1.1、shell的函数 1.1.1、函数的定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。 for i in {}do命令序列doneif []then 命令序列else命令序列fi #可以作为一个命令序列作用:方便重复使用,函数库&…

CubeMx打不开

问题点:打开CubeMx一直这个界面,然后就消失了。 问题所在:java版本过高。 博主的版本是合适的,如果你的版本是17什么的肯定是不合适的。 解决方法:卸载重装 卸载工具站内下载,免安装:&#xf…

极速解析,精准合规 — Ada,现代C++的URL解析器

Ada:用Ada,让URL解析变得轻而易举。- 精选真开源,释放新价值。 概览 Ada是一个用现代C编写的快速且符合WHATWG标准的URL解析库。它通过了WHATWG网站提供的全部规范测试,并在包括Windows、Linux、macOS在内的多个平台上表现卓越。…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽,大家好,我是木头左! 引言 编写一篇高质量的博客文章并非易事,尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言,为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

反射的原理和操作

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 在Java中,反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI(powered by LLM)和Headless BI(powered by 语义层)打造新一代的BI平台。这种融合确…

C++ 66 之 类模版

#include <iostream> #include <string> using namespace std;// 习惯性 < >中 类模板用class 普通的函数模板就用typename // template<class NAMETYPE, class AGETYPE> template<class NAMETYPE, class AGETYPE int> // 可以设置默认的类型值…

【数据结构C++】表达式求值(多位数)课程设计

&#x1f4da;博客主页&#xff1a;Zhui_Yi_ &#x1f50d;&#xff1a;上期回顾&#xff1a;图 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f387;追当今朝天骄&#xff0c;忆顾往昔豪杰。 …

【机器学习】第7章 集成学习(小重点,混之前章节出题但小题)

一、概念 1.集成学习&#xff0c;顾名思义&#xff0c;不是一个玩意&#xff0c;而是一堆玩意混合到一块。 &#xff08;1&#xff09;基本思想是先 生成一定数量基学习器&#xff0c;再采用集成策略 将这堆基学习器的预测结果组合起来&#xff0c;从而形成最终结论。 &#x…

pdf怎么压缩到2m以内或5m以内的方法

PDF作为一种广泛使用的文档格式&#xff0c;已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候PDF文件内存会比较大&#xff0c;给我们的存储和传输带来了很大的不便。因此&#xff0c;学会压缩 PDF 文件是非常必要的。 打开"轻云处理pdf官网"&…

js语法---理解防抖原理和实现方法

什么是防抖&#xff08;节流&#xff09; 在实际的网页交互中&#xff0c;如果一个事件高频率的触发&#xff0c;这会占用很多内存资源&#xff0c;但是实际上又并不需要监听触发如此多次这个事件&#xff08;比如说&#xff0c;在抢有限数量的优惠券时&#xff0c;用户往往会提…

Scott Brinker:API对今天的Martech用户来说「非常重要」 ,但它们对即将到来的人工智能代理浪潮至关重要

API在Martech中非常重要 猜一猜空格应该填什么&#xff1a; _______之于AI代理就像数据之于AI模型 正如你可能从我的标题猜到的那样&#xff0c;答案是API。让我们讨论一下为什么…… 数据是人工智能模型的差异化 在过去的一年半里&#xff0c;人工智能疯狂的超级炒作周期…

Repetition Improves Language Model Embeddings论文阅读笔记

文章提出了一种提高decoder-only LLM的embedding能力的方法&#xff0c;叫echo embeddingslast-token pooling&#xff08;即直接选最后一个token作为句子的embedding&#xff09;和直接mean pooling都不如文章提出的echo embedding&#xff0c;做法是把句子重复两次&#xff0…

OpenGL Super Bible 7th - Drawing Our First Triangle(绘制第一个三角形)

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

【论文阅读】-- Attribute-Aware RBFs:使用 RT Core 范围查询交互式可视化时间序列颗粒体积

Attribute-Aware RBFs: Interactive Visualization of Time Series Particle Volumes Using RT Core Range Queries 1 引言2 相关工作2.1 粒子体渲染2.2 RT核心方法 3 渲染彩色时间序列粒子体积3.1 场重构3.1.1 密度场 Φ3.1.2 属性字段 θ3.1.3 优化场重建 3.2 树结构构建与调…

算法题day45(补5.31日卡:动态规划05)

一、完全背包理论基础&#xff1a; 完全背包和01背包问题唯一不通过的地方就是&#xff0c;每种物品有无限件。 二、刷题&#xff1a; 1.卡码网 52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; (kamacoder.com)(medium&#xff09; 解决: nv input().strip().sp…