apollo-使用

2,595 阅读3分钟

添加依赖jar

客户端jar


<dependency>

<groupId>com.ctrip.framework.apollo</groupId>

<artifactId>apollo-client</artifactId>

<version>1.5.0</version>

</dependency>

开启配置中心

类加注解


@EnableApolloConfig

从配置中心读数据

方法1-非动态读数据

基于占位符和@Value

@Value("${spring.redis.config.cluster.expireSeconds}")
private Integer expireSeconds;

注意,低版本不能动态读数据,只能在启动的时候读数据。

v0.10.0版本开始,也可以动态读数据。

方法2-动态读数据

1.注入工具bean

在类里面,注入工具bean


@ApolloConfig

Config config; //注入工具bean

2.读配置数据

在方法里,使用工具bean,读数据

String value = config.getProperty("key", "默认值"); 

说明,
1)从配置中心读数据

2)如果没有读到数据,就使用默认值5(即第二个参数)


总结

每次请求的时候,都会执行获取apollo数据的代码,如果有更新,就能够获取到最新数据。

如果没有更新,就仍然是之前的数据。

注意,如果更新,最新数据是在下次请求的时候才会生效。

方法3-动态监听最新更新数据

监听配置变化事件只在应用真的关心配置变化,需要在配置变化时得到通知时使用,比如:数据库连接串变化后需要重建连接等。

如果只是希望每次都取到最新的配置的话,只需要按照上面的例子,调用config.getProperty即可。

Config config = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent changeEvent) {
        System.out.println("Changes for namespace " + changeEvent.getNamespace());
        for (String key : changeEvent.changedKeys()) {
            ConfigChange change = changeEvent.getChange(key);
            System.out.println(String.format("Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
        }
    }
});

总结

1.基于事件的动态监听。

2.比方法2更实时,因为不需要等到下次请求才知道数据变更——相当于是服务器端数据有变更,立即通知到客户端。这个时候,客户端就得到了最新数据。

配置

配置文件添加


### apollo配置中心

# 项目id

app.id=xxx-manager-service //在配置中心管理系统添加应用和应用id

# 注册中心ip/port

apollo.meta=${filter.apollo.meta} //

获取不到配置数据

如果获取不到配置数据,修改:


<!-- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">-->

<bean id="propertyConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> //用这个

参考官方文档

github.com/ctripcorp/a…


如果没有修改这个,获取不到配置数据,日志是


2020-09-21 16:02:45.192|WARN |gf9uxp53mNU5-22|com.ctrip.framework.apollo.internals.RemoteConfigLongPollService.doLongPollingRefresh:194||Long polling failed, will retry in 1 seconds. appId: xxx, cluster: default, namespaces: application, long polling url: null, reason: env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:46.196|ERROR|gf9uxp53mNU5-22|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:46.199|WARN |gf9uxp53mNU5-22|com.ctrip.framework.apollo.internals.RemoteConfigLongPollService.doLongPollingRefresh:194||Long polling failed, will retry in 2 seconds. appId: xxx, cluster: default, namespaces: application, long polling url: null, reason: env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:48.213|ERROR|gf9uxp53mNU5-22|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:48.215|WARN |gf9uxp53mNU5-22|com.ctrip.framework.apollo.internals.RemoteConfigLongPollService.doLongPollingRefresh:194||Long polling failed, will retry in 4 seconds. appId: xxx, cluster: default, namespaces: application, long polling url: null, reason: env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:52.217|ERROR|gf9uxp53mNU5-22|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:52.222|WARN |gf9uxp53mNU5-22|com.ctrip.framework.apollo.internals.RemoteConfigLongPollService.doLongPollingRefresh:194||Long polling failed, will retry in 8 seconds. appId: xxx, cluster: default, namespaces: application, long polling url: null, reason: env is not set, please make sure it is set in /opt/settings/server.properties!



2020-09-21 16:02:35.851|DEBUG|0UB0HhHW25wy-12|org.jboss.logging.LoggerProviders.find:37||Logging Provider: org.jboss.logging.Slf4jLoggerProvider

2020-09-21 16:02:41.296|INFO |0UB0HhHW25wy-12|com.ctrip.framework.foundation.internals.provider.DefaultApplicationProvider.initAppId:96||App ID is set to xxx by app.id property from /META-INF/app.properties

2020-09-21 16:02:41.311|WARN |0UB0HhHW25wy-12|com.ctrip.framework.foundation.internals.provider.DefaultServerProvider.initialize:40||/opt/settings/server.properties does not exist or is not readable.

2020-09-21 16:02:41.320|WARN |0UB0HhHW25wy-12|com.ctrip.framework.foundation.internals.provider.DefaultServerProvider.initEnvType:131||Environment is set to null. Because it is not available in either (1) JVM system property 'env', (2) OS env variable 'ENV' nor (3) property 'env' from the properties InputStream.

2020-09-21 16:02:41.338|DEBUG|0UB0HhHW25wy-12|com.ctrip.framework.foundation.internals.provider.DefaultServerProvider.initDataCenter:161||Data Center is set to null. Because it is not available in either (1) JVM system property 'idc', (2) OS env variable 'IDC' nor (3) property 'idc' from the properties InputStream.

2020-09-21 16:02:41.358|ERROR|0UB0HhHW25wy-12|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:41.486|ERROR|0UB0HhHW25wy-12|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

Logger file /usr/local/cat_20200921.log

[09-21 16:02:42.042] [INFO] [cat] Cat is lazy initialized!

2020-09-21 16:02:42.801|ERROR|0UB0HhHW25wy-12|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:42.818|WARN |0UB0HhHW25wy-12|com.ctrip.framework.apollo.internals.AbstractConfigRepository.trySync:27||Sync config failed, will retry. Repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository, reason: env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:42.897|DEBUG|0UB0HhHW25wy-12|com.ctrip.framework.apollo.internals.RemoteConfigRepository.schedulePeriodicRefresh:109||Schedule periodic refresh with interval: 5 MINUTES

2020-09-21 16:02:42.944|DEBUG|cI1bZnZGq6KN-16|io.netty.util.internal.logging.Slf4JLogger.debug:71||Using SLF4J as the default logging framework

2020-09-21 16:02:43.004|DEBUG|gf9uxp53mNU5-22|com.ctrip.framework.apollo.internals.RemoteConfigLongPollService$2.run:119||Long polling will start in 2000 ms.

2020-09-21 16:02:43.011|ERROR|0UB0HhHW25wy-12|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:43.017|DEBUG|cI1bZnZGq6KN-16|io.netty.util.internal.logging.Slf4JLogger.debug:76||java.nio.Buffer.address: available

2020-09-21 16:02:43.099|DEBUG|cI1bZnZGq6KN-16|io.netty.util.internal.logging.Slf4JLogger.debug:76||sun.misc.Unsafe.theUnsafe: available

2020-09-21 16:02:43.090|WARN |0UB0HhHW25wy-12|com.ctrip.framework.apollo.internals.LocalFileConfigRepository.trySyncFromUpstream:159||Sync config from upstream repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository failed, reason: env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:43.106|DEBUG|cI1bZnZGq6KN-16|io.netty.util.internal.logging.Slf4JLogger.debug:71||sun.misc.Unsafe.copyMemory: available

2020-09-21 16:02:43.105|ERROR|0UB0HhHW25wy-12|com.ctrip.framework.apollo.util.ConfigUtil.getApolloEnv:109||env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:43.113|WARN |0UB0HhHW25wy-12|com.ctrip.framework.apollo.internals.LocalFileConfigRepository.trySyncFromUpstream:159||Sync config from upstream repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository failed, reason: env is not set, please make sure it is set in /opt/settings/server.properties!

2020-09-21 16:02:43.189|WARN |0UB0HhHW25wy-12|com.ctrip.framework.apollo.internals.AbstractConfigRepository.trySync:27||Sync config failed, will retry. Repository class com.ctrip.framework.apollo.internals.LocalFileConfigRepository, reason: Load config from local config failed! [Cause: Cannot read from local cache file /opt/data/xxx/config-cache/xxx+default+application.properties]

2020-09-21 16:02:43.111|DEBUG|cI1bZnZGq6KN-16|io.netty.util.internal.logging.Slf4JLogger.debug:76||java.nio.Bits.unaligned: true

上面的日志是加载初始化apollo和获取配置数据的时候的日志,日志里没有配置的ip地址。


如果修改之后,就可以获取配置数据,日志是:


//初始化

INFO: Deployment of web application directory /Users/gongzhihao/Downloads/apache-tomcat-7.0.96-ys/webapps/manager has finished in 97 ms

2020-09-22 15:30:29.048|INFO |EBZBwpoYvMjl-17|com.ctrip.framework.foundation.internals.provider.DefaultApplicationProvider.initAppId:101||App ID is set to xxx by app.id property from /META-INF/app.properties

2020-09-22 15:30:29.051|INFO |EBZBwpoYvMjl-17|com.ctrip.framework.foundation.internals.provider.DefaultServerProvider.initEnvType:130||Environment is set to null. Because it is not available in either (1) JVM system property 'env', (2) OS env variable 'ENV' nor (3) property 'env' from the properties InputStream.

2020-09-22 15:30:29.053|DEBUG|EBZBwpoYvMjl-17|com.ctrip.framework.foundation.internals.provider.DefaultServerProvider.initDataCenter:160||Data Center is set to null. Because it is not available in either (1) JVM system property 'idc', (2) OS env variable 'IDC' nor (3) property 'idc' from the properties InputStream.

2020-09-22 15:30:29.099|INFO |EBZBwpoYvMjl-17|com.ctrip.framework.apollo.internals.DefaultMetaServerProvider.initMetaServerAddress:42||Located meta services from apollo.meta configuration: http://10.213.33.84:8080!

2020-09-22 15:30:29.102|WARN |EBZBwpoYvMjl-17|com.ctrip.framework.apollo.core.utils.ResourceUtils.readConfigFile:54||No available properties: apollo-env.properties

2020-09-22 15:30:29.104|INFO |EBZBwpoYvMjl-17|com.ctrip.framework.apollo.core.MetaDomainConsts.initMetaServerAddress:93||Located meta server address http://xxx:8080 for env UNKNOWN from com.ctrip.framework.apollo.internals.DefaultMetaServerProvider //这里会有ip地址

[09-22 15:30:29.327] [ERROR] [DefaultModuleContext] java.io.FileNotFoundException: /data/applogs/cat/cat_20200922.log (No such file or directory)




//读取数据

2020-09-22 15:30:30.436|WARN |EBZBwpoYvMjl-17|com.ctrip.framework.apollo.internals.RemoteConfigRepository.loadApolloConfig:194||Load config failed, will retry in 1 SECONDS. appId: xxx, cluster: default, namespaces: application

2020-09-22 15:30:31.439|DEBUG|EBZBwpoYvMjl-17|com.ctrip.framework.apollo.internals.RemoteConfigRepository.loadApolloConfig:208||Loading config from http://10.213.33.86:8080/configs/xxx/default/application?ip=10.211.55.2

2020-09-22 15:30:31.452|DEBUG|EBZBwpoYvMjl-17|com.ctrip.framework.apollo.internals.RemoteConfigRepository.loadApolloConfig:229||Loaded config for application: ApolloConfig{appId='xxx', cluster='default', namespaceName='application', configurations={warn.application.prefix=xxx, dbPool.dbcp.warnThreshold=0.8}, releaseKey='20200922153007-123227a3fad4416e'}

2020-09-22 15:30:31.454|DEBUG|EBZBwpoYvMjl-17|com.ctrip.framework.apollo.internals.RemoteConfigRepository.sync:141||Remote Config refreshed!

2020-09-22 15:30:31.454|DEBUG|EBZBwpoYvMjl-17|com.ctrip.framework.apollo.internals.RemoteConfigRepository.schedulePeriodicRefresh:116||Schedule periodic refresh with interval: 5 MINUTES

2020-09-22 15:30:31.457|DEBUG|gDrgMMVJV6Xz-65|com.ctrip.framework.apollo.internals.RemoteConfigLongPollService$2.run:118||Long polling will start in 2000 ms.

2020-09-22 15:39:23.405|DEBUG|UY21g6W4kK7E-61|com.ctrip.framework.apollo.internals.ConfigServiceLocator$2.run:135||refresh config services

2020-09-22 15:39:23.460|DEBUG|gAjFuulbvaIz-64|com.ctrip.framework.apollo.internals.RemoteConfigRepository$1.run:123||refresh config for namespace: application

2020-09-22 15:39:23.464|DEBUG|gAjFuulbvaIz-64|com.ctrip.framework.apollo.internals.RemoteConfigRepository.loadApolloConfig:208||Loading config from http://10.213.33.86:8080/configs/xxx/default/application?releaseKey=20200922153007-123227a3fad4416e&ip=10.211.55.2

2020-09-22 15:39:24.943|DEBUG|gAjFuulbvaIz-64|com.ctrip.framework.apollo.internals.RemoteConfigRepository.loadApolloConfig:223||Config server responds with 304 HTTP status code.




参考

github.com/ctripcorp/a…