由于最近有一些组件上容器;原组件中有一些黑白名单及日志级别设置的配置,容器下修改配置不方便重启等原因,决定使用一下apollo拉取配置功能;
apollo
apollo页面的使用就比较简单,这里就不介绍了;
主要需要了解如下几个概念
"appId" 配置的应用名
"cluster"环境名,一般默认dev
"namespaceName" 命名空间,一个应用下可以有多个空间名称
"ip" 后端apollo地址,一般web为8080,后端为8070;
使用
程序中主要使用的是github.com/apolloconfig/agollo包
使用过程如下
(1)初始化apollo配置
主要有如下方法
a,初始化文件方式;
默认会读取AGOLLO_CONF环境变量设置的配置位置,如果AGOLLO_CONF没有设置,会默认读取appConfigFile位置配置,默认为当前目录app.properties
//InitFileConfig 使用文件初始化配置
func InitFileConfig() *config.AppConfig {
// default use application.properties
if initConfig, err := InitConfig(nil); err == nil {
return initConfig
}
return nil
}
默认app.properties可设置如下:
{
"appId": "test",
"cluster": "dev",
"namespaceName": "application",
"ip": "http://localhost:8888",
"backupConfigPath":""
}
b,代码中初始化
注意,如果NamespaceName有多个,则以英文,隔开
c := &config.AppConfig{
AppID: "agollo-test",
Cluster: "dev",
IP: "http://106.54.227.205:8080",
NamespaceName: "testyml.yml",
IsBackupConfig: false,
Secret: "7c2ddeb1cd344b8b8db185b3d8641e7f",
}
(2) 根据配置,应用名,命名空间等链接远端初始化;
// StartWithConfig 根据配置启动
func StartWithConfig(loadAppConfig func() (*config.AppConfig, error)) (Client, error) {
(3) 根据初始化后的client获取远端配置,设置到本地
根据client,此处可以自行构建;其中appcfg为设置的apollo配置;
//设置配置
FromApoloSetCurcfg(client, appcfg)
func FromApoloSetCurcfg(client agollo.Client, c *config.AppConfig) {
namespaces := strings.Split(c.NamespaceName, ",")
for _, namespace := range namespaces {
cache := client.GetConfigCache(namespace)
//日志设置
level, _ := cache.Get("log.level")
fmt.Println(level)
path, err := cache.Get("log.path")
fmt.Println(path)
//设置kafka
addrs, _ := cache.Get("kafka.addrs")
fmt.Println(addrs)
topic, _ := cache.Get("kafka.topic")
fmt.Println(topic)
num, _ := cache.Get("kafka.producernum")
fmt.Println(num)
}
}
(4)设置监听配置变化,变化事件
主要是如下两个方法;
由于主要是监听配置变化,就无须写事件变化的处理了;但是ChangeListener还是要保持OnChange方法
type ChangeListener struct {
}
func (c *ChangeListener) OnChange(changeEvent *storage.ChangeEvent) {
}
func (c *ChangeListener) OnNewestChange(event *storage.FullChangeEvent) {
//write your code here
namespaces := strings.Split(appcfg.NamespaceName, ",")
namespacemap := make(map[string]bool)
for _, namespace := range namespaces {
namespacemap[namespace] = true
}
//检查想监听的配置
if _, ok := namespacemap[event.Namespace]; ok {
newlogleve, ok := event.Changes["log.level"]
if ok {
newloglevel, _ := newlogleve.(string)
fmt.Println(newloglevel)
}
}
}
完整demo如下
package main
import (
"fmt"
"strings"
"log"
apollolog "github.com/apolloconfig/agollo/v4/component/log"
"github.com/apolloconfig/agollo/v4/env"
"github.com/apolloconfig/agollo/v4/env/config"
"github.com/apolloconfig/agollo/v4/storage"
)
type ChangeListener struct {
}
func main(){
//读取环境中apollo配置
appcfg = env.InitFileConfig()
if appcfg == nil {
return
}
//初始化apollo中日志
agollo.SetLogger(&apollolog.DefaultLogger{})
//根据apollo配置,得到apollo client
client, _ = agollo.StartWithConfig(func() (*config.AppConfig, error) {
return appcfg, nil
})
//设置监听对象
c := &ChangeListener{}
//添加监听
client.AddChangeListener(c)
log.Println("init success")
//初次读取配置
FromApoloSet(client, appcfg)
select{}
}
func FromApoloSetCurcfg(client agollo.Client, c *config.AppConfig) {
namespaces := strings.Split(c.NamespaceName, ",")
for _, namespace := range namespaces {
cache := client.GetConfigCache(namespace)
//日志设置
level, _ := cache.Get("log.level")
fmt.Println(level)
path, err := cache.Get("log.path")
fmt.Println(path)
//设置kafka
addrs, _ := cache.Get("kafka.addrs")
fmt.Println(addrs)
topic, _ := cache.Get("kafka.topic")
fmt.Println(topic)
num, _ := cache.Get("kafka.producernum")
fmt.Println(num)
}
}
func (c *ChangeListener) OnChange(changeEvent *storage.ChangeEvent) {
}
func (c *ChangeListener) OnNewestChange(event *storage.FullChangeEvent) {
//write your code here
namespaces := strings.Split(appcfg.NamespaceName, ",")
namespacemap := make(map[string]bool)
for _, namespace := range namespaces {
namespacemap[namespace] = true
}
//检查想监听的配置
if _, ok := namespacemap[event.Namespace]; ok {
newlogleve, ok := event.Changes["log.level"]
if ok {
newloglevel, _ := newlogleve.(string)
fmt.Println(newloglevel)
}
}
}