上一節我們主要分析瞭如下的代碼:
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
- 讀取配置採用方法的形式,即有多少參數幾乎是寫死到了代碼中。
優點:配置名稱見名知意, 缺點:硬編碼
這種方式的使用有待考究,如果我們項目比較成熟,即配置數據已經穩定,配置名不會頻繁變動,也可以採用這種方式,但是如果我們需要經常變動,那麼就不推薦這種方式