org.apache.dubbo.config.context.ConfigManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dubbo Show documentation
Show all versions of dubbo Show documentation
The all in one project of dubbo
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dubbo.config.context;
import org.apache.dubbo.common.context.ApplicationExt;
import org.apache.dubbo.common.extension.DisableInject;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.AbstractConfig;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ConfigCenterConfig;
import org.apache.dubbo.config.ConfigKeys;
import org.apache.dubbo.config.MetadataReportConfig;
import org.apache.dubbo.config.MetricsConfig;
import org.apache.dubbo.config.MonitorConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.SslConfig;
import org.apache.dubbo.rpc.model.ApplicationModel;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static java.util.Optional.ofNullable;
import static org.apache.dubbo.config.AbstractConfig.getTagName;
/**
* A lock-free config manager (through ConcurrentHashMap), for fast read operation.
* The Write operation lock with sub configs map of config type, for safely check and add new config.
*/
public class ConfigManager extends AbstractConfigManager implements ApplicationExt {
private static final Logger logger = LoggerFactory.getLogger(ConfigManager.class);
public static final String NAME = "config";
public static final String BEAN_NAME = "dubboConfigManager";
public static final String DUBBO_CONFIG_MODE = ConfigKeys.DUBBO_CONFIG_MODE;
public ConfigManager(ApplicationModel applicationModel) {
super(applicationModel, Arrays.asList(ApplicationConfig.class, MonitorConfig.class,
MetricsConfig.class, SslConfig.class, ProtocolConfig.class, RegistryConfig.class, ConfigCenterConfig.class,
MetadataReportConfig.class));
}
// ApplicationConfig correlative methods
/**
* Set application config
*
* @param application
* @return current application config instance
*/
@DisableInject
public void setApplication(ApplicationConfig application) {
addConfig(application);
}
public Optional getApplication() {
return ofNullable(getSingleConfig(getTagName(ApplicationConfig.class)));
}
public ApplicationConfig getApplicationOrElseThrow() {
return getApplication().orElseThrow(() -> new IllegalStateException("There's no ApplicationConfig specified."));
}
// MonitorConfig correlative methods
@DisableInject
public void setMonitor(MonitorConfig monitor) {
addConfig(monitor);
}
public Optional getMonitor() {
return ofNullable(getSingleConfig(getTagName(MonitorConfig.class)));
}
@DisableInject
public void setMetrics(MetricsConfig metrics) {
addConfig(metrics);
}
public Optional getMetrics() {
return ofNullable(getSingleConfig(getTagName(MetricsConfig.class)));
}
@DisableInject
public void setSsl(SslConfig sslConfig) {
addConfig(sslConfig);
}
public Optional getSsl() {
return ofNullable(getSingleConfig(getTagName(SslConfig.class)));
}
// ConfigCenterConfig correlative methods
public void addConfigCenter(ConfigCenterConfig configCenter) {
addConfig(configCenter);
}
public void addConfigCenters(Iterable configCenters) {
configCenters.forEach(this::addConfigCenter);
}
public Optional> getDefaultConfigCenter() {
Collection defaults = getDefaultConfigs(getConfigsMap(getTagName(ConfigCenterConfig.class)));
if (CollectionUtils.isEmpty(defaults)) {
defaults = getConfigCenters();
}
return Optional.ofNullable(defaults);
}
public Optional getConfigCenter(String id) {
return getConfig(ConfigCenterConfig.class, id);
}
public Collection getConfigCenters() {
return getConfigs(getTagName(ConfigCenterConfig.class));
}
// MetadataReportConfig correlative methods
public void addMetadataReport(MetadataReportConfig metadataReportConfig) {
addConfig(metadataReportConfig);
}
public void addMetadataReports(Iterable metadataReportConfigs) {
metadataReportConfigs.forEach(this::addMetadataReport);
}
public Collection getMetadataConfigs() {
return getConfigs(getTagName(MetadataReportConfig.class));
}
public Collection getDefaultMetadataConfigs() {
Collection defaults = getDefaultConfigs(getConfigsMap(getTagName(MetadataReportConfig.class)));
if (CollectionUtils.isEmpty(defaults)) {
return getMetadataConfigs();
}
return defaults;
}
// ProtocolConfig correlative methods
public void addProtocol(ProtocolConfig protocolConfig) {
addConfig(protocolConfig);
}
public void addProtocols(Iterable protocolConfigs) {
if (protocolConfigs != null) {
protocolConfigs.forEach(this::addProtocol);
}
}
public Optional getProtocol(String idOrName) {
return getConfig(ProtocolConfig.class, idOrName);
}
public List getDefaultProtocols() {
return getDefaultConfigs(ProtocolConfig.class);
}
@Override
public List getDefaultConfigs(Class cls) {
return getDefaultConfigs(getConfigsMap(getTagName(cls)));
}
public Collection getProtocols() {
return getConfigs(getTagName(ProtocolConfig.class));
}
// RegistryConfig correlative methods
public void addRegistry(RegistryConfig registryConfig) {
addConfig(registryConfig);
}
public void addRegistries(Iterable registryConfigs) {
if (registryConfigs != null) {
registryConfigs.forEach(this::addRegistry);
}
}
public Optional getRegistry(String id) {
return getConfig(RegistryConfig.class, id);
}
public List getDefaultRegistries() {
return getDefaultConfigs(getConfigsMap(getTagName(RegistryConfig.class)));
}
public Collection getRegistries() {
return getConfigs(getTagName(RegistryConfig.class));
}
@Override
public void refreshAll() {
// refresh all configs here
getApplication().ifPresent(ApplicationConfig::refresh);
getMonitor().ifPresent(MonitorConfig::refresh);
getMetrics().ifPresent(MetricsConfig::refresh);
getSsl().ifPresent(SslConfig::refresh);
getProtocols().forEach(ProtocolConfig::refresh);
getRegistries().forEach(RegistryConfig::refresh);
getConfigCenters().forEach(ConfigCenterConfig::refresh);
getMetadataConfigs().forEach(MetadataReportConfig::refresh);
}
@Override
public void loadConfigs() {
// application config has load before starting config center
// load dubbo.applications.xxx
loadConfigsOfTypeFromProps(ApplicationConfig.class);
// load dubbo.monitors.xxx
loadConfigsOfTypeFromProps(MonitorConfig.class);
// load dubbo.metrics.xxx
loadConfigsOfTypeFromProps(MetricsConfig.class);
// load multiple config types:
// load dubbo.protocols.xxx
loadConfigsOfTypeFromProps(ProtocolConfig.class);
// load dubbo.registries.xxx
loadConfigsOfTypeFromProps(RegistryConfig.class);
// load dubbo.metadata-report.xxx
loadConfigsOfTypeFromProps(MetadataReportConfig.class);
// config centers has bean loaded before starting config center
//loadConfigsOfTypeFromProps(ConfigCenterConfig.class);
refreshAll();
checkConfigs();
// set model name
if (StringUtils.isBlank(applicationModel.getModelName())) {
applicationModel.setModelName(applicationModel.getApplicationName());
}
}
private void checkConfigs() {
// check config types (ignore metadata-center)
List> multipleConfigTypes = Arrays.asList(
ApplicationConfig.class,
ProtocolConfig.class,
RegistryConfig.class,
MonitorConfig.class,
MetricsConfig.class,
SslConfig.class);
for (Class configType : multipleConfigTypes) {
checkDefaultAndValidateConfigs(configType);
}
// check port conflicts
Map protocolPortMap = new LinkedHashMap<>();
for (ProtocolConfig protocol : this.getProtocols()) {
Integer port = protocol.getPort();
if (port == null || port == -1) {
continue;
}
ProtocolConfig prevProtocol = protocolPortMap.get(port);
if (prevProtocol != null) {
throw new IllegalStateException("Duplicated port used by protocol configs, port: " + port +
", configs: " + Arrays.asList(prevProtocol, protocol));
}
protocolPortMap.put(port, protocol);
}
// Log the current configurations.
logger.info("The current configurations or effective configurations are as follows:");
for (Class configType : multipleConfigTypes) {
getConfigs(configType).stream().forEach((config) -> {
logger.info(config.toString());
});
}
}
public ConfigMode getConfigMode() {
return configMode;
}
}