开源配置中心Apollo的设计与实现
如果无法正常显示,请先停止浏览器的去广告插件。
1. 开源配置中心Apollo的设计与实现
分享人:宋顺
2. 讲师介绍
宋顺
请在此插入照片
(直接覆盖在中间区域)
• 携程框架研发部技术专家。
• 2016年初加入携程,主要负责中
间件产品的相关研发工作。
• 毕业于复旦大学软件工程系,曾
就职于大众点评,担任后台系统
技术负责人。
3. 1
目录
CONTENTS
What is Apollo
2 Why Apollo
3 Apollo at a glance
4 Apollo in depth
4. 一个小故事
• 小A是XX团队主力开发,有一天产品说要上线一个迪士尼门
票内购功能
• 由于迪士尼门票很火爆,产品一拍脑袋说,每个用户限购5张!
• 于是小A在代码里是这么写的
private static final int MAX_QTY_PER_USER = 5; //产品需求限购5张
if (qty > MAX_QTY_PER_USER ) {
throw new IllegalStateException(
String.format("每个用户最多购买%d张!", MAX_QTY_PER_USER ));
}
5. 一个小故事
• 第二天中午,由于内购实在太火爆,产品急匆匆的跑过来对
小A说,赶紧改成每人1张!
• 小A只好放弃了午饭,改代码、回归测试、上线,整整花了1
个小时才搞定。。。
6. 一个小故事
• 小B是YY团队主力开发,有一天产品说要上线一个欢乐谷门
票内购功能
• 由于欢乐谷门票很火爆,产品一拍脑袋说,每个用户限购5张!
• 小B吸取了小A的教训,二话不说把配置写在了Apollo配置中
心
7. 一个小故事
• 第二天中午,由于内购实在太火爆,产品急匆匆的跑过来对
小B说,赶紧改成每人1张!
• 小B不紧不慢的说:10秒内搞定~
8. What is Apollo
• 携程框架部门开源的统一应用配置中心
• 支持4个维度管理配置(Key-Value)
• application (应用)
• environment (环境)
• cluster (集群)
• namespace (命名空间)
9. What is Configuration
• 配置是独立于程序的只读变量
• DB Connection Str、Thread Pool Size、Buffer Size、Request
Timeout、Feature Switch、Server Urls等
• 配置伴随应用的整个生命周期
• 启动时读取配置,运行时根据配置调整行为
• 配置可以有多种加载方式
• 程序内部hard code,配置文件,环境变量,启动参数,基于数据库等
• 配置需要治理
• 权限控制、发布审核
• 不同环境、集群配置管理
10. Why Apollo
• 有治理能力的配置管理平台
• 统一管理不同环境、不同集群的配置
• 配置修改实时生效(热发布)
• 版本发布管理
• 灰度发布
• 权限管理、发布审核、操作审计
• 客户端配置信息监控
• Java, .Net原生客户端, Spring支持
11. Apollo at a glance
12. Apollo at a glance
13. Apollo at a glance
• 添加/修改配置项
14. Apollo at a glance
• 添加/修改配置项
15. Apollo at a glance
• 发布配置
16. Apollo at a glance
• 发布配置
17. Apollo at a glance
• 客户端获取配置(Java API样例)
Config config = ConfigService.getAppConfig();
Integer defaultRequestTimeout = 200;
Integer requestTimeout =
config.getIntProperty(“request.timeout”,defaultRequestTimeout);
18. Apollo at a glance
• 客户端获取配置(Java API样例)
Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println(String.format(
“Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s”,
change.getPropertyName(), change.getOldValue(),
change.getNewValue(), change.getChangeType()));
}
}
});
19. Apollo at a glance
• Spring集成样例
@Configuration
@EnableApolloConfig
public class AppConfig {}
@Component
public class SomeBean {
@Value("${request.timeout:200}")
private int timeout;
@ApolloConfigChangeListener
private void someChangeHandler(ConfigChangeEvent changeEvent) {
if (changeEvent.isChanged("request.timeout")) {
refreshTimeout();
}
}
20. Apollo in depth
• Core Concepts
• application (应用)
• 使用配置的应用
• 有唯一标识appId:
• Java: classpath:/META-INF/app.properties -> app.id
• .Net: app.config -> AppID
• environment (环境)
• 配置对应的环境
• DEV, FAT, UAT, PRO:
• server.properties -> env
• C:\opt\settings\server.properties或/opt/settings/server.properties
21. Apollo in depth
• Core Concepts - cluster (集群)
• 一个应用下不同实例的分组
• 对不同的cluster,可以有不一样的配置
•
比如zk地址针对上海机房和成都机房可以有不一样的配置
• 默认数据中心作为cluster
• server.properties -> idc
• C:\opt\settings\server.properties或/opt/settings/server.properties
22. Apollo in depth
• Core Concepts - namespace (命名空间)
• 一个应用下不同配置的分组
• 应用默认有自己的配置namespace – application
• 也可以使用公共组件的配置namespace
• 如RPC,DAL等
• 可以通过继承方式对公共组件的配置做调整,如DAL的初始数据库连接数
23. 总体设计
24. Why Eureka?
• 完整的 Service Registry 和 Service Discovery 实现
• 和 Spring Cloud 无缝集成
• Open Source
25. 客户端设计
26. 配置更新推送
• 客户端Http Long Polling
• 服务端保持30秒
• 客户端断开自动重连
• 服务端async servlet
• Spring DeferredResult
27. 可用性考虑
28. Contribute to Apollo
• https://github.com/ctripcorp/apollo
• 服务端基于Spring Cloud和Spring Boot开发
29. 1
Summary
What is Apollo
2 Why Apollo
3 Apollo at a glance
4 Apollo in depth
30.