上一节我们主要分析了如下的代码:
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
- 读取配置采用方法的形式,即有多少参数几乎是写死到了代码中。
优点:配置名称见名知意, 缺点:硬编码
这种方式的使用有待考究,如果我们项目比较成熟,即配置数据已经稳定,配置名不会频繁变动,也可以采用这种方式,但是如果我们需要经常变动,那么就不推荐这种方式