跳到主要内容

Apollo配置中心

介绍

Apollo是由携程框架部门研发并开源的企业级分布式配置管理平台。自2016年开源以来,已成为业界标杆级的配置中心解决方案,在GitHub上获得超过2.7万星标,并被451家企业在生产环境中广泛应用,充分验证了其稳定性和实用性。

快速开始

1. 安装Apollo组件

使用Gone框架的命令行工具一键安装:

gonectl install goner/apollo
提示

gonectl是Gone框架的官方命令行工具,用于快速安装和管理框架组件。

如需安装gonectl,请参考:gonectl安装指南

2. 卸载Viper组件(可选)

如果您之前安装了goner/viper,建议先进行卸载以避免冲突:

gonectl install goner/apollo

在弹出的选择界面中,取消勾选"github.com/gone-io/goner/viper.Load",然后确认执行。

viper卸载界面

3. 配置Apollo连接

默认配置文件

创建config/default.*文件(支持yaml、json、toml、properties格式):

config/default.yaml
apollo:
appId: SampleApp # 应用标识符
cluster: default # 集群名称
ip: http://127.0.0.1:8080 # Apollo服务器地址
namespace: application,test.yml # 命名空间列表,多个用逗号分隔
secret: c946bca94cc041a08354233a1ef9f94a # 访问密钥
isBackupConfig: false # 是否启用配置备份
watch: true # 是否监听配置变化
useLocalConfIfKeyNotExist: true # Key不存在时是否使用本地配置

环境特定配置

可创建环境相关配置文件:config/${env}.*

配置说明

Apollo相关配置属于本地配置范畴,详细规则请参考本地配置文档

配置参数详解

参数名称功能说明默认值是否必填
appId在Apollo中注册的应用唯一标识
cluster集群环境标识,用于区分不同部署环境default
ipApollo配置服务的访问地址
namespace命名空间配置,支持多个空间同时管理application
secret应用访问Apollo的安全密钥
isBackupConfig是否在本地备份远程配置true
watch是否启用配置变更实时监听false
useLocalConfIfKeyNotExist远程配置缺失时是否回退到本地配置true

快速体验

通过模板快速创建Apollo集成项目:

gonectl create -t config/center/apollo apollo-demo

高级功能

动态配置监听

启用配置监听

首先在配置文件中开启监听功能:

apollo:
watch: true

自动配置更新

使用指针类型接收配置注入,实现配置变更时的自动更新:

type DatabaseConfig struct {
gone.Flag
Host *string `gone:"config,key=db.host"`
Port *int `gone:"config,key=db.port"`
Username *string `gone:"config,key=db.username"`
}

主动监听配置变化

通过gone.ConfWatcher实现对特定配置项的变化监听:

type ConfigManager struct {
gone.Flag
watcher gone.ConfWatcher `gone:"*"`
}

func (c *ConfigManager) Init() {
// 监听数据库连接配置变化
c.watcher("db.host", func(oldVal, newVal any) {
log.Printf("数据库地址从 %v 变更为 %v", oldVal, newVal)
// 在此处理配置变更逻辑,如重建连接池等
})

// 监听多个配置项
c.watcher("cache.redis.addr", func(oldVal, newVal any) {
log.Printf("Redis地址配置更新: %v -> %v", oldVal, newVal)
})
}

多命名空间管理

配置多命名空间

在Apollo管理控制台中合理规划命名空间结构,然后在配置文件中指定:

apollo:
namespace: application,database.yml,redis.properties,mq.json

命名空间优先级

重要提醒
  • 配置多个命名空间时,系统按指定顺序依次加载
  • 当同一配置键在多个命名空间中存在时,后加载的命名空间配置会覆盖前面的
  • 命名空间名称必须包含正确的文件扩展名(如.yml、.properties、.json等)
  • 建议按照配置重要性和覆盖关系合理安排命名空间顺序

最佳实践示例

apollo:
# 推荐的命名空间加载顺序:
# 1. 基础应用配置(最低优先级)
# 2. 数据库配置
# 3. 缓存配置
# 4. 环境特定配置(最高优先级)
namespace: application,database.yml,cache.properties,env-specific.json

通过这种配置方式,可以实现配置的分层管理和灵活覆盖,满足复杂业务场景的配置需求。