这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
背景
如果我们使用的配置中心是apollo的话我们经常会遇到这样的问题,就是动态更新配置Bean
动态更新配置bean
动态更新配置bean其实是很简单的,但是单纯依赖spring boot
是不行的,我们还需要添加额外的依赖,就是spring cloud
相关依赖
具体一个简单的实例如下
依赖
<dependencies><dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId></dependency></dependencies>
spring boot 和 spring cloud版本使用统一依赖管理具体可以看后面的源码
配置bean
- TestProperties
@ConfigurationProperties("spring.cloud.test")
@ToString
@Data
public class TestProperties {private String name;
}
动态刷新
- ApolloPropertiesChangedListener
@Configuration
@Slf4j
public class ApolloPropertiesChangedListener implements ApplicationEventPublisherAware {public static final String NAMESPACE = "test.yml";private ApplicationEventPublisher publisher;@ApolloConfigChangeListener(value = NAMESPACE)public void onChange(ConfigChangeEvent changeEvent) {publisher.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}
}
我们也可以通过注解的其他属性刷新指定的key前缀或指定的key
测试controller
@RestController
@RequestMapping
@EnableConfigurationProperties(TestProperties.class)
@RequiredArgsConstructor
public class TestController {private final TestProperties testProperties;@GetMapping("/test")public void test() {System.out.println(testProperties);}
}
测试
http://localhost:8090/test
我们调用接口然后修改apollo的数据
可以发读取到的配置修改成功了
源码
githu: https://github.com/weihubeats/weihubeats_demos/tree/master/spring-boot-demos/spring-boot-apollo