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初始化环境
相关文章:
Eureka 学习笔记(1)
一 、contextInitialized() eureka-core里面,监听器的执行初始化的方法,是contextInitialized()方法,这个方法就是整个eureka-server启动初始化的一个入口。 Overridepublic void contextInitialized(ServletContextEvent event) {try {init…...
视觉新纪元:解码LED显示屏的视角、可视角、最佳视角的最终奥秘
在璀璨夺目的LED显示屏世界里,每一个绚烂画面的背后,都离不开三个关键概念:视角、可视角与最佳视角。这些术语不仅是衡量显示效果的重要标尺,也是连接观众与精彩内容的桥梁。让我们一起走进这场视觉盛宴,探索那些让LED…...
Benchmarking Panoptic Scene Graph Generation (PSG), ECCV‘22 场景图生成,利用PSG数据集
2080-ti显卡复现 源代码地址 Jingkang50/OpenPSG: Benchmarking Panoptic Scene Graph Generation (PSG), ECCV22 (github.com) 安装 pytorch 1.7版本 cuda10.1 按照readme的做法安装 我安装的过程如下图所示,这个截图是到了pip install openmim这一步 下一步 下一步 这一步…...
Linux 文件权限
优质博文:IT-BLOG-CN 一、使用者与群组的概念 【1】在Linux里面,任何一个文件都具有[User,Group及Other]三种身份的个别权限:不过需要注意的是root用户,具有所有权限。 ✔ User(文件拥有者):只有文件拥有者…...
IOS Swift 从入门到精通:算术运算,运算符重载,符合赋值运算,比较运算,条件,结合条件,三元运算,Swift语句,范围运算
目录 算术运算符 运算符重载 复合赋值运算符 比较运算符 条件 结合条件 三元运算符 Switch 语句 范围运算符 总结 算术运算符 现在您已经了解了 Swift 中的所有基本类型,我们可以开始使用运算符将它们组合在一起。运算符是那些像和 这样的小数学符号-&…...
Flutter开发环境搭建和调试
[你的Flutter文件夹路径]\flutter\bin 这样我们的Flutter SDK的环境变量就配置完毕了。接下来在命令提示符窗口中输入命令: flutter doctor 它可以帮助我们检查Flutter环境变量是否设置成功,Android SDK是否下载以及配置好环境变量等等。如果有相关的…...
【IC验证】UVM实验lab03
1. TLM端口的创建、例化与使用 创建: uvm_get_blocking_port #(fmt_trans) mon_bp_port; 例化: function new(string name "mcdf_refmod", uvm_component parent);super.new(name, parent);fmt_trans new("fmt_trans", this);…...
document.write()方法总结
document.write()方法总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!document.write()方法是JavaScript中用于向HTML文档写入内容的方法之一。它允许我们在…...
C#循环语句总结
前言 正所谓磨刀不误砍柴工,C#上位机软件开发能力的提升离不开对C#语法的精通,本文接着讲解C#语法知识中的循环语句,在C#程序开发中我们经常会用到各种循环语句,常见的有for循环、while循环,本文就是对C#中用到的各种…...
Spring-bean
Spring 网站:spring.io 两个方面: 简化开发: IoCAOP 框架整合: MyBatis SpringFrameWork系统架构(上层依赖下层) 解决问题(代码耦合度高——模块与模块之间的依赖程度) 目标&am…...
Linux常用命令(14)—查看文件内容(有相关截图)
写在前面: 最近在学习Linux命令,记录一下学习Linux常用命令的过程,方便以后复习。仅供参考,若有不当的地方,恳请指正。如果对你有帮助,欢迎点赞,关注,收藏,评论…...
【html】用html+css实现银行的账户信息表格
我们先来看一看某银行的账户信息表格 我们自己也可以实现类似的效果 效果图: 大家可以看到,其实效果差不多 接下来看看我们实现的代码 源码: <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"&…...
两种单例模式(保证线程安全)
开始前,球球各位读者给个三连吧,有错误感谢指出,谢谢 单例模式也叫单个实例,也就是这个类只有且只能有一个实例对象,这样一个类就叫做“单例”;单例模式有很多种,这里只介绍“饿汉模式”和“懒…...
开发 Golang 项目的 Docker 化案例
开发 Golang 项目的 Docker 化案例 在这个案例中,我们将展示如何使用 Docker 容器化一个简单的 Golang Web 应用。我们将创建一个基于 Go 的 Hello World 应用,并使用 Docker 和 Docker Compose 管理容器化环境。 1. 创建 Golang Web 应用 首先&#…...
PHP面试宝典之Laravel篇
Laravel简介 Laravel是一种优雅的PHP Web应用程序框架,它具有简洁、优雅的语法,并提供了强大的工具用于构建大型、健壮的应用程序。Laravel采用了现代PHP开发的最佳实践,因此深受开发者欢迎。 Laravel面试常见问题 1. 什么是Laravel中间件…...
自动驾驶仿真:Carsim转向传动比设置
文章目录 一、转向传动比概念二、设置转向传动比1、C factor概念2、Steer Kinematics概念3、传动比计算公式 三、转向传动比验证 一、转向传动比概念 转向传动比(Steering Ratio)表示方向盘转动角度与车轮转动角度之间的关系。公式如下: 转向…...
PyTorch nn.CrossEntropyLoss() 交叉熵损失函数详解和要点提醒
文章目录 前置知识nn.CrossEntropyLoss() 交叉熵损失参数数学公式带权重的公式(weight)标签平滑(label_smoothing) 要点 附录参考链接 前置知识 深度学习:关于损失函数的一些前置知识(PyTorch Loss&#x…...
DW学习笔记|数学建模task2
本章主要涉及到的知识点有: 微分方程的解法如何用 Python 解微分方程偏微分方程及其求解方法微分方程的基本案例差分方程的求解数值计算方法元胞自动机 2.1 微分方程的理论基础 微分方程是什么?如果你参加过高考,可能在高三备考中遇到过这…...
【大数据 复习】第9章 数据仓库分析工具Hive
一、概念 1.概述 (1)Hive是一个构建于Hadoop顶层的数据仓库工具。 (2)某种程度上可以看作是用户编程接口,本身不存储和处理数据。 (3)依赖分布式文件系统HDFS存储数据。 (4…...
ionic7 从安装 到 项目启动最后打包成 apk
报错处理 在打包的时候遇到过几个问题,这里记录下来两个 Visual Studio Code运行ionic build出错显示ionic : 无法加载文件 ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在 说明 由于之前使用的是 ionic 3,当时打包的…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
