本文分享自华为云社区《华为云物联网高级攻城狮的4年配置中心实践分享》,作者:华为云IoT高级工程师 贺张俭。
自 17 年入职华为之后,一直在使用配置中心,4年期间经历了自研配置中心到 Apollo 再到自研配置中心和 Apollo 并存的场景。总结了一下这几年的配置中心演进流程,想把我们在配置中心上的一些实践分享给大家,实现共同进步。Apollo 是一款非常优秀的开源软件,如果对 Apollo 存在理解错误,还望大家不吝赐教,谢谢。
Apollo(阿波罗)是一款开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
Github:https://github.com/apolloconfig/apollo
人工配置。通过人工在配置中心界面进行配置,而程序只进行读取,如数据库配置、邮箱服务器配置、网卡配置、子网地址配置等。这部分配置数据不要求代码动态写入。
我们是一个 SaaS 服务,每个用户在上面都有一些业务配置。如用户的证书配置、用户服务器的流控配置等,这些业务配置相对运维配置来说更加复杂,且可能会有唯一性限制,如按用户 id 唯一。这部分配置数据一般由用户操作触发,代码动态写入,并且通知到各个微服务实例。通常,我们希望这些配置能在界面展示,且支持人为修改。上述逻辑如果由各微服务自己实现,会存在大量重复代码,并且质量无法保证。我们希望由一个公共组件来统一实现这个能力。
整个配置下只是多对 key、value。value 不是很复杂的格式,往往是整数或字符串。
多值配置更加复杂,往往是单值配置在不同的 key 下,有不同的值。比如下面的配置,用户一和用户二的线程池大小和队列不同
在做云服务之前,我们的配置中心层级数较少。我们以软件的形式交付给客户,软件运行时分为管理面和业务面,配置中心管理着管理面和业务面的配置,最为复杂的场景是多套业务面,这个时候需要保证不同集群、不同微服务下的配置不冲突,配置层级为集群、微服务、配置。
此时的配置中心是完全自研的,不包含蓝绿、灰度配置这些功能,它独具特色的地方有以下两点:
举个例子,添加一个配置的流程是这样的
可能这里,有读者想要问了,这个流程能确保什么可靠呢。这个流程通过调用微服务接口来校验配置是否可靠,如 IP 地址是否合法、对端地址是否可达、配置数量是否超过规格等等,来保证配置基本可用。
总的来说,这个自研的配置中心在当时综合体验还是不错的。但是也有一些问题有待改进,比如单配置下配置项数量过多时,因为底层有部分接口单配置下所有数据都通过一个 http 请求来承载,会导致响应超时等问题。
开始第二阶段实践的原因主要是,我们进行了组织切换,业务重心转向做云服务,同时团队进行 DevOps 转型。原先的老配置中心是由另一个团队维护的,组织切换完之后,如果还要使用,就要我们自己维护。所以我们需要在继续维护老配置中心和引入开源 Apollo 中间进行选择。除了上文中提到的运维配置和业务配置,这个时候我们的需求还有改变:
老配置中心一方面由于组织切换原因不提供维护了,另一方面不能支撑丰富的配置层级,也不具备灰度发布的能力。这个时候,Apollo 的一些特性吸引了我们,这些特性正是老配置中心所缺乏的,例如(部分引用自 Apollogithub 主页)
因此我们选型引入了 Apollo,我和我的主管,还有一个其他同事参与了这项工作。我们在 Apollo 开源代码的基础上做了比较大的改动,主要原因有以下几点:
结合上述原因,我们最终是这么实践的:
Schema 举例:
[
{
"name":"name",
"type":"string"
},
{
"name":"age",
"type":"int",
"max":120
},
{
"name":"ip",
"type":"ipv4"
}
]
那么数据应该是这样的:
{
"name":"hezhangjian",
"age":23,
"ip":"127.0.0.1"
}
下图展示了业务概念和 Apollo 概念的对应关系,有些配置是单值配置,有些是多值配置,所以配置项这一层级是可选的。
在这段时间的实践中,我们也发现了如下的一些问题。
其中最致命的就是并发问题,首先 Apollo 所有配置都存在一张表中,其次由于 Apollo 设计之初主要考虑的是运维人员手动在界面上操作,代码无并发语义(或者说没给客户端并发语义),使得我们通过代码写入配置时难以解决并发问题。
打开 namespace 列表页面,需要显示这个 app_id 下的所有 namespace,因为我们单 app_id 会存放单个云服务的所有配置,这个量很大,且界面不支持分页,导致页面加载缓慢。
Apollo 的 namespace 界面未提供搜索功能(可能 Apollo 设计之初也没想支持这么多),想要从 namespace 中定位到我们想要查看或修改的 namespace,只能借助浏览器的搜索能力。
除了上述几个问题,还有一些原因使得我们开始了第三阶段的实践:
当时大家对是否保留 Schema、回调检查、代码写配置这三个功能点有较大的争议。我个人最希望保留 Schema、回调检查,因为它们优点显著,而且接口是兼容的,可以与其他部门共用,但是增加了 Schema 这个概念和回调检查这个流程,会增加学习成本。而代码写配置,由于要解决并发问题,代码改动量较大,我不建议保留。
大家经过激烈的讨论,最终还是废弃了 Schema、回调检查、代码写配置这三个功能点,仅仅把运维配置放在 Apollo。
然后,我们把业务配置,放在了一个自研的强 Schema 的配置中心上,这个配置中心,仅负责单集群的配置,每个集群部署一套,满足了我们的业务需求。自研强 Schema 配置中心的核心要点有,单配置单表、通过注册中心回调来检测配置是否合法、借助 mqtt 协议来实现长链接推送,无单点瓶颈。
而我们的运维配置中心 Apollo 回归到了开源的版本,重整了配置的结构,
对运维配置而言好处有:
缺点:
业务配置经过我们的实践,确实不适合使用开源的 Apollo。运维配置使用原生的 Apollo,但是现在还不具备回调检查和 **Schema **的功能,希望 Apollo 能在后续版本中支持 Schema,或者弱化的 **json **格式检查功能。下面是我们在如下场景下的最佳实践。
通过 Apollo 来实现功能,至于配置如何组织,根据大家的组织结构、技术架构来对应 Apollo 上的概念,可按照微服务->部署环境或部署环境->微服务的层级来组织配置。
建议在 Apollo 上面自建 portal 包裹一层,后端服务可先进行一层处理,这一层处理可以做比较复杂的格式化校验甚至回调检查,再调用 Apollo OpenApi 将配置写入 Apollo。
最大的挑战是业务配置由用户触发,请求的并发不易处理。思路有两个,一个是在 Apollo 原生代码的基础上,通过数据库分布式锁来解决并发问题。第二个是借鉴我们的思路,通过单配置单表、mqtt 协议实现通知等核心技术点,自研业务配置中心。
需要根据业务配置的数量来考虑是否合设业务配置中心。单集群场景下,毫无疑问只需要一个业务配置中心,甚至如果使用 Apollo 实现,可以考虑和运维配置中心合设。多集群场景下,部署一个业务配置中心,还是多个业务配置中心,我们自己的实践中,一个集群往往要支撑数万用户,我们采取了每个业务集群部署一套业务配置中心的策略。
更多学习内容,请前往IoT物联网社区
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://huaweicloud.blog.csdn.net/article/details/124248420
内容来源于网络,如有侵权,请联系作者删除!