`
zhangyu84849467
  • 浏览: 15417 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springCloud 中的 archaius 的一些用法

 
阅读更多

先上一个例子代码

public static void main( String[] args ) throws IOException {

	DynamicStringProperty stringProperty = DynamicPropertyFactory.getInstance().getStringProperty( "hello", "" );

	System.out.println( stringProperty.get() );

	ConfigurationManager.getConfigInstance().setProperty( "name", "Jay" );
		
	ConfigurationManager.getConfigInstance().setProperty( "name", "Join" );

	System.out.println( ConfigurationManager.getConfigInstance().getString( "name" ) );

	ConfigurationManager.loadCascadedPropertiesFromResources( "application" );
		// eureka-client
	DynamicPropertyFactory propertyFactory = Archaius1Utils.initConfig( CommonConstants.CONFIG_FILE_NAME );
		
	System.out.println( propertyFactory.getStringProperty( "a", "" ).get() );

}

 src/main/resources 需要有 application.properties, config.properties,  eureka-client.properties 这几个properties 文件。如图:



 

 

ConfigurationManager.getConfigInstance();  默认是加载 src/main/resources 下的  config.properties 文件。

下面 看看源代码是怎么做的

 

public static AbstractConfiguration getConfigInstance() {


	if ( instance == null ) {

		synchronized ( ConfigurationManager.class ) {

			if ( instance == null ) {

				// archaius.dynamicProperty.disableDefaultConfig
				instance = getConfigInstance( Boolean.getBoolean( DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG ) );

			}

		}

	}

	return instance;

}

 单例模式 获取 AbstractConfiguration

// false
private static AbstractConfiguration getConfigInstance( boolean defaultConfigDisabled ) {

	if ( instance == null && !defaultConfigDisabled ) {

		instance = createDefaultConfigInstance();

		registerConfigBean();

	}

	return instance;

}

 直接 看 createDefaultConfigInstance 方法

private static AbstractConfiguration createDefaultConfigInstance() {
        // 组合配置
	ConcurrentCompositeConfiguration config = new ConcurrentCompositeConfiguration();

	try {

		DynamicURLConfiguration defaultURLConfig = new DynamicURLConfiguration();

		// archaius.dynamicPropertyFactory.URL_CONFIG
		config.addConfiguration( defaultURLConfig, URL_CONFIG_NAME );

	} catch ( Throwable e ) {

		logger.warn( "Failed to create default dynamic configuration", e );

	}

	// archaius.dynamicProperty.disableSystemConfig
	if ( !Boolean.getBoolean( DISABLE_DEFAULT_SYS_CONFIG ) ) {

		SystemConfiguration sysConfig = new SystemConfiguration();

		config.addConfiguration( sysConfig, SYS_CONFIG_NAME );

	}

	// archaius.dynamicProperty.disableEnvironmentConfig
	if ( !Boolean.getBoolean( DISABLE_DEFAULT_ENV_CONFIG ) ) {

		EnvironmentConfiguration envConfig = new EnvironmentConfiguration();

		config.addConfiguration( envConfig, ENV_CONFIG_NAME );

	}

	ConcurrentCompositeConfiguration appOverrideConfig = new ConcurrentCompositeConfiguration();

	// APPLICATION_PROPERTIES
	config.addConfiguration( appOverrideConfig, APPLICATION_PROPERTIES );

	config.setContainerConfigurationIndex( config.getIndexOfConfiguration( appOverrideConfig ) );

	return config;

}

 ConcurrentCompositeConfiguration config = new ConcurrentCompositeConfiguration(); 

这个类是一个配置的集合,可以加载多个配置文件,每个配置文件都加在到自己单独的AbstractConfiguration 中。

 

private Map<String, AbstractConfiguration> namedConfigurations = new ConcurrentHashMap<String, AbstractConfiguration>();

private List<AbstractConfiguration> configList = new CopyOnWriteArrayList<AbstractConfiguration>();
 configList 就是配置的集合, 如果要查找 其中的一个属性配置,就要循环 configList 中的每一个 AbstractConfiguration  一直到找到为止。

 

ConcurrentCompositeConfiguration  这个类默认添加一个 ConcurrentMapConfiguration ,使用的观察者模式, 代码如下

 

public final void clear() {

	fireEvent( EVENT_CLEAR, null, null, true );

	configList.clear();

	namedConfigurations.clear();

	// recreate the in memory configuration
	containerConfiguration = new ConcurrentMapConfiguration();

	containerConfiguration.setThrowExceptionOnMissing( isThrowExceptionOnMissing() );

	containerConfiguration.setListDelimiter( getListDelimiter() );

	containerConfiguration.setDelimiterParsingDisabled( isDelimiterParsingDisabled() );
				
	containerConfiguration.addConfigurationListener( eventPropagater );

	configList.add( containerConfiguration );

	overrideProperties = new ConcurrentMapConfiguration();

	overrideProperties.setThrowExceptionOnMissing( isThrowExceptionOnMissing() );
				
	overrideProperties.setListDelimiter( getListDelimiter() );

	overrideProperties.setDelimiterParsingDisabled( isDelimiterParsingDisabled() );

	overrideProperties.addConfigurationListener( eventPropagater );

	fireEvent( EVENT_CLEAR, null, null, false );

	containerConfigurationChanged = false;

	invalidate();

}
 接下来看着2行代码
DynamicURLConfiguration defaultURLConfig = new DynamicURLConfiguration();
// archaius.dynamicPropertyFactory.URL_CONFIG
config.addConfiguration( defaultURLConfig, URL_CONFIG_NAME );
 
DynamicURLConfiguration 中的默认加载 config.properties 文件, 并且加入到  ConcurrentCompositeConfiguration 类中。
public DynamicURLConfiguration() {

	URLConfigurationSource source = new URLConfigurationSource();

	if ( source.getConfigUrls() != null && source.getConfigUrls().size() > 0 ) {

		startPolling( source, new FixedDelayPollingScheduler() );

	}

}
 
public URLConfigurationSource() {

	List<URL> urlList = new ArrayList<URL>();

	URL configFromClasspath = getConfigFileFromClasspath();

	if ( configFromClasspath != null ) {

		urlList.add( configFromClasspath );

	}

	String[] fileNames = getDefaultFileSources();

	if ( fileNames.length != 0 ) {

		urlList.addAll( Arrays.asList( createUrls( fileNames ) ) );

	}

	if ( urlList.size() == 0 ) {

		configUrls = new URL[ 0 ];

	} else {

		configUrls = urlList.toArray( new URL[ urlList.size() ] );


	}

}
 URL configFromClasspath = getConfigFileFromClasspath(); 看着一行
private URL getConfigFileFromClasspath() {

	URL url = null;

	// attempt to load from the context classpath
	ClassLoader loader = Thread.currentThread().getContextClassLoader();

	if ( loader != null ) {

		// config.properties
		url = loader.getResource( DEFAULT_CONFIG_FILE_FROM_CLASSPATH );

	}

	if ( url == null ) {

		// attempt to load from the system classpath
		url = ClassLoader.getSystemResource( DEFAULT_CONFIG_FILE_FROM_CLASSPATH );

	}

	if ( url == null ) {

		// attempt to load from the system classpath
		url = URLConfigurationSource.class.getResource( DEFAULT_CONFIG_FILE_FROM_CLASSPATH );

	}

	return url;

}
 public static final String DEFAULT_CONFIG_FILE_FROM_CLASSPATH = System.getProperty( "archaius.configurationSource.defaultFileName" ) == null ? DEFAULT_CONFIG_FILE_NAME : System.getProperty( "archaius.configurationSource.defaultFileName" );
 
也就是 config.properties 这个文件
也可以 -Darchaius.configurationSource.additionalUrls 加载指定的文件。 代码如下
private static final String[] getDefaultFileSources() {

	// archaius.configurationSource.additionalUrls
	String name = System.getProperty( CONFIG_URL );

	String[] fileNames;

	if ( name != null ) {

		fileNames = name.split( "," );

	} else {

		fileNames = new String[ 0 ];

	}

	return fileNames;

}
 DynamicURLConfiguration 还支持动态修改, 定时刷新
public DynamicURLConfiguration() {

	URLConfigurationSource source = new URLConfigurationSource();

	if ( source.getConfigUrls() != null && source.getConfigUrls().size() > 0 ) {

		startPolling( source, new FixedDelayPollingScheduler() );

	}

}
 
public FixedDelayPollingScheduler() {

	// archaius.fixedDelayPollingScheduler.initialDelayMills
	String initialDelayProperty = System.getProperty( INITIAL_DELAY_PROPERTY );

	if ( initialDelayProperty != null && initialDelayProperty.length() > 0 ) {

		initialDelayMillis = Integer.parseInt( initialDelayProperty );

	}
		
	// archaius.fixedDelayPollingScheduler.delayMills
	String delayProperty = System.getProperty( DELAY_PROPERTY );

	if ( delayProperty != null && delayProperty.length() > 0 ) {

		delayMillis = Integer.parseInt( delayProperty );

	}

}
 可以通过 -Darchaius.fixedDelayPollingScheduler.initialDelayMills 设置初始化延时,
-Darchaius.fixedDelayPollingScheduler.delayMills设置多久重新加载一次
 ConcurrentCompositeConfiguration 也可以禁止加载系统配置和环境配置
-Darchaius.dynamicProperty.disableSystemConfig 不加载系统配置
-Darchaius.dynamicProperty.disableEnvironmentConfig 不加载环境配置
-Darchaius.dynamicPropertyFactory.registerConfigWithJMX 设置启用JMX
  • 大小: 12.1 KB
分享到:
评论

相关推荐

    Spring Cloud 中文文档 参考手册 中文版2018

    总的来说,Spring Cloud Dalston文档涉及了Spring Cloud核心组件的配置和使用方法,这些组件为云原生应用程序提供了一系列分布式系统开发的解决方案。开发者可以根据文档的内容快速开始使用Spring Cloud,构建微服务...

    Spring Cloud之一 Spring Cloud简介

    Spring Cloud 是一个基于Spring Boot实现的云应用开发工具集,为开发人员提供了一套快速构建分布式系统中一些常见模式的工具,包括服务发现、配置管理、消息总线、负载均衡、断路器、网关等。它所依赖的基础是Spring...

    Spring Cloud 中文文档

    7. Spring Cloud Netflix:包含了Eureka服务发现的客户端和服务器使用方法,如何注册服务、使用Eureka服务器进行身份验证、处理状态页和健康指标,以及如何应对实例和客户端的元数据配置。 8. 断路器模式:通过...

    Spring Cloud Netflix【spring cloud中文版】--spring cloud中文文档.pdf

    Eureka客户端的使用方法也是文档中的一个重要部分,其中涵盖了如何利用Eureka客户端来发现其他服务,以及如何在不使用原生Netflix Eureka客户端的情况下进行替代方案的探索。此外,文档还探讨了为什么服务注册可能...

    spring cloud 资源

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    spring cloud中文文档

    Spring Cloud是微服务架构中的集大成者,它在云计算中提供了最佳的业务实践。作为Java开发者的必备知识之一,Spring Cloud中文文档提供了关于如何在Spring平台上构建微服务架构模式的云原生应用程序的详细指导。以下...

    Spring Cloud Dalston 中文文档 参考手册 中文版.pdf

    - **Archaius**:Spring Cloud 支持 Archaius 这个外部配置库,可以更好地管理微服务的配置。 - **Spring Cloud ConÒg**:提供了一个集中化的配置中心,使得微服务可以统一管理其配置。 - **快速开始**:介绍了如何...

    Spring Cloud(Dalston )中文参考手册

    - **推送通知和Spring Cloud Bus**:介绍如何使用Spring Cloud Bus实现配置更改的通知和同步。 - **Spring Cloud Config客户端**: - **配置第一引导**:说明如何配置客户端首次启动时加载配置。 - **发现第一个...

    springCloud微服务

    ### Spring Cloud 微服务知识点详解 #### Spring Cloud 概述 Spring Cloud 是一套基于 ...以上内容详细介绍了 Spring Cloud 在微服务架构中的各个组件及其功能,这些知识对于构建稳定、可扩展的微服务架构至关重要。

    spring-cloud-learn-2021:春云学习2021

    10. **服务治理**:Spring Cloud Netflix中的Archaius组件提供了动态配置的能力,使得服务的配置可以在运行时进行调整,增强了系统的灵活性。 这个"Spring-cloud-learn-2021"项目不仅覆盖了以上基础概念,可能还...

    Cloud-native microservices multi-environment conf-flying.zip

    2. **配置管理工具**:例如,HashiCorp 的 Consul、Netflix 的 Archaius 或者 Spring Cloud Config,用于集中管理和分发服务的配置,确保跨环境的一致性。 3. **环境隔离**:开发、测试和生产环境需要隔离,防止...

    cloud-configuration

    1. **集中化管理**:为了便于管理和维护,通常会采用集中化的配置管理系统,如HashiCorp的Consul、Netflix的Archaius或Spring Cloud Config。这些系统允许在一个中心位置管理所有实例的配置,降低了复杂性并提高了...

    第三方服务接入到注册中心的几种方式

    本文主要探讨如何将第三方服务接入基于Spring Cloud EurekaServer构建的注册中心,并提供了针对不同类型的第三方服务的具体接入方法。 #### 一、Spring Boot服务接入注册中心 对于基于Spring Boot开发的应用程序而...

    giga-configserver-repo

    在分布式系统中,配置服务器如Spring Cloud Config或Netflix Archaius等,提供了动态配置的能力。它们通常包括两部分:服务器端和客户端。服务器端负责存储和分发配置,客户端则是在各个微服务中运行,定期从服务器...

    开源项目-micro-micro.zip

    3. **配置中心**:集中式的配置管理有助于在多服务环境中统一管理配置,例如Spring Cloud Config或Netflix Archaius。 4. **消息队列**:消息队列如RabbitMQ或Kafka用于异步处理和解耦服务之间的通信,提高系统的可...

    rbiconfig

    4. 配置管理最佳实践:包括配置分离(开发、测试、生产环境配置不混用)、加密敏感信息、版本控制配置文件以及提供统一的配置中心(如Netflix Archaius或Spring Cloud Config)。 5. 源代码管理:"rbiconfig-master...

    ConfigMicroSrvc

    在实际开发中,"ConfigMicroSrvc"可能使用Java、Go或Node.js等语言编写,采用Spring Cloud Config、HashiCorp Consul或Netflix Archaius等现有框架来实现配置管理功能。此外,它可能与其他服务发现工具(如Eureka或...

Global site tag (gtag.js) - Google Analytics