首先导入apollo客户端依赖:
com.ctrip.framework.apollo apollo-client 1.3.0
然后在配置文件中编写apollo配置:
apollo:
meta: 你的apollo配置中心地址
bootstrap:
enabled: true #apollo.bootstrap.enabled官方解释为注入默认application namespace的配置示例
namespaces: common,${biz.app.lower-code}-main-config.yml #命名空间,默认是application
autoUpdateInjectedSpringProperties: true # 自动更新注入的spring属性
app:
id: calendar #appid,唯一标识,要与apollo配置中心的项目id一致
普通字段实时更新:直接在要更新的字段上加上Value注解即可(注意:该字段在apollo配置中心中要有配置)然后在apollo配置中心修改name的值这边就可以实时更新了。
@RestController
@RequestMapping("/test")
public class IndexController {
@Value("${name}")
String name;
@GetMapping("/hello")
public String test(){
return "hello: " + name;
}
}
然后测试一下:
apollo配置文件中做如下修改:
然后可以看到
更新一个bean的属性(实时更新)
- 首先在bean类上加上两个注解,prefix=“jobinfo”表示键为jobinfo对应的值的变动都可以实时更新,比如jobinfo.jobName
@ConfigurationProperties(prefix = "jobinfo")
@Component
public class JobInfoVo {
//任务名称
private String jobName;
//任务组
private String jobGroup;
//触发器名称
private String triggerName;
//触发器组
private String triggerGroup;
//cron表达式
private String cron;
//配置信息(data)
private String config;
}
- 在启动类上加上@EnableApolloConfig注解,查看EnableApolloConfig配置可以发现,默认值是Application,这里我们指定命名空间value = {“calendar-main-config.yml”
@EnableApolloConfig(value = {"calendar-main-config.yml"})
- 然后编写apollo监听类
@Slf4j
@Component
public class ApolloConfigChanged implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Resource
private JobInfoVo jobInfoVo;
@ApolloConfigChangeListener(value = {"calendar-main-config.yml"})
public void onChange(ConfigChangeEvent changeEvent) {
boolean propertiesChanged = false;
for (String changedKey : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(changedKey);
log.info("Change-key: {}, oldValue: {}, newValue: {}, changeType: {}",
change.getPropertyName(),change.getOldValue(),
change.getNewValue(), change.getChangeType());
//jobinfo的key发生了改变
if (changedKey.startsWith("jobinfo.")) {
propertiesChanged = true;
// break;
}
}
//更新jobinfo的值
if (propertiesChanged) {
refreshProperties(changeEvent);
}
}
private void refreshProperties(ConfigChangeEvent changeEvent){
long startTime = System.currentTimeMillis();
// 更新配置
this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));
long finishTime = System.currentTimeMillis() - startTime;
log.info("更新数据完成!耗时:" + finishTime + "ms");
// 这里可以获取jobinfoVo的属性值,查看其更新情况。
log.info(jobinfoVo.getCron())
//........
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
- 最后就可以进行测试啦
首先对apollo中的配置文件进行修改
然后可以发现:配置实时更新过来了
另外:我们上面实现的实时更新是当配置中心的配置发生改变时,配置中心主动向客户端推送最新配置,而apollo客户端也会主动拉取配置中心的配置,默认5分钟拉取一次,这里我们可以添加一个配置,通过设置系统参数apollo.refreshInterval来覆盖这个默认值,单位:分钟。
可以在启动类的main方法中加上如下代码:时间间隔为1分钟,客户端主动拉取配置。
System.setProperty("apollo.refreshInterval","1");



