经验总结:改造Apollo客户端以实现自定义动态数据刷新

144 阅读2分钟

最近有个项目需要接入apollo,虽然原生的apollo的配置和动态刷新都已经集成到客户端中了,但是还不够,需要对其进行改造,以适应项目的需要。

目标一:接入apollo连接指定环境的地址

目标二:apollo接入后需要监听某个指定key值的变化而去做一些我们想要做的事情

基于这两个目标,首先就是要把apollo环境给接上去。开干,根据官方相关的文档,连接远程的apollo的地址只需要配置远程地址即可。

首先配置你的apollo的远程地址 -Dapollo.meta=http://remote-apollo-config-server:8080 到环境变量上。你也可以通过SPI改造apollo以实现你特定的环境变量配置达到连接不同地址的效果:

image.png

例子这里的MetaServerProvider是对启动的环境变量apollo_meta进行重写,来适配不同环境连接不同地址的SPI自定义类。ProviderManager也是处理不同环境变量的Manager的处理方式,达到自定义管理的目的。

ConfigurableApplicationContext类是Spring的上下文,它有一个成员变量ConfigurableEnvironment 对象够获取Spring的配置资源的内容,其中propertySources就是资源对象信息,下图看到加载后会得到所有资源对象:

image.png

可以看到第一个就是我们的apollo,这里我已经添加好apollo相关的配置,并正在启动项目,断点处是Spring加载资源后继续启动,但是被我断住了。这里的顺序不是一定的,是根据你不同配置资源的优先级来排序的,顺序会决定你在读取Spring资源的值时会优先读取谁的皮质,比如我这里,需要优先读取apollo的值,那么我就要将apollo的资源对象放到首位,这样,spring会优先从apollo中取值。顺序的配置要继承Spring的org.springframework.core.Ordered接口,重写这个方法改变优先级的值即可实现。

例如,你如果想在项目启动后你自己定义一个属性资源类到Spring中,并且你想要这个资源类的优先级最高(先读它)那么你可以定义一个类继承ConfigurableApplicationContext、Ordered比如

    override fun initialize(applicationContext: ConfigurableApplicationContext){
    val environment = applicationContext.environment
    ...创建你的PropertiesPropertySource
    //放入首位
    environment.propertySources.addFirst(propertiesPropertySource)
    }
}

那么到这里,目标一已经实现了。接下来来实现目标二:

目标二的实现比较简单,我们用注解@ApolloConfigChangeListener就可以轻松处理。定义一个你要处理的方法,方法上加上注解,并配置好对应的命名空间和想要监听的key,如下:

@ApolloConfigChangeListener(value = ["application"], interestedKeys = ["a", "b", "c"])
fun onChange(changeEvent: ConfigChangeEvent) {

}

这样,当apollo中a、b、c的值更新时,就会通知到这个方法,你就可以在方法里面处理你想要处理的逻辑了