Eureka 学习笔记(2)加载eureka-server.properties中的配置

一 两种配置文件的方式

我们点开 EurekaServerConfig 可以看到

public interface EurekaServerConfig {/*** Gets the <em>AWS Access Id</em>. This is primarily used for* <em>Elastic IP Biding</em>. The access id should be provided with* appropriate AWS permissions to bind the EIP.** @return*/String getAWSAccessId();/*** Gets the <em>AWS Secret Key</em>. This is primarily used for* <em>Elastic IP Biding</em>. The access id should be provided with* appropriate AWS permissions to bind the EIP.** @return*/String getAWSSecretKey();/*** Gets the number of times the server should try to bind to the candidate* EIP.** <p>* <em>The changes are effective at runtime.</em>* </p>** @return the number of times the server should try to bind to the*         candidate EIP.*/int getEIPBindRebindRetries();

EurekaServerConfig,这是个接口,这里面有一堆getXXX()的方法,包含了eureka server需要使用的所有的配置,都可以通过这个接口来获取

针对配置定义了一个接口,接口里通过方法暴露了大量的配置项获取的方法,我们可以通过这个接口来获取你需要的配置项。

很多时候,我们会把配置文件加载到Properties就结束了,然后获取配置的时候,使用get方法获取就行。

二 加载配置文件

 EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();

DefaultEurekaServerConfig,是EurekaServerConfig 的实现类,创建实例的时候,会执行一个init()方法,在这个方法中,就会完成eureka-server.properties文件中的配置项的加载。

private void init() {String env = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT, TEST);ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, env);String eurekaPropsFile = EUREKA_PROPS_FILE.get();try {// ConfigurationManager// .loadPropertiesFromResources(eurekaPropsFile);ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);} catch (IOException e) {logger.warn("Cannot find the properties specified : {}. This may be okay if there are other environment "+ "specific properties or the configuration is installed with a different mechanism.",eurekaPropsFile);}}

点击EUREKA_PROPS_FILE.get(); 可以看到如下

private static final DynamicStringProperty EUREKA_PROPS_FILE = DynamicPropertyFactory.getInstance().getStringProperty("eureka.server.props","eureka-server");

String eurekaPropsFile = EUREKA_PROPS_FILE.get(); 就是获取了eureka-server。

然后点击ConfigurationManager中的 loadCascadedPropertiesFromResources方法,可以看到如下内容

public static void loadCascadedPropertiesFromResources(String configName) throws IOException {Properties props = loadCascadedProperties(configName);if (instance instanceof AggregatedConfiguration) {ConcurrentMapConfiguration config = new ConcurrentMapConfiguration();config.loadProperties(props);((AggregatedConfiguration) instance).addConfiguration(config, configName);} else {ConfigurationUtils.loadProperties(props, instance);}}

紧接着点击loadCascadedProperties可以看到,defaultConfigFileName 的值就是eureka-server.properties.

private static Properties loadCascadedProperties(String configName) throws IOException {String defaultConfigFileName = configName + ".properties";if (instance == null) {instance = getConfigInstance();}ClassLoader loader = Thread.currentThread().getContextClassLoader();URL url = loader.getResource(defaultConfigFileName);if (url == null) {throw new IOException("Cannot locate " + defaultConfigFileName + " as a classpath resource.");}Properties props = getPropertiesFromFile(url);String environment = getDeploymentContext().getDeploymentEnvironment();if (environment != null && environment.length() > 0) {String envConfigFileName = configName + "-" + environment + ".properties";url = loader.getResource(envConfigFileName);if (url != null) {Properties envProps = getPropertiesFromFile(url);if (envProps != null) {props.putAll(envProps);}}}return props;}

上面就是eureka-sesrver.properties中的配置,加载到了Properties对象中去;然后会加载eureka-server-环境.properties中的配置,加载到另外一个Properties中,覆盖之前那个老的Properties中的属性。

public static void loadCascadedPropertiesFromResources(String configName) throws IOException {Properties props = loadCascadedProperties(configName);if (instance instanceof AggregatedConfiguration) {ConcurrentMapConfiguration config = new ConcurrentMapConfiguration();config.loadProperties(props);((AggregatedConfiguration) instance).addConfiguration(config, configName);} else {ConfigurationUtils.loadProperties(props, instance);}}

将加载出来的Properties中的配置项都放到ConfigurationManager中去,由这个ConfigurationManager来管理

三 各种方法的实现

比如下面这个获取EIPBindingRetryIntervalMs的例子,就是

DefaultEurekaServerConfig调用getEIPBindingRetryIntervalMs()方法
  @Overridepublic int getEIPBindingRetryIntervalMs() {return configInstance.getIntProperty(namespace + "eipBindRebindRetryIntervalMs", (5 * 60 * 1000)).get();}

四 总结

DefaultEurekaServerConfig.init()方法中,会将eureka-server.properties文件中的配置加载出来,都放到ConfdigurationManager中去,然后在DefaultEurekaServerConfig的各种获取配置项的方法中,配置项的名字是在各个方法中硬编码的,是从一个DynamicPropertyFactory里面去获取的,你可以认为DynamicPropertyFactory是从ConfigurationManager那儿来的,因为ConfigurationManager中都包含了加载出来的配置了,所以DynamicPropertyFactory里,也可以获取到所有的配置项

在从DynamicPropertyFactory中获取配置项的时候,如果你没配置,那么就用默认值,全部都给你弄好了各个配置项的默认值,相当于所有的配置项的默认值,在DefaultEurekaServerConfig的各个方法中,都可以看到,如果你没配置,那么就用这里的默认值就可以了

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

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

相关文章

Golang | Leetcode Golang题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; func convertToTitle(columnNumber int) string {ans : []byte{}for columnNumber > 0 {columnNumber--ans append(ans, Abyte(columnNumber%26))columnNumber / 26}for i, n : 0, len(ans); i < n/2; i {ans[i], ans[n-1-i] ans[n…

【项目管理】项目经理总体计划文档(word原件)

项目管理总体计划模板 1、项目基本信息 2、项目里程碑 3、项目干系人 4、项目团队组织架构管理 5、项目预算管理 6、项目项目任务计划管理 7、问题及风险管理 8、项目周报 9、项目相关要求 获取方式&#xff1a;本文末个人名片直接获取&#xff0c;或者进主页。 1、项目基本信…

Java 面试题:Java 的 Vector、ArrayList、LinkedList 有何区别?

在 Java 集合框架中&#xff0c;List 接口是一个非常重要的接口&#xff0c;它定义了有序集合的行为。Vector、ArrayList 和 LinkedList 是三种常见的 List 实现&#xff0c;每种实现都有其独特的特点和适用场景。了解它们之间的区别不仅有助于我们在开发中选择最合适的数据结构…

java第二十六课 —— java动态绑定机制 | 多态的应用(一)

java 的动态绑定机制 看一个例子&#xff1a; DynamicBinding.java&#xff1a; package com.hspedu.poly_.dynamic_;public class DynamicBinding {public static void main(String[] args) {// a 的编译类型是 A, 运行类型是 BA a new B();//向上转型System.out.println(…

深入理解Qt状态机的应用(二)

前文《深入理解Qt状态机的应用&#xff08;一&#xff09;》介绍了状态机的理论知识以及简单的状态机示例。在实际应用场景中&#xff0c;状态机往往会比较复杂&#xff1b;本文将详细介绍分组状态、历史状态、并行状态以及其他技术。 通过分组状态共享转换 还是以交通信号灯…

如何合理使用位运算

目录 标志位 寄存器位段操作 位运算的其他应用 标志位 我们经常都会使用到标志位的操作&#xff0c;来标记是否去实现某个功能。比如冒泡排序中当排序没有完成&#xff0c;始终将一个标志位置位&#xff08;flag 1&#xff09;&#xff0c;每次循环开始又会重新清除标志位&a…

基于若依的ruoyi-nbcio流程管理系统增加所有任务功能(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

如何理解光学中的群速度和相速度。

我不太明白为什么书上要区分相速度和群速度&#xff0c;不管这个&#xff0c;我想看看这两个速度在真实周期函数上的影响是如何的。 首先计算&#xff0c;直接计算三角函数我不会&#xff0c;利用复数做&#xff0c;可以取的实部。其中&#xff0c;。。 这个公式说明了什么呢…

React@16.x(34)动画(中)

目录 3&#xff0c;SwitchTransition3.1&#xff0c;原理3.1.2&#xff0c;key3.1.2&#xff0c;mode 3.2&#xff0c;举例3.3&#xff0c;结合 animate.css 4&#xff0c;TransitionGroup4.1&#xff0c;其他属性4.1.2&#xff0c;appear4.1.2&#xff0c;component4.1.3&…

Qt Quick 教程(一)

文章目录 1.Qt Quick2.QML3.Day01 案例main.qml退出按钮&#xff0c;基于上面代码添加 4.使用Qt Design StudioQt Design Studio简介Qt Design Studio工具使用版本信息 1.Qt Quick Qt Quick 是一种现代的用户界面技术&#xff0c;将声明性用户界面设计和命令性编程逻辑分开。 …

mybatis中yml配置log-impl是什么?有什么用?

在 MyBatis 中&#xff0c;log-impl 配置用于定义 MyBatis 在执行 SQL 时使用的日志实现。配置 org.apache.ibatis.logging.stdout.StdOutImpl 表示 MyBatis 会将所有的 SQL 日志直接打印到标准输出&#xff08;即控制台&#xff09;。这在开发过程中非常有用&#xff0c;因为它…

前后端完整案例-简单模仿点点开黑抽奖

数据库 后台 源码&#xff1a;https://gitee.com/qfp17393120407/game 前台 源码&#xff1a; https://gitee.com/qfp17393120407/game-weeb vue项目打包 注意&#xff1a;打包时将IP改为自己公网IP npm run build公网页面 地址&#xff1a;点点模拟抽奖 进入页面抽奖…

K8S-使用SVC域名解决ip不固定导致consul服务注册脏数据异常问题

1 概述 各个模块注册nacos时&#xff0c;采用svc域名的方式&#xff0c;各模块间feign调用时使用的svc 域名来访问&#xff0c;这样就可以和ip解耦。 否则如果使用不固定IP&#xff0c;则可能在重启的时候&#xff0c;导致consul里面有一堆脏节点数据&#xff0c;影响服务调用…

不同表格式下的小文件治理方式(开源RC file/ORC/Text非事务表、事务表、Holodesk表格式..)

友情链接&#xff1a; 小文件治理系列之为什么会出现小文件问题&#xff0c;小文件过多问题的危害以及不同阶段下的小文件治理最佳解决手段 小文件过多的解决方法&#xff08;不同阶段下的治理手段&#xff0c;SQL端、存储端以及计算端&#xff09; 概览 在前两篇博文中&am…

自学鸿蒙HarmonyOS的ArkTS语言<一>基本语法

一、一个ArkTs的目录结构 二、一个页面的结构 A、装饰器 Entry 装饰器 : 标记组件为入口组件&#xff0c;一个页面由多个自定义组件组成&#xff0c;但是只能有一个组件被标记 Component : 自定义组件, 仅能装饰struct关键字声明的数据结构 State&#xff1a;组件中的状态变量…

【JVM】触发 Full GC 的条件

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;是管理内存的关键机制。Full GC&#xff08;也称为Major GC或老年代GC&#xff09;是一种较为耗时的垃圾收集过程&#xff0c;会对整个堆&#xf…

SpirngMVC面试题

说一下 SpringMVC 支持的转发和重定向的写法(必会) 1&#xff09;转发&#xff1a; forward 方式:在返回值前面加"forward:",比如"”"forward:user.do?namemethod4" 2) 重定向: redirect 方式&#xff1a;在返回值前面加 redirect:, 比如"redi…

服务器雪崩的应对策略之----熔断机制

熔断机制&#xff08;Circuit Breaker&#xff09;是一种保护系统稳定性的重要手段。它的主要目的是防止系统在依赖的服务出现问题时&#xff0c;继续发送请求&#xff0c;从而保护系统免受进一步的影响。熔断机制通过监控请求的成功和失败率&#xff0c;在检测到故障率超过预设…

python全栈开发《10.数据类型之初识列表类型》

1.什么是列表 其实在生活中&#xff0c;有很多种排队的现象。比如看电影要排队买票&#xff0c;上地铁的时候要排队安检。在生活中&#xff0c;排队的是人&#xff0c;为了统一做一件事&#xff0c;而排成队伍&#xff0c;逐个的去等待执行这个任务&#xff0c;每个人都是执行这…

平衡查找树(数据结构篇)

数据结构之平衡查找树 平衡查找树(AVL树) 概念&#xff1a; 为了防止因为插入删除而导致的树结构不平衡(通常我们删除节点总是对右子树的最小值节点替代操作&#xff0c;而不是交替的利用左子树的最大值节点替代&#xff0c;这就将导致左子树的平均深度大于右子树平均深度&a…