golang apollo使用

由于最近有一些组件上容器;原组件中有一些黑白名单及日志级别设置的配置,容器下修改配置不方便重启等原因,决定使用一下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)
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值