一个合格的配置中心应该具备的素质我一直觉得配置中心很重要,因为它在灰度发布和上线介入中扮演着非常重要的角色。但是好吧,你们都知道我有多懒,所以我没有好好看看。今天,我就借此机会和大家聊一聊一个合格的配置中心应该具备的素质。首先什么是配置?如何获取配置?为什么需要实时更改配置?为什么需要配置中心配置中心的分层有必要吗?有多少种方式可以实时更改配置?配置中心还有哪些基本素质?实时推送配置中心的架构是怎样的?01.首先什么是配置?我的理解是,配置是一个可变的、频繁出现的点,同一个程序在不同的场景和环境下表现不同。配置在启动时以各种形式获取。一般来说,整个生命过程中的配置都是只读的,程序不会主动去改变它。只有当其他地方改变时,才会触发程序改变。最经典的配置有两种,一种是数值型的,比如客户授信额度的比例。一种是Bool类型,用于禁用或启用某些功能。publicclassconfiguration{privateintNUMBER_CONFIG=5;privatebooleanSWITCH_CONFIG=true;publicvoidconfig(){if(SWITCH_CONFIG){System.out.println("YES");}System.out.println("printYES"+NUMBER_CONFIG);}}02、配置有怎么弄?获取配置的方式不超过五种。HardCode、配置文件、环境变量、数据库获取、启动参数、外部服务器获取。啦啦啦我上面写的一堆东西来自HardCode。什么是HardCode,就是那种写的硬得像铁一样的代码,一辈子都点不开。配置文件,哎,配置文件一般用的比较多,比如Spring的application.xml,someFool.properties。环境变量,嗯,操作系统上的环境变量,比如JAVA_HOME。数据库获取就是在启动的时候或者每隔一段时间就到数据库去钓鱼。启动参数是启动时取的参数。例如java-jarstart.jar大。最后一个大的是启动参数,也是配置项的一种。从外部服务器获取意味着该配置项由其他系统维护。比如存款准备金,就是超级中心养马维护的一个配置项。所有中小企业都必须去养马领取。03.为什么需要实时更改配置?人都是善变的,别问我为什么。..老板昨天说我们有钱,就给客户的爸爸打钱吧,一个订单的15%。今天发现钱包撑不住了,就跟我说车前草先生,不管你做什么,你赶紧关掉这个功能,我不想出版本了,所以我需要实时更改配置。就这么简单,人就是善变的。04.为什么需要配置中心?一申请两申请都可以。如果有100个应用,我真不知道怎么管理。实时推送配置项成了一个大问题。有几种传统的和主流的配置项管理实践。更改代码并重新打包(傻瓜)更改配置项并重新启动。(老实说,这很奇怪)更改数据库并重新启动。(同)换数据库定时获取。(浪费资源,一直轮询,需要一定时间才能生效)我只能说时间太长太浪费了,30秒到60分钟不等(不要问我为什么它是60分钟,因为有一些白痴应用程序启动时间太长了)。那么有一个配置中心来帮你管理这些东西,不是吗?05、配置中心是否需要分层?现在主流的配置中心都会分层,什么都有。有的想一台机器管理,有的集群只能统一配置。其实只有下面几个维度就够了,应用维度,集群维度,机器维度。有了这三个维度,基本可以满足99.9999%的需求。如果你发现不能满足,那你说的不在我的范围之内。(笑)06.实时更改配置有几种方式?广义来说有两种,一种是定时拉动,而是实时推送。定时拉取包括:数据库定时拉取、外部服务器定时拉取、共享配置文件定时读取。实时推送包括:使用kafka等消息队列作为消费端进行消费,使用webSocket、http或rpc接口作为服务端接收推送。07、配置中心还有哪些基本素质?分区推送可以作为A/BTest的一种手段,也可以用来防止配置错误。审批一般来说,配置变更不是小事,还是有审批链的。环境识别对于DEV开发环境、STG测试环境、PRD生产环境,需要能够针对不同的环境读取不同的配置项。持久化有时候配置中心会挂掉,但是这个时候应该不会影响应用,所以应该有一个持久化机制来保证服务恢复后的数据问题。监控用户可以实时知道发布在哪里,哪些机器是新配置,哪些机器是旧配置,以及基于版本的实时回滚功能。操作审计会对所有的配置操作都有操作记录,以供后期监控审计。08.实时推送配置中心的架构是怎样的?最简单的配置中心架构如上。用户发布配置修改,配置中心通知应用更新,应用获取最新配置。说的详细点,分为客户端和配置中心两种方式。客户端启动应用的同事需要启动一个服务,专门用来接收配置中心的通知。这个服务可以是Kafka、RocketMQ、WebSocket、RPC、DUBBO等,可以作为服务对外提供接口,主动提供给配置中心注册自己。提供服务后,开始扫描你需要的配置项,并根据配置主动从本地(本地开发模式)读取或从配置中心获取对应环境的配置项。读取完成后放入内存,配置的读取全部从内存中读取。对于JAVA来说,可能是静态变量,也可能是HashMap。如果配置中心通知有变化,直接读取新值替换内存中的配置项就可以了。配置中心配置中心要做的就是根据用户的操作发布配置项,并通过调用客户端提供的接口或者发送消息的方式通知客户端更新消息,或者直接推送更新的配置项。非常简单但非常有用。
