SpringCloud中使用Apollo实现动态刷新
SpringCloud中使用Apollo实现动态刷新
普通字段
在需要刷新的字段上使用@value
注解即可,例如:
bean使用@ConfigurationProperties动态刷新
bean使用@ConfigurationProperties注解目前还不支持自动刷新,得编写一定的代码实现刷新。目前官方提供2种刷新方案:
- 基于RefreshScope实现刷新
- 基于EnvironmentChangeEvent实现刷新
方法一:基于RefreshScope实现刷新
- 确保项目中已引入依赖
- 实体类上使用
@RefreshScope
注解
在namespace=config的命名空间中定义配置:
- 利用RefreshScope搭配@ApolloConfigChangeListener监听实现bean的动态刷新
@ApolloConfigChangeListener(value="config")
表示监听namespace=config的配置文件的变化refreshScope.refresh("testUserProperties");
表示如果触发监听事件,则刷新名为testUserProperties
的bean;PrintChangeKeyUtils.printChange(changeEvent);
表示打印发送变化的熟悉(可选),PrintChangeKeyUtils
定义为:
方法二:基于EnvironmentChangeEvent实现刷新
- 定义实体类
与方法一的差异是不使用@RefreshScope
注解
- 利用spring的事件驱动配合@ApolloConfigChangeListener监听实现bean的动态刷新:
两种方式动态刷新原理浅析:
RefreshScope
首先了解Spring中几个相关的类:
- 注解@RefreshScope(
org.springframework.cloud.context.config.annotation.RefreshScope
)
- 注解@Scope(
org.springframework.context.annotation.Scope
)
- 接口Scope(
org.springframework.beans.factory.config.Scope
)
- 类RefreshScope(
org.springframework.cloud.context.scope.refresh.RefreshScope
)
带有@RefreshScope
注解后的Bean,在初始话的过程中,会通过AnnotationScopeMetadataResolver#resolveScopeMetadata
提取元数据:
可以理解为 @RefreshScope
是scopeName="refresh"的 @Scope
,其Bean的注册将通过AnnotatedBeanDefinitionReader#registerBean
完成的: