前言
微服务项目开发中,随着功能日益复杂,服务中的配置项随之增多,如果使用传统的配置文件方式来控制配置项,这种做法虽然简单,但是非常的不灵活,多个服务对应多套配置文件,并且如果需要修改配置时,还需要登录到服务所在的机器或容器内部进行修改。另外实际的项目中可能会有一部分配置是公用的配置项,如果涉及到修改公用配置需要修改所有配置文件中的公用配置项。所以需要有一个平台对配置项来做统一的管理,配置中心应运而生。本文以 Apollo 分布式配置中心为了,为大家简单演示如何在 kratos 中接入配置中心。
使用 Apollo 接入 Kratos
什么是 Apollo
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
阿波罗配置中心主要有以下特性:
- 可以统一管理不同平台和环境的配置
- 配置支持热更新
- 配置版本管理
- 灰度发布
- 权限、审核、审计
- 客户端配置信息监控
部署 Apollo 环境
在部署 Apollo 我们可以直接使用 quick start 或者分布式部署,本文为了演示效果,将采用 quick start 的方式进行部署,分布式部署可以查看 Apollo 文档 分布式部署章节。
克隆项目
$ git clone https://github.com/apolloconfig/apollo.git
运行项目
$ cd apollo/scripts/docker-quick-start/
$ docker-compose up -d
创建应用
- 在浏览器中打开
http://localhost:8070
进入 Apollo 的配置中心页面,输入账号密码(默认账号密码为 apollo/admin ) - 点击创建项目按钮,创建如下项目
- 创建一些配置项
- 点击发布按钮,发布配置
- 点击 管理密钥 在 dev 环境中添加一个访问密钥,并修改为启用状态
Kratos Apollo 插件
Apache Dubbo / apollo PMC 邹部长为 Kratos 贡献了 Apollo 插件代码。
邹部长,某电商公司任职资深软件工程师。从事服务端开发工作十多年,做过后端研发,也做过业务架构。擅长多语言微服务技术体系以及电商业务系统研发。Apache Dubbo 与 apollo PMC,曾参与过多个知名开源项目,Apache Dubbo、Apache Dubbo-go、apollo、MOSN 等。
引入插件
go get -u github.com/go-kratos/kratos/config/apollo/v2
# 也可以在代码中直接引入,然后通过 go mod 获取依赖
创建 config 对象
使用刚才创建的项目信息来创建 config 对象
c := config.New(
config.WithSource(
apollo.NewSourceWithConfig(
apollo.WithAppID("kratos"),
apollo.WithCluster("dev"),
apollo.WithEndpoint("http://localhost:8080"),
apollo.WithNamespace("application"),
apollo.WithEnableBackup(),
apollo.WithSecret("895da1a174934ababb1b1223f5620a45"),
),
),
)
加载配置
在使用配置之前需要先加载配置
// 使用 Load 方法加载配置
if err := c.Load(); err != nil {
panic(err)
}
通过 Value 获取配置
// 传入配置项的 key 名称
name, err := c.Value("name").String()
if err != nil {
panic(err)
}
# output
name: 神奇的包子
将配置绑定到结构体上
// 定义一个结构体来接收配置
var v struct {
Name string `json:"name"`
Version string `json:"version"`
}
// 使用 Scan 方法将配置绑定到结构体上
if err := c.Scan(&v); err != nil {
panic(err)
}
#output
config: {Name:神奇的包子 Version:0.0.1}
监听配置变化
if err := c.Watch("name", func(key string, value config.Value) {
name, err := value.String()
if err != nil {
panic(err)
}
log.Printf("config changed: %s = %s\n", key, name)
}); err != nil {
panic(err)
}
在 apollo 中修改配置,并发布
# output
config changed: name = 不是很神奇的包子