SpringCloud.Eureka.源码分析.003.EurekaServer 加载的哪个配置文件?如何使用配置数据?

上一节我们主要分析了如下的代码:

public void contextInitialized(ServletContextEvent event) {
        try {
            initEurekaEnvironment();
            initEurekaServerContext();
            .......
        }
    }

initEurekaEnvironment()在上一节我们已经分析过了,该方法主要是用来初始化Eureka环境的,接下来我们重点分析一下initEurekaServerContext()

1. EurekaBootStrap.initEurekaServerContext()看名知意,即初始化EurekaServer的上下文

下面这段代码在真实的源代码中比较长,我删除了部分无关紧要的代码,只保留我们本次要分析的主要代码。删除代码用......来代替

protected void initEurekaServerContext() throws Exception {
        EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();
        ......
    }

1.1 首先看一下DefaultEurekaServerConfig是个啥

EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();

其中DefaultEurekaServerConfig看一下如何实例化的,其构造方法如下:

public DefaultEurekaServerConfig() {
        init();
    }

再看一下init()

private void init() {
        ......
        ConfigurationManager.getConfigInstance().setProperty(
                ARCHAIUS_DEPLOYMENT_ENVIRONMENT, env);
        String eurekaPropsFile = EUREKA_PROPS_FILE.get();
        try {
        ......
              ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);
        } catch (IOException e) {
        ......
        }
    }

再看一下是个什么?

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

这里其实就揭示了EurekaServer从什么地方加载配置文件的:意思如果配置了eureka.server.props那么就找这个属性对应的值去读取配置文件,如果没有配置的话,那么就使用eureka-server作为配置文件的名字去读取配置信息。接下来就是通过ConfigurationManager.loadCascadedPropertiesFromResources(eurekaPropsFile);来将所有配置信息进行加载了,加载的具体代码也比较简单这里就不多讲了,大家可以看看源码就当自己学习了。

1.2接下来看一下如何使用配置数据的

DefaultEurekaServerConfig使用配置的时候都是类似如下这样的代码:

private final DynamicIntProperty rateLimiterFullFetchAverageRate = configInstance.getIntProperty(namespace + "rateLimiter.fullFetchAverageRate", 100);

这里有两个需要注意的点:
- 1.DynamicIntProperty是什么?
- 2.configInstance 又是什么呢?

1.2.1 首先看一下DynamicIntProperty
public class DynamicIntProperty extends PropertyWrapper<Integer> {
    public DynamicIntProperty(String propName, int defaultValue) {
        super(propName, Integer.valueOf(defaultValue));
    }
    public int get() {
        return prop.getInteger(defaultValue).intValue();
    }
    public Integer getValue() {
        return get();
    }
}

简单看一下,实际上就是一个存储数据的数据类

1.2.2 接下来再看一下configInstance

DefaultEurekaConfig中,有如下代码初始化了configInstance

private static final DynamicPropertyFactory configInstance = com.netflix.config.DynamicPropertyFactory
            .getInstance();

即,configInstance是一个DynamicPropertyFactory

我们接着返回去分析如何使用配置数据的:

private final DynamicIntProperty rateLimiterFullFetchAverageRate = configInstance.getIntProperty(namespace + "rateLimiter.fullFetchAverageRate", 100);

如果configInstance中不存在rateLimiter.fullFetchAverageRate,那么就取默认值100

2.总结

  • 意思如果配置了eureka.server.props那么就找这个属性对应的值去读取配置文件,如果没有配置的话,那么就使用eureka-server作为配置文件的名字去读取配置信息
  • 配置数据封装到了一个个DynamicIntProperty
  • 读取配置采用方法的形式,即有多少参数几乎是写死到了代码中。优点:配置名称见名知意, 缺点:硬编码 这种方式的使用有待考究,如果我们项目比较成熟,即配置数据已经稳定,配置名不会频繁变动,也可以采用这种方式,但是如果我们需要经常变动,那么就不推荐这种方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值