文章总结: 本文档详解了携程开源Apollo配置中心,阐述其四维管理模型及长连接推送与定时拉取的更新原理。重点介绍了SpringBoot集成步骤,包括依赖、配置与注解使用,并深入对比了@ApolloConfigChangeListener、@Value等四种配置热加载方式的适用场景与差异,为应用动态配置管理提供了实践指南。 综合评分: 93 文章分类: 产品介绍,解决方案
Apollo配置中心详解
原创
静观云起
码云精炼
2026年1月11日 17:30 广东
一 概述
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
Apollo支持4个维度管理Key-Value格式的配置:
✅application(应用)
✅environment(环境)
✅cluster(集群)
✅namespace(命名空间)
同时,Apollo基于开源模式开发,开源地址:https://github.com/ctripcorp/apollo
二 工作模型
Apollo的基础模型:
1.用户在配置中心对配置进行修改并发布
2.配置中心通知Apollo客户端有配置更新
3.Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用
三 配置原理
Apollo客户端的实现原理:
1.客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。
2.客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。这是一个fallback机制,为了防止推送机制失效导致配置不更新,客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 – Not Modified。定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟。
3.客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
4.客户端会把从服务端获取到的配置在本地文件系统缓存一份,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
5.应用程序从Apollo客户端获取最新的配置、订阅配置更新通知
四 springboot集成Apollo
1.添加客户端依赖,pom.xml文件中,添加Apollo客户端依赖
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.9.0</version></dependency>
2.添加Apollo配置
在Spring Boot的配置文件(如src/main/resources/application.properties)中添加以下配置:
app.id=你的应用ID #Apollo配置中心中创建的应用IDapollo.meta=Apollo服务地址# 可选项:是否开启 Apollo(默认 true)apollo.bootstrap.enabled=true# 可选项:是否在启动时加载所有配置(默认 true,建议开启)apollo.bootstrap.eagerLoad.enabled=true# 可选项:指定命名空间(默认为application)apollo.bootstrap.namespaces=application
3. springboot启动类增加注解
@SpringBootApplication @EnableApolloConfig // 开启配置刷新能力public class ApolloMxnApplication { public static void main(String[] args) { SpringApplication.run(ApolloMxnApplication.class, args); } }
4.配置热加载
<1>动态监听配置变化事件
@Slf4j@Componentpublic class SampleService {
@Value("${timeout:1000}") private int timeout;
// 监听特定配置变更 @ApolloConfigChangeListener public void onConfigChange(ConfigChangeEvent event) { if (event.isChanged("timeout")) { ConfigChange change = event.getChange("timeout"); log.info("timeout changed " + change.getOldValue() + " to " + change.getNewValue()); // 可以在这里执行特定逻辑,如重新初始化线程池等 } }}
<2>@value注解自动刷新
当Apollo配置中心的某个配置项(如example.key)发生变化并推送到客户端后,Spring会自动将最新的值注入到使用@Value注解的字段中。spring不会主动通知你这个值变了,你只有在下次访问该字段时才会拿到新值,无法直接感知变化事件。
import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;@Service@Slf4jpublic class MyService { @Value("${example.key:默认值}") private String exampleKey; public void printValue() { log.info("example.key 的值是: " + exampleKey); }}
<3>@ConfigurationProperties + Setter 方法
通过@ConfigurationProperties将一组相关的Apollo配置绑定到一个 Java 类的字段上。
当Apollo配置发生变更时,Apollo客户端会自动刷新这些字段,并调用对应的setter方法。你可以在 setter 方法中编写响应逻辑,从而间接实现“监听配置变化”的效果。
import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;@Slf4j@Component@ConfigurationProperties(prefix = "example")public class ExampleConfig { private String key; // 注意:必须有setter,Apollo更新配置时会调用此方法 public void setKey(String key) { this.key = key; log.info("监听到配置变化example.key被更新为: " + key); // 这里可以加入你的业务逻辑,比如刷新缓存、通知其他组件等 } public String getKey() { return key; }}
<4>Spring Cloud Context的@RefreshScope
如果你确实使用了spring-cloud-starter-apollo,并且引入了Spring Cloud相关依赖,那么@RefreshScope注解可以让一个Bean在配置刷新时被销毁并重新创建,常用于 Controller 或 Service 中需要动态刷新的 Bean。但 Apollo 本身已经做了大部分自动刷新工作,多数情况下不需要手动加@RefreshScope
动态刷新配置方式比较:
| 方式 | 自动刷新 | 感知事件 | 适用场景 | | — | — | — | — | | @ApolloConfigChangeListener | ✅ 是 | ✅ | 需要精确监听某个 key,实时响应 | | @Value | ✅ 是 | ❌ | 简单配置,不关心变化时机 | | @ConfigurationProperties + setter | ✅ 是 | ✅ | 多个关联配置,想在变化时执行逻辑 | | @RefreshScope + @Value | ✅ 是 | ❌ | Spring Cloud 项目,谨慎使用 |
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:码云精炼 静观云起《Apollo配置中心详解》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论