重点
通过接口而不是常量的方式去获取各种配置
加载eureka-server.properties的过程:
(1)创建了一个DefaultEurekaServerConfig对象
(2)创建DefaultEurekaServerConfig对象的时候,在里面会有一个init方法
(3)先是将eureka-server.properties中的配置加载到了一个Properties对象中,然后将Properties对象中的配置放到ConfigurationManager中去,此时ConfigurationManager中去就有了所有的配置了
(4)然后DefaultEurekaServerConfig提供的获取配置项的各个方法,都是通过硬编码的配置项名称,从DynamicPropertyFactory中获取配置项的值,DynamicPropertyFactory是从ConfigurationManager那儿来的,所以也包含了所有配置项的值
(5)在获取配置项的时候,如果没有配置,那么就会有默认的值,全部属性都是有默认值的
执行方法
/**
* init hook for server context. Override for custom logic.
*/
protected void initEurekaServerContext() throws Exception {
EurekaServerConfig eurekaServerConfig = new DefaultEurekaServerConfig();
//第一步 加载eureka-server.properties的配置
// For backward compatibility
JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
logger.info("Initializing the eureka client...");
logger.info(eurekaServerConfig.getJsonCodecName());
ServerCodecs serverCodecs = new DefaultServerCodecs(eurekaServerConfig);
//第二部 初始化ApplicationInfoManager
ApplicationInfoManager applicationInfoManager = null;
//第三部 初始化eureka-server内部的一个eureka-client(用来和eureka-server节点进行注册和通信)
if (eurekaClient == null) {
EurekaInstanceConfig instanceConfig = isCloud(ConfigurationManager.getDeploymentContext())
? new CloudInstanceConfig()
: new MyDataCenterInstanceConfig();
applicationInfoManager = new ApplicationInfoManager(
instanceConfig, new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());
EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();
eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);
} else {
applicationInfoManager = eurekaClient.getApplicationInfoManager();
}
//第三部 处理注册的事情
PeerAwareInstanceRegistry registry;
if (isAws(applicationInfoManager.getInfo())) {
registry = new AwsInstanceRegistry(
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
eurekaClient
);
awsBinder = new AwsBinderDelegate(eurekaServerConfig, eurekaClient.getEurekaClientConfig(), registry, applicationInfoManager);
awsBinder.start();
} else {
registry = new PeerAwareInstanceRegistryImpl(
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
eurekaClient
);
}
//第四步 处理peer的
PeerEurekaNodes peerEurekaNodes = getPeerEurekaNodes(
registry,
eurekaServerConfig,
eurekaClient.getEurekaClientConfig(),
serverCodecs,
applicationInfoManager
);
//第五步 完成eureka-server的上下文构建以及初始化
serverContext = new DefaultEurekaServerContext(
eurekaServerConfig,
serverCodecs,
registry,
peerEurekaNodes,
applicationInfoManager
);
EurekaServerContextHolder.initialize(serverContext);
serverContext.initialize();
logger.info("Initialized server context");
//第六步,从相邻的eureka节点拷贝注册信息
// Copy registry from neighboring eureka node
int registryCount = registry.syncUp();
registry.openForTraffic(applicationInfoManager, registryCount);
//第七步 处理善后的事情
// Register all monitoring statistics.
EurekaMonitors.registerAllStats();
}
重点方法
在init方法中获取配置文件的配置。
获取配置也都是在ConfigurationManager中loadCascadedPropertiesFromResources完成的
com.netflix.eureka.DefaultEurekaServerConfig#init
还有一个比较重要的是
DynamicPropertyFactory.getInstance().getStringProperty(“eureka.server.props”,
通过接口来获取配置
EurekaServerConfig
一般是配置个常量类,写个方法查询的时候来获取。
这样的好处是:
- 配置项常基本不怎么改动(TODO )
- 比较面向对象
值得回味的代码:
问题
- (TODO) eureka的配置都是在配置文件中配置的,那如何动态修改线上的配置,因为项目中一般都是通过数据库里的来修改。
https://www.yuque.com/attachments/yuque/0/2021/docx/205493/1618051578954-257d3b28-8c29-4567-8cfd-89b91c676c79.docx)
原文:https://www.yuque.com/docs/share/d8a6eead-fdf9-49dc-bc1e-13097ef85d99?# 《eureka server 启动–配置文件加载》