在第四个阶段,我们将实现Apollo配置的动态更新。
@Component
@ConfigurationProperties(prefix = "some.config")
@Data
public class SomeConfig {
private String property;
// 使用@Value注解来标记需要动态更新的字段
@Value("${some.config.anotherProperty:default}")
private String anotherProperty;
}
@Component
public class ApolloConfigChangeListener {
private final SomeConfig someConfig;
@Autowired
public ApolloConfigChangeListener(SomeConfig someConfig) {
this.someConfig = someConfig;
}
@ApolloConfigChangeListener(interestedKeys = {"some.config.property", "some.config.anotherProperty"})
public void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
log.info("Found change - key: {}, oldValue: {}, newValue: {}, changeType: {}",
change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType());
// 根据配置项的变化更新SomeConfig对应的字段
if ("some.config.property".equals(key)) {
someConfig.setProperty(change.getNewValue());
} else if ("some.config.anotherProperty".equals(key)) {
someConfig.setAnotherProperty(change.getNewValue());
}
}
}
}
在这个例子中,我们创建了ApolloConfigChangeListener
类,它会监听some.config.property
和some.config.anotherProperty
这两个配置项的变化。当这些配置项的值发生变化时,onChange
方法会被调用,并且更新SomeConfig
类中对应的字段值。这样,我们就实现了配置的动态更新,无需重启服务即可使配置生效。