前言

一位读者朋友跟我反馈,能不能写一篇比较全的配置中心的文章。自己最近在面试过程中有被面试官问:如何设计一个配置中心? 这个话题,由于自己在工作中也没实际使用过配置中心,所以对于如何去设计是完全没有概念的。

今天就给大家写一篇去配置中心需要考虑的点,我也不是什么配置中心开源项目的参与者,所以写出来的仅供大家参考。

有必要重复造轮子吗?

当面试官问你:如果让你写一个配置中心,说说你的设计思路? 首先我们要有自己的想法,虽然是在面试过程中的问题。我们也可以反问,市面上目前有几款很优秀的开源的配置中心,我们可以直接拿来用,有必要去重新造轮子吗?

如果面试官说只是考察一下你对这块的设计和理解程度,然后你就可以接着讲解你的思路了。如果面试官说我们很多框架都是自研的,任性,就是有这个需求,那你还是得接着说,躲不掉,哈哈。

如果要重新造,我们也可以基于开源的进行改造,下面我说下如果要设计一个配置中心,它的整体思路是怎样的,需要用到哪些技术点,然后开始你的表演。

配置存储选型

首先我们来看存储的选型,配置中心需要存储所有的配置内容,肯定需要进行存储。目前主流开源的配置中心都采用 Mysql 进行配置的存储,当然你也可以用其他的,比如 MongoDB 也非常适合。

用不同的数据库在设计表结构的时候会有所不同,比如 Mysql 可能要 10 个表,MongoDB 简化后可能 5 个表就够了(Mysql 多表关联,MongoDB 内嵌文档)。

Mysql 多表关联


MongoDB 内嵌文档


这些表除了基本的配置内容存储,还有就是一些辅助的表,比如用户信息,权限信息等。

除了底层结构的设计,我们还需要考虑存储的可用性。Mysql 可以做主从,分库分表等,MongoDB 天生就是分布式的数据库,也不存在单点问题,在可用性这块都是 OK 的。

另外在设计层面,对于配置信息可以加上本地缓存,当数据库或者服务不可用时也能短暂提供服务能力,一般都是在 client 层面做。Apollo 和 Nacos 都会在本地缓存配置信息。

配置隔离

配置隔离在配置中心也是非常重要的一个点,不同的环境不同的配置信息,这个是最基础的。在没使用配置中心之前通常都是在项目中为每个环境维护一个配置文件,然后通过命令进行切换需要使用的文件。


除了环境的隔离,还有一种就是访问层面的隔离,比如命名空间,不同的空间相互是隔离的,不能相互访问。

底层隔离的方式也有很多种,第一种是在存储的时候增加一个字段进行环境的区分,数据统一存储在一起,但是可以区分,这种方式好处在于一套配置中心可以提供给所有环境进行使用。


第二种是在部署层面直接就隔离了,也就是测试环境部署一套独立的配置中心,线上也部署一套独立的配置中心,也就不需要在存储的时候通过字段隔离了。


第三种也是部署的时候进行隔离,不同的点在于 Web 后台管理只部署一套,配置信息对应的服务可以按环境部署多套,每套都有自己独立的数据库,Apollo 就是采用这种方式。


配置推送刷新

配置在修改后能够实时的推送到应用程序中进行更新,这个是最重要的一个功能,用户体验也是非常好的。在没用配置中心之前,有用 Mysql 进行配置存储的,为了提高性能,减小数据库的压力,配置信息读取后会放入缓存中,后台会启动一个定时线程去更新,比如 1 分钟一次。

这样带来的问题就是配置改完后需要等待一定的时间客户端才能更新好,一般场景都没啥问题,对于一些特殊的场景还是需要改完立马生效,才能尽可能避免某些业务问题带来的损失。

对于配置修改及时更新的实现方式目前主要分为两种:推和拉。

拉模式前面讲过了,有时间间隔问题,就算设置的很快,比如 1 秒一次,频率太高会导致服务端压力过大。

推模式是比较好的方式,当服务端有变动的时候将变更的信息推送给客户端,即及时又能减轻定时拉取的频率。

推送可以采用 Spring DeferredResult 将请求挂起的模式实现,详情可以参考我的这篇文章:Apollo服务端设计原理剖析

更好的方式是推拉结合,目前主流的配置中心都是采用这种方式。推保证及时性,拉用于兜底,保证最终配置一致性,推拉结合的模式可以将拉取的时间放长,降低服务端压力。

集成 Spring

Spring 是 Java 语言开发必不可少的好朋友,使用 Spring 可以极高的提高我们的开发效率,各种框架都能非常方便的集成。

在 Spring 中最常见的两种获取配置值的方式是@Value 和@ConfigurationProperties,要想使用上面的方式能够获取到配置中心里的内容,需要在项目启动的时候从配置中心加载对应的配置内容,然后集成到 Spring 中。

Spring 中提供了 ConfigurableEnvironment,ConfigurableEnvironment 中又包含多个 PropertySource。PropertySource 就是 Key,Value 的配置。所以需要在应用启动的时候,获取配置信息组装成 PropertySource 交给 Spring 管理。

权限审计

无论是所有环境用一套配置中心还是每个环境都有单独的部署,权限控制还是要的,因为不同的小组负责不同的业务,肯定不能随便去改动其他组的配置。

另一个场景就是配置能被谁改,这个一般都是负责人进行修改,团队人员可以查看配置信息,这个也是很常见需要进行控制的场景。


单纯从配置的功能来讲,很多人都会说为什么我要用配置中心,自己搞张表存储一下不也行么,我认为配置的存储是最基本的功能,更多让我们使用配置中的原因在于可以节省我们自己去做的成本。同时配置中心具有很全的治理方面的能力,比如权限,灰度实用的功能等。

指标监控

作为一款中间件,而且是被很多系统使用,它的一些性能指标也是需要监控起来的。常见的做法有下面几种方式。

一种是配置中心自己暴露出一些指标数据,可以让外部监控系统进行拉取,pull 方式。像 Nacos 中就暴露了 metrics 数据,可以用 prometheus 进行拉取并监控,非常方便。


一种是配置中心自己埋点,对接一些监控系统,采用 push 的方式。比如 Apollo 中就集成了 Cat 的监控,可以将相关监控数据投递到 Cat 中进行展示并告警。

还有一种方式就是提供 Tracer 相关的 SPI,可以让使用方自行去接入不同的监控,灵活度更高。

无论用哪种方式,我们的最终目的是一致的,都是为了能够让 Bug 不发生,就算有问题也能监控到,不然就惨了,哈哈。

开放 API/多语言 SDK

目前几款比较活跃的配置中心都是 Java 开发的,也提供了对应的 Java SDK。如果你自己用其他语言开发一套配置中心,也是一样的需要有对应语言的 SDK。如果公司是多语言技术栈,那么可以为每种语言都开发一个 SDK 进行接入。

如果作为开源的项目,也不能规定别人使用什么语言,如果不想开发多语言 SDK 的话,可以提供一套开放 API 让使用者自己去封装 SDK 或者直接在项目中进行接入。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

卧槽,面试官质疑我不会配置中心原理,看不起谁呢?相关推荐

  1. Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理

    面试官:Spring框架中的@Autowired注解可以标注在哪些地方? 小小白:@Autowired注解可以被标注在构造函数.属性.setter方法或配置方法上,用于实现依赖自动注入. 面试官:有没 ...

  2. 蚂蚁金服二面:面试官问我零拷贝的实现原理,当场跪。。。

    本文来源:占小狼的博客 "狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过&q ...

  3. 前端面试官怎么问的问题都是原理呢?

    HTML 1.必考:你是如何理解 HTML 语义化的? i.举例法 HTML 语义化就是使用正确的标签(总结)段落就写 p 标签,标题就写 h1 标签,文章就写article标签,视频就写video标 ...

  4. 面试官问我MySQL事务的底层原理?幸亏我总结了全套八股文

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...

  5. Nacos配置中心原理

    点击蓝色"程序猿DD"关注我哟 来源:逅弈逐码 最近一直在连载Spring Cloud Alibaba基础教程,其中很大一部分内容与Nacos相关.正好也有其他号主也在更新,其中部 ...

  6. nacos 配置_阿里巴巴 Nacos 分布式配置中心原理

    动态配置管理是 Nacos 的三大功能之一,通过动态配置服务,我们可以在所有环境中以集中和动态的方式管理所有应用程序或服务的配置信息. 动态配置中心可以实现配置更新时无需重新部署应用程序和服务即可使相 ...

  7. Apollo配置中心原理简介

    配置中心发展背景 随着程序功能的日益复杂,程序的配置日益增多: 各种功能的开关.参数的配置.服务器的地址-- 对程序配置的期望值也越来越高: 配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善 ...

  8. apollo分布式配置中心原理

    https://github.com/ctripcorp/apollo Apollo阿波罗简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配 ...

  9. 面试官:你分析过mybatis工作原理吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样 ...

最新文章

  1. golang 短连接和长连接 超时处理
  2. SecureCRT上传和下载文件(下载默认目录)
  3. python处理pdf实例_python 使用pdfminer3k 读取PDF文档的例子
  4. C++树的层次遍历(附完整源码)
  5. struts通过Ajax返回数据时,例如对象类型,没有执行Ajax的回调函数
  6. qt4.7 mysql 6.3 版本_详解Qt 4.7编译和访问Mysql驱动
  7. oracle数据库查询表的列
  8. sql server2000中如何自动杀死死锁进程
  9. 刘强东凌晨发内部信:取消底薪不是为了降低工资
  10. 矩阵广义逆求解(QR、svd、LU)
  11. Memset、Memcpy、Strcpy 的作用和区别(转)
  12. Visual Studio 2012安装VASSISTX插件后导致CPU高的解决的方法
  13. 在中国云市场淘金?看国际云大佬如何“软着陆”
  14. T(n) = 25T(n/5)+n^2的时间复杂度?
  15. vue监听浏览器进入页面_vue禁止浏览器F5进行刷新和监听浏览器刷新事件
  16. windows清理_一个Windows系统下好用的内存清理工具
  17. Ubuntu连接WIFI并开启热点
  18. win7计算机右键菜单多,Win7如何清除右键多余菜单?Win7清理右键菜单方法
  19. c#物联网_毕业季我与你招聘信息中移物联网
  20. Ubuntu下与openvpx相关的目录和文件

热门文章

  1. 我认识Linux的小羞愧历史
  2. 反射 字段_详解面试中常考的 Java 反射机制
  3. 半平面交比较好的博客
  4. 荣耀3OS怎么升级鸿蒙系统,华为鸿蒙OS正式发布!教你如何升级
  5. 布局类型java_java – 我们可以为所有屏幕大小制作一种布局类型
  6. 音乐与现代计算机技术,计算机技术在音乐教学中应用与研究.doc
  7. 服务器群装系统,手把手教你安装及配置服务器集群系统
  8. windows服务程序设置为自动 重启后又变为手动启动_系统小技巧:解决Windows无法正常关机的问题...
  9. Java线程-线程八锁
  10. ajax提交无反应,IE中jquery.form中ajax提交没反应解决方法分享