机灵鬼儿小张
国庆节前实习生小张接到一个关于优惠券发放的需求。大致要求是当用户购物完成后,如果是首次购物,那么发送一张优惠券作为首单礼给用户。机灵的小张写了如下代码:
public static String COUPON_ID = "COUPON2019090900001"
public void presentGift(OrderDto order) {
if (order.isFirstOrder()) {
sendCoupon(order.userNo, COUPON_ID);
}
}
public void sendCoupon(String userNo, String couponId) {
// 发送优惠券
}
如上为伪代码展示,小张将要发送的优惠券 ID 定义为了一个常量,功能完美上线,国庆节的前俩天小张玩得很嗨。第三天小张准备继续去疯,突然收到了产品的电话:
“小张啊,帮忙给首单礼换张券吧,之前那张券优惠力度过小,促销效果略差。”
小张:
“好的,李哥。一行代码的事儿。”
小张不慌不忙打开电脑,将 COUPON_ID 修改一下,提交代码,合并代码,打 TAG,等待 Jenkins 打包,打包完成发布到服务器,终于搞定了,一看时间已经半小时过去了。
小张:“李哥,已经换好了。”
产品:“好了?麻烦了,小张。”
表面上李哥说麻烦了,心里犯嘀咕,怎么换个优惠券这么长时间,难免觉得小张不靠谱。小张也心里默默觉得哪里不对,要优化优化。
时间过得很快,小张转正了,又是一年国庆时。小张再次被委以重任,机灵的小张这次将优惠券 ID 放在了配置文件里面。历史又重现了,果不其然,产品又要换券,小张:“嘿嘿,这次不用改代码了”。经过一年的发展,小张公司的服务器数量也是飞速地上涨,由 1 台变成了 3 台。小张挨个儿为 3 台服务器上的程序配置更新了优惠券 ID。一看时间,十分钟过去了。李哥:“谢谢啊,小张,回头请你喝奶茶”。虽然这次省去了改代码、发布的环节,但是小张隐隐觉得还是有什么不对。
国庆一收假,小张就急匆匆地跑去找师傅老王:”王哥,这个产品老是要改配置里面的东西,现在咱有三台服务器还好说,等到明年、后年业务继续疯涨,这可咋办呢,虽说改配置也简单,但是扛不住量多呀,一台机器一台机器地改,我手速再快,也得个把小时呢。”
老王嘿嘿一笑:“小张啊,这个简单,搞个配置中心,你去学习学习。”小张半信半疑地开始在网上搜索关于“配置中心”的资料。
配置中心的定义
经过一番铺垫,终于说到配置中心了。配置中心是什么?
配置中心是把所有应用程序的配置统一管理的解决方案,然后应用程序通过配置中心来获取属于自己的配置,当遇到配置需要变更的时候,开发人员只需要在配置中心的管理端更新配置,作为配置中心的客户端的应用程序即可动态获取配置。
小张的那个问题对配置中心来说就是小菜一碟。那么配置中心相对于传统的静态配置文件具体有哪些功能呢?
1. 集中式配置
所有配置统一存放管理,再也不用拼手速登录到每台服务器去更改应用配置了,一键为所有应用程序更改配置。
2. 标准化格式,屏蔽格式概念
屏蔽了静态配置文件的格式,提供统一 key 和 value 格式,将五花八门的配置文件格式(XML、Properties、YML、JSON、数据库表)一脚踹开,再也不用担心看不懂隔壁大哥项目的配置文件了。
3. 环境隔离
支持环境隔离。测试环境加了配置,功能上线后,新配置项忘记添加在生产环境了。一键同步配置到其他环境,再也不用担心记忆力不够用,丢三落四啦。
4. 版本控制,易于回滚
配置做了改动,但是效果不理想,想回到过去?一键回滚到上一个发布版本,再也不用烂笔头了。
5. 客户端实时同步
配置更新了,我要重启下服务。What?改配置还要重启服务!客户端动态获取配置中心最新配置,重启服务?不存在的。
6. 权限控制
支持权限控制,发布审核。
小张:“王哥,感觉是不是有人动了生产环境的配置?程序运行诡异。”
老王:“小张,仔细检查检查代码,配置的发布权限都在我这呢,没发布过。”
再也不用担心,是谁动了我的奶酪啦。怎么样,是不是惊呆了?配置居然可以这么优雅,有了配置中心,小张就可以静静地搬砖,再也不用担心配置的问题咯。
这么多好用实在的功能如果是要自己来开发实现一套配置中心还是要花不少功夫的,好在有不少大厂开源了自己家的配置中心给大家使用,例如如下知名的开源配置中心产品:
- 阿里巴巴 Diamond
- Netflix Archaius
- Facebook GateKeeper
- 携程 Apollo
- 百度 Disconf
当中携程出品的 Apollo 使用文档齐全,上手简单,功能完善受到了大家的一致追捧。因此,我们也使用它来实战我们的微服务配置中心。
Apollo 初探
简介
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于 Spring Boot 和 Spring Cloud 开发,打包后可以直接运行,不需要额外安装 Tomcat 等应用容器。Java 客户端不依赖任何框架,能够运行于所有 Java 运行时环境,同时对 Spring/Spring Boot 环境也有额外支持。.NET 客户端不依赖任何框架,能够运行于所有 .NET 运行时环境。
(以上摘自 Apollo 项目 GitHub 站点)
Apollo 诞生于 2016 年,它 是专门为分布式应用而生的配置中心,它实现了我们上述介绍的所有配置中心特性,并且官方提供了 Java 和 .Net 的源生客户端,支持灰度发布,客户端配置信息监控,提供开放平台 API,最重要的是文档完善上手容易。
精简架构
如上为 Apollo 的简单架构设计图,主要涉及到三个角色:开发人员、配置管理系统、客户端。开发人员通过 Apollo 管理系统来管理(新增、修改、发布)应用配置,配置更改后 Apollo 会将配置变更推送到客户端,客户端主动向 Apollo 管理端获取到最新的配置,这样就做到了配置的统一管理和配置的及时更新。
管理端界面
如上图为 Apollo 初次部署启动后的管理系统界面,从我的项目一栏中可以看出,此时只有官方提供的 SampleApp。我们使用的 Apollo 预制的管理员账户 apollo 登入,可以看到管理员的权限有:用户管理、开放平台授权管理、系统参数配置、应用、集群、AppNamesapce 管理。点击 SampleApp 进入单个应用的配置管理界面:
如上图,从左侧我们可以看到 SampleApp 目前只有 DEV 环境以及项目的基本信息,右侧我们可以看到应用配置的操作按钮:发布、回滚、发布历史、授权、灰度发布、同步配置、新增配置等,中间展示的为当前应用配置的具体信息,我们可以看到 SampleApp 有一个默认的私有命名空间 application,该空间下面有一个配置项 timeout 它的值为 100,备注信息为 sample timeout 配置,最后修改时间为 2019-09-24 11:58:28, 最右侧展示了操作按钮——修改、删除当前配置项。
通过本小节我们已经对 Apollo 有了初步的认识,接下来我们来认识一下 Apollo 中的几个核心概念。
以上为本人在 GitChat 平台发布的付费文章 微服务配置中心之 Apollo 节选,欢迎订阅。完整目录如下:
- 配置中心的诞生
- 配置中心的定义
- 配置中心应用场景
- Apollo 简介
- Apollo 核心概念
- Apollo 配置中心实战
- Apollo 架构设计
- Apollo 企业级部署指南
- Apollo 客户端接入
- Spring Cloud Config 简介
- Apollo vs Spring Cloud Config
- Apollo 常见问题
- 配置中心参考学习资源