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
  • 讀取配置採用方法的形式,即有多少參數幾乎是寫死到了代碼中。優點:配置名稱見名知意, 缺點:硬編碼 這種方式的使用有待考究,如果我們項目比較成熟,即配置數據已經穩定,配置名不會頻繁變動,也可以採用這種方式,但是如果我們需要經常變動,那麼就不推薦這種方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章