开源配置中心Apollo的设计与实现

1. 开源配置中心Apollo的设计与实现 分享人:宋顺
2. 请在此插入照片 (直接覆盖在中间区域) 讲师介绍 宋顺 • 携程框架研发部技术专家。 • 2016年初加入携程,主要负责中 间件产品的相关研发工作。 • 毕业于复旦大学软件工程系,曾 就职于大众点评,担任后台系统 技术负责人。
3. 目录 CONTENTS 1 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. • 有治理能力的配置管理平台 • 统一管理不同环境、不同集群的配置 • 配置修改实时生效(热发布) • 版本发布管理 • 灰度发布 • 权限管理、发布审核、操作审计 • 客户端配置信息监控 • Java, .Net原生客户端, Spring支持 Why Apollo
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. Summary 1 What is Apollo 2 Why Apollo 3 Apollo at a glance 4 Apollo in depth