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


    一 两种配置文件的方式

    我们点开 EurekaServerConfig 可以看到

    1. public interface EurekaServerConfig {
    2. /**
    3. * Gets the AWS Access Id. This is primarily used for
    4. * Elastic IP Biding. The access id should be provided with
    5. * appropriate AWS permissions to bind the EIP.
    6. *
    7. * @return
    8. */
    9. String getAWSAccessId();
    10. /**
    11. * Gets the AWS Secret Key. This is primarily used for
    12. * Elastic IP Biding. The access id should be provided with
    13. * appropriate AWS permissions to bind the EIP.
    14. *
    15. * @return
    16. */
    17. String getAWSSecretKey();
    18. /**
    19. * Gets the number of times the server should try to bind to the candidate
    20. * EIP.
    21. *
    22. *

    23. * The changes are effective at runtime.
    24. *

    25. *
    26. * @return the number of times the server should try to bind to the
    27. * candidate EIP.
    28. */
    29. int getEIPBindRebindRetries();

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

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

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

    二 加载配置文件

     EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();

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

    1. private void init() {
    2. String env = ConfigurationManager.getConfigInstance().getString(
    3. EUREKA_ENVIRONMENT, TEST);
    4. ConfigurationManager.getConfigInstance().setProperty(
    5. ARCHAIUS_DEPLOYMENT_ENVIRONMENT, env);
    6. String eurekaPropsFile = EUREKA_PROPS_FILE.get();
    7. try {
    8. // ConfigurationManager
    9. // .loadPropertiesFromResources(eurekaPropsFile);
    10. ConfigurationManager
    11. .loadCascadedPropertiesFromResources(eurekaPropsFile);
    12. } catch (IOException e) {
    13. logger.warn(
    14. "Cannot find the properties specified : {}. This may be okay if there are other environment "
    15. + "specific properties or the configuration is installed with a different mechanism.",
    16. eurekaPropsFile);
    17. }
    18. }

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

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

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

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

    1. public static void loadCascadedPropertiesFromResources(String configName) throws IOException {
    2. Properties props = loadCascadedProperties(configName);
    3. if (instance instanceof AggregatedConfiguration) {
    4. ConcurrentMapConfiguration config = new ConcurrentMapConfiguration();
    5. config.loadProperties(props);
    6. ((AggregatedConfiguration) instance).addConfiguration(config, configName);
    7. } else {
    8. ConfigurationUtils.loadProperties(props, instance);
    9. }
    10. }

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

    1. private static Properties loadCascadedProperties(String configName) throws IOException {
    2. String defaultConfigFileName = configName + ".properties";
    3. if (instance == null) {
    4. instance = getConfigInstance();
    5. }
    6. ClassLoader loader = Thread.currentThread().getContextClassLoader();
    7. URL url = loader.getResource(defaultConfigFileName);
    8. if (url == null) {
    9. throw new IOException("Cannot locate " + defaultConfigFileName + " as a classpath resource.");
    10. }
    11. Properties props = getPropertiesFromFile(url);
    12. String environment = getDeploymentContext().getDeploymentEnvironment();
    13. if (environment != null && environment.length() > 0) {
    14. String envConfigFileName = configName + "-" + environment + ".properties";
    15. url = loader.getResource(envConfigFileName);
    16. if (url != null) {
    17. Properties envProps = getPropertiesFromFile(url);
    18. if (envProps != null) {
    19. props.putAll(envProps);
    20. }
    21. }
    22. }
    23. return props;
    24. }

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

    1. public static void loadCascadedPropertiesFromResources(String configName) throws IOException {
    2. Properties props = loadCascadedProperties(configName);
    3. if (instance instanceof AggregatedConfiguration) {
    4. ConcurrentMapConfiguration config = new ConcurrentMapConfiguration();
    5. config.loadProperties(props);
    6. ((AggregatedConfiguration) instance).addConfiguration(config, configName);
    7. } else {
    8. ConfigurationUtils.loadProperties(props, instance);
    9. }
    10. }

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

    三 各种方法的实现

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

    DefaultEurekaServerConfig调用getEIPBindingRetryIntervalMs()方法
    1. @Override
    2. public int getEIPBindingRetryIntervalMs() {
    3. return configInstance.getIntProperty(
    4. namespace + "eipBindRebindRetryIntervalMs", (5 * 60 * 1000)).get();
    5. }

    四 总结

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

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

  • 相关阅读:
    Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
    Python 面试高频问题:cls到底是什么
    云服务器防 DDoS 攻击的几种方法策略分享
    深度分析React源码中的合成事件
    对抗生成网络GAN系列——WGAN原理及实战演练
    (Spring笔记)SpringBoot+Mybatis+Sqlite3查询表数据
    ICC2: place阶段trial clock
    含文档+PPT+源码等]精品微信小程序ssm图书借阅到期提醒功能实现[包运行成功]小程序毕业设计Java项目源码
    集美大学 - 2840 - 实验10 - 函数题
    Android framework开发者带你参加21天学习挑战赛活动
  • 原文地址:https://blog.csdn.net/swanzhu/article/details/139786435