Golang与Apollo配置中心
Sat, Jul 18, 2020
阅读时间 2 分钟
Apollo - A reliable configuration management system
Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。
安装(Quick-Start)
Quick-Start 安装 是最简单的安装方案。不过这里需要注意的是,Quick-Start只针对本地测试使用,如果要部署到生产环境,还请另行参考分布式部署指南。
准备工作
Java
Java 1.8+
> java -version
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
MySQL
MySQL 5.6.5+
SHOW VARIABLES WHERE Variable_name = 'version';
下载Quick-Start安装包
项目地址:https://github.com/nobodyiam/apollo-build-scripts
git clone github.com/nobodyiam/apollo-build-scripts
安装步骤
创建数据库
Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。
然后分别导入数据库文件:
source /项目地址/sql/apolloportaldb.sql
source /项目地址/sql/apolloconfigdb.sql
配置数据库连接信息
vim demo.sh
#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用户名
apollo_config_db_password=密码(如果没有密码,留空即可)
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用户名
apollo_portal_db_password=密码(如果没有密码,留空即可)
启动Apollo配置中心
确保端口未被占用
lsof -i:8080
执行启动脚本
./demo.sh start
当看到如下输出后,就说明启动成功了!
==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!
浏览器打开:http://域名或者ip:8070/ 验证安装
Golang-Apollo客户端
安装依赖包
go get -u github.com/shima-park/agollo
使用
官方文档:https://github.com/shima-park/agollo
获取配置
Apollo中的配置:
最简单的获取配置信息:
package main
import (
"fmt"
"github.com/shima-park/agollo"
)
func main() {
a, err := agollo.New("Apollo搭建的ip或者域名:8080", "wpan", agollo.AutoFetchOnCacheMiss())
if err != nil {
panic(err)
}
fmt.Println(
// 配置项foo的value
//a.Get("rabbitmq_url"),
// namespace为test.json的所有配置项
//a.GetNameSpace("test.json"),
// namespace为Service.Mysql的所有配置项
a.GetNameSpace("Service.Mysql"),
// 默认值, 为xxx提供一个默认bar
//a.Get("xxx", agollo.WithDefault("bar")),
// namespace为other_namespace, key为foo的value
//a.Get("foo", agollo.WithNamespace("other_namespace")),
)
}
运行结果:
配置监听
a, err := agollo.New("localhost:8080", "your_appid", agollo.AutoFetchOnCacheMiss())
// error handle...
errorCh := a.Start() // Start后会启动goroutine监听变化,并更新agollo对象内的配置cache
// 或者忽略错误处理直接 a.Start()
watchCh := a.Watch()
for{
select{
case err := <- errorCh:
// handle error
case resp := <-watchCh:
fmt.Println(
"Namesapce:", resp.Namesapce,
"OldValue:", resp.OldValue,
"NewValue:", resp.NewValue,
"Error:", resp.Error,
)
}
}
还有很多用法可以参考官方文档。