配置中心的思路就是把服务的各种配置,如代码里配置的各种参数、服务降级的开关甚至依赖的资源等都在一个地方统一进行管理。服务启动时,可以自动从配置中心中拉取所需的配置,并且如果有配置变更的情况,同样可以自动从配置中心拉取最新的配置信息,服务无须重新发布。
具体来讲,配置中心一般包含下面几个功能:配置注册功能、配置反注册功能、配置查看功能、配置变更订阅功能。那么配置中心的功能是如何实现的。
1、配置存储结构
一般来讲,配置中心存储配置是按照 Group 来存储的,同一类配置放在一个 Group 下,以 K, V 键值对存储。
2、配置注册
配置中心对外提供接口 /config/service?actinotallow=register 来完成配置注册功能,需要传递的参数包括配置对应的分组 Group,以及对应的 Key、Value 值。比如调用下面接口请求就会向配置项 global.property 中添加 Key 为 reload.locations、Value 为 /data1/confs/system/reload.properties 的配置。
curl "http://ip:port/config/service?actinotallow=register" -d "group=global.property&key=reload.locations&value=/data1/confs/system/reload.properties"
3、配置反注册
配置中心对外提供接口 config/service?actinotallow=unregister 来完成配置反注册功能,需要传递的参数包括配置对象的分组 Group,以及对应的 Key。比如调用下面的接口请求就会从配置项 global.property 中把 Key 为 reload.locations 的配置删除。
curl "http://ip:port/config/service?actinotallow=unregister"-d "group=global.property&key=reload.locations"
4、配置查看
配置中心对外提供接口 config/service?actinotallow=lookup 来完成配置查看功能,需要传递的参数包括配置对象的分组 Group,以及对应的 Key。比如调用下面的接口请求就会返回配置项 global.property 中 Key 为 reload.locations 的配置值。
curl "http://ip:port/config/service?actinotallow=lookup&group=global.property&key=reload.locations"
5、配置变更订阅
配置中心对外提供接口 config/service?actinotallow=getSign 来完成配置变更订阅接口,客户端本地会保存一个配置对象的分组 Group 的 sign 值,同时每隔一段时间去配置中心拉取该 Group 的 sign 值,与本地保存的 sign 值做对比。一旦配置中心中的 sign 值与本地的 sign 值不同,客户端就会从配置中心拉取最新的配置信息。比如调用下面的接口请求就会返回配置项 global.property 中 Key 为 reload.locations 的配置值。
curl "http://ip:port/config/service?actinotallow=getSign&group=global.property"
配置中心可以便于我们管理服务的配置信息,并且如果要修改配置信息的话,只需要同配置中心交互就可以了,应用程序会通过订阅配置中心的配置,自动完成配置更新。
配置中心的典型应用场景如下:
- 资源服务化。对于大部分互联网业务来说,在应用规模不大的时候,所依赖的资源如 Memcached 缓存或者 MCQ 消息队列的数量也不多,因此对应的资源的 IP 可以直接写在配置里。但是当业务规模发展到一定程度后,所依赖的这些资源的数量也开始急剧膨胀。以某业务为例,核心缓存 Memcached 就有上千台机器,经常会遇到个别机器因为硬件故障而不可用,这个时候如果采用的是本地配置的话,就需要去更改本地配置,把不可用的 IP 改成可用的 IP,然后发布新的配置,这样的过程十分不便。但如果采用资源服务化的话,把对应的缓存统统归结为一类配置,然后如果有个别机器不可用的话,只需要在配置中心把对应的 IP 换成可用的 IP 即可,应用程序会自动同步到本机,也无须发布。
- 业务动态降级。微服务架构下,拆分的服务越多,出现故障的概率就越大,因此需要有对应的服务治理手段,比如要具备动态降级能力,在依赖的服务出现故障的情况下,可以快速降级对这个服务的调用,从而保证不受影响。为此,服务消费者可以通过订阅依赖服务是否降级的配置,当依赖服务出现故障的时候,通过向配置中心下达指令,修改服务的配置为降级状态,这样服务消费者就可以订阅到配置的变更,从而降级对该服务的调用。
- 分组流量切换。前面我提到过,为了保证异地多活以及本地机房调用,一般服务提供者的部署会按照 IDC 维度进行部署,每个 IDC 划分为一个分组,这样的话,如果一个 IDC 出现故障,可以把故障 IDC 机房的调用切换到其他正常 IDC。为此,服务消费者可以通过订阅依赖服务的分组配置,当依赖服务的分组配置发生变更时,服务消费者就对应的把调用切换到新的分组,从而实现分组流量切换。
如果业务比较简单,配置比较少并且不经常变更的话,采用本地配置是最简单的方案,这样的话不需要额外引入配置中心组件;相反,如果业务比较复杂,配置多而且有动态修改配置的需求的话,强烈建议引入配置中心来进行管理,而且最好做到配置变更实时推送给客户端,并且可以通过统一的管理界面来管理配置,这样的话能极大地降低运维的复杂度,减少人为介入,从而提高效率。