1. apollo概念
springCloud Config区别
:
NameSpace
:Apollo在创建项目的时候,都会默认创建一个“application”的Namespace。顾名思义,“application”是给应用自身使用的,Spring Boot项目都有一个默认配置文件application.yml。在这里application.yml就等同于“application”的Namespace。
流转过程
:
配置文件有多种格式,例如:properties、xml、yml、yaml、json等。同样Namespace也具有这些格式。在Portal UI中可以看到“application”的Namespace上有一个“properties”标签,表明“application”是properties格式的
2. 配置server服务端
前提:下载Quick Start安装包,
git地址
1.
创建ApolloPortalDB 与 ApolloConfigDB数据库 验证数据库
select
Id
,
AppId
,
Name
from ApolloPortalDB.App;
select
NamespaceId
,
Key
,
Value
,
Comment
from ApolloConfigDB.Item;
2.
修改项目中
demo.sh
文件,配置自己的mysql地址
3.
端口检查 Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用,8080 是eurek注册中心,8070是项目启动后的后台管理页面地址
4.
windows 下git可视化页面到项目路径下执行命令
./demo.sh start
访问 http://localhost:8070即可,用户名apollo,密码admin
3. 配置属性
-
默认application 配置值
-
创建不同的NameSpace
4. 配置client客户端
流程图:
准备:引入依赖(1.3版本后才支持)
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0</version>
</dependency>
1. API方式获取
1.1
启动项目,访问localhost:8080/apollo/api 即可使用api 获取到apollo配置上的信息; 首先获取到NameSpace,在根据key获取到apollo 上key所对应的value。
/**
* 获取默认的apollo namespace
*/
Config config1 = ConfigService.getAppConfig(); //config instance is singleton for each namespace and is never null
String someKey1 = "name";
String someDefaultValue1 = "name";
String value1 = config1.getProperty(someKey1, someDefaultValue1);
System.out.println("api获取到默认的apollo的值: "+value1);
/**
*获取公共的apollo namespace的值
*/
String somePublicNamespace = "pwade1";
Config config2 = ConfigService.getConfig(somePublicNamespace); //config instance is singleton for each namespace and is never null
String someKey2 = "name1";
String someDefaultValue2 = "name1";
String value2 = config2.getProperty(someKey2, someDefaultValue2);
System.out.println("api获取到公共的apollo的值: "+value2);
/**
* 获取yml格式的apollo namespace值
*/
Config config3 = ConfigService.getConfig("pwade.yml");
String someKey3 = "server.port";
String someDefaultValue3 = "none";
String value3 = config3.getProperty(someKey3, someDefaultValue3);
System.out.println("api获取yml属性的apollo的值: "+value3);
/**
* 获取非 yml格式的apollo namespace值
*/
String someNamespace = "test";
ConfigFile configFile = ConfigService.getConfigFile("test", ConfigFileFormat.XML);
String content = configFile.getContent();
/**
* 监听事件,监听apollo配置修改 修改不同的config(1、2、3)实现监听不同的事件
*
*/
config3.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("***************api apollo配置监听默认事件触发***************");
System.out.println(String.format("apollo配置 change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType()));
}
}
});
}
2. Spring Boot方式
2.1
启动项目,访问localhost:8080/apollo/boot 即可配置spring boot项目获取到apollo配置上的信息,使用
application.yml
server:
port: 8761
#配置apollo属性w
app:
id: pwade
apollo:
meta: http://127.0.0.1:8080 #apollo地址
bootstrap:
namespaces: application,pwade1,pwade.yml
enabled: true
eagerLoad:
enabled: true
logging:
level:
com:
gf:
controller: debug
@RestController
@RequestMapping("/apollo")
public class BootApolloController {
@Value("${name}")
private String name;
@Value("${name1}")
private String name1;
@Value("${server.port:6666}")
private String adress;
@RequestMapping("/boot")
public void apolloInfo(){
System.out.println("spring boot获取到apollo的值默认: "+name+" 公共: "+name1+"yml私有: "+adress);
}
}
3. 注解方式
3.1
启动项目,访问localhost:8080/apollo/annota 即可通过apollo注解方式获取到apollo配置上的信息
@RequestMapping("/apollo")
@RestController
public class ApolloAnnotationController {
@ApolloConfig
private Config config; //inject config for namespace application
@ApolloConfig("pwade1")
private Config anotherConfig; //inject config for namespace application
@ApolloConfig("pwade.yml")
private Config ymlConfig; //inject config for namespace application.yml
@RequestMapping("/annota")
public void apolloInfo(){
System.out.println("注解获取到apollo的值默认: "+geteDfaultDNameSpace()+" 公共: "+getePublicNameSpace()+"yml私有:"+getYmlNameSpace());
}
@ApolloConfigChangeListener("application")
private void someOnChange(ConfigChangeEvent changeEvent) {
//update injected value of batch if it is changed in Apollo
if (changeEvent.isChanged("name")) {
String name = config.getProperty("name","name");
System.out.println("注解pollo监测到默认信息已经修改"+name);
}
}
@ApolloConfigChangeListener("pwade1")
private void someOnPublicChange(ConfigChangeEvent changeEvent) {
//update injected value of batch if it is changed in Apollo
if (changeEvent.isChanged("name1")) {
String name1 = anotherConfig.getProperty("name1","name1");
System.out.println("注解pollo监测到公共信息已经修改"+name1);
}
}
@ApolloConfigChangeListener("pwade.yml")
private void someOnYmlChange(ConfigChangeEvent changeEvent) {
//update injected value of batch if it is changed in Apollo
if (changeEvent.isChanged("server.port")) {
String name3 = ymlConfig.getProperty("server.port","server.port");
System.out.println("注解pollo监测到公共信息已经修改"+name3);
}
}
/**
* 根据config来获取值
* @return
*/
public String geteDfaultDNameSpace () {
return config.getProperty("name", "none");
}
public String getePublicNameSpace () {
return anotherConfig.getProperty("name1", "none");
}
public String getYmlNameSpace() {
return ymlConfig.getProperty("server.port", "none");
}
4. 配置变化事件(change)
@Configuration
public class LoggerConfig {
private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class);
@ApolloConfig
private Config config;
@ApolloConfigChangeListener
private void configChangeListter(ConfigChangeEvent changeEvent) {
refreshLoggingLevels();
}
@PostConstruct
private void refreshLoggingLevels() {
Set<String> keyNames = config.getPropertyNames();
for (String key : keyNames) {
String strLevel = config.getProperty(key, "info");
System.out.println("***************springboot apollo配置监听事件触发***************");
logger.info("{}:{}", key, strLevel);
System.out.println("***************springboot apollo配置监听事件结束***************");
}
}
结语:
在拉取配置中心数据时,获取不到yml 格式NameSpace的数据,最终版本由原来的1.0改成1.3的才可以,代码地址:
apollo项目地址