一、配置文件初始化
(1) 定义结构体
首先,需要在代码中定义结构体,每一个结构体对应apollo配置中心的namespace
配置中心对应的namespace如下
(2) 配置映射关系
其次,在执行apollo之前,需要配置namespace与所定义结构体的映射关系
其中AddConfig为自定义的函数,主要功能为将结构体加入到所定义的map结构体nameSpaceCache中,该变量存储所有的配置信息,键为namespace,值为配置文件结构体,具体实现如下:
函数SetWeaklyTyped主要是设置弱类型检查标签,便于后续判断是否需要类型还换,代码如下:
小结:在配置文件初始化阶段,apollo配置了多少个namespace,就需要在代码中定义其相对应的结构体,然后分别调用AddConfig和SetWeaklyTyped函数进行初始化,采用全局变量nameSpaceCache存储映射关系。
二、应用集群初始化
(1) 定义集群yaml文件
由于不同的环境集群对应不同的配置信息,所以可以在程序中定义yaml文件用于存储不同应用下集群对应的基本配置信息,包括appID、namespace等信息,如下所示:
(2) 读取yaml文件
依据定义好的yaml文件路径并通过os.ReadFile()函数读取信息,定义envs结构体变量存储不同环境下的配置,使yaml.Unmarshal()函数将读取到的字节切片(即配置文件的内容)解析到 envs 变量中。然后通过传入具体的集群环境env将当前环境下的配置信息复制给config,cfg。
三、连接apollo配置中心
(1) 客户端实例创建
agollo是一个用于在 Go 应用中集成 Apollo 配置中心的库,agollo.new()函数用于初始化一个与 Apollo 配置中心交互的客户端。你需要提供必要的配置参数,如 URL(apollo服务器地址)、应用程序 ID (appID)等。函数返回一个 Apollo 客户端实例,可以使用这个实例来获取和监听配置的变化。在如下代码示例中,客户端实例表示为a。
(2) 获取配置信息
通过a.GetNameSpace函数 (agollo库函数)获取所连接的详细配置信息
遍历nameSpaceCache(存储映射关系的全局变量),代码如下:
通过判断集合weaklyTypeNameSpaces(弱类型集合)是否包含有namespace,然后执行transformApolloValueWithWeaklyType函数,将通过a.GetNameSpace(namespace)获取到的配置信息进行转换。
(3) 配置信息转换
函数transformApolloValueWithWeaklyType实现信息转换,mapstructure是一个用于将Go的map[string]interface{}或其他类似结构转换为Go结构体的库。
用mapstructure.NewDecoder函数来创建一个新的Decoder
WeaklyTypedInput: true:表示允许进行弱类型转换
Result: &structValue:解码后的结果要存储到 structValue 所指向的位置,这里使用了指针来确保能直接修改原始的接口值所对应的实际结构体
小结:到第三步为止,连接apollo获取配置信息已经完成,在程序中可以根据结构体中的键获取信息,例如:config.HarbcDb.Uri
四、配置更新监听
apollo除了集中化管理和多环境支持优点外,最重要的是支持动态更新,即:应用无需重启即可动态获取和应用新的配置,极大地提高了系统的灵活性和可维护性。
(1) 在go语言中,可以通过goRoutine协程和agollo库中的Watch()监听函数实现,代码如下
(2) 通过go关键字启动了一个新的并发协程来监控 apollo 配置的修改情况,并将实例 a 对象传递给 watchApollo函数进行处理,watchApollo代码如下
首先通过a.Start()函数启动与配置中心的连接,然后使用a.Watch()函数进行监听,该函数返回一个通道(channel),通过这个通道可以接收配置变更的通知。当 Apollo 中的配置发生更改时,相关的变更信息会被发送到这个通道中,以便进行实时监听。
select语句表示会等待从 watch 通道接收到数据。当接收到数据时,会将数据赋值给 resp 变量,并执行 onChange 函数来处理接收到的配置变更信息。
(3) onchange函数代码和3.2章节中的函数类似,进行数据转换,代码如下
小结:配置更新的监听主要结合goRoutine+watch函数实现,这样可以在程序执行其他操作的同时,后台持续监控 Apollo 配置的修改,实现动态更新。
五、总结
本文从配置文件初始化、应用集群初始化、连接apollo配置中心和配置更新监听四个方面总结了基于go语言的apollo应用实例,为go或其他语言的配置搭建提供了一种思路。