agollo 是Apollo的 Golang 客戶端java
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。git
若是在使用 golang 重構 java 的過程當中,使用到了分佈式配置中心 Apollo,那麼最快的方式就是使用原來的配置,保持最平滑的遷移,這個時候你就須要一個 Apollo 的 golang 客戶端,agollo 能夠是你的一個選擇。github
go get -u github.com/zouyx/agollo/v3@latest
複製代碼
go.modgolang
require github.com/zouyx/agollo/v3 latest
複製代碼
執行json
go mod tidy
複製代碼
import緩存
import (
"github.com/zouyx/agollo/v3"
)
複製代碼
FAQbash
Apollo 客戶端依賴於 AppId,Environment 等環境信息來工做,因此請確保閱讀下面的說明而且作正確的配置:app
加載優先級:框架
會覆蓋app.properties
中配置,在調用Start方法以前調用異步
readyConfig:=&AppConfig{
AppId:"test1",
Cluster:"dev1",
NamespaceName:"application1",
Ip:"localhost:8889",
}
InitCustomConfig(func() (*AppConfig, error) {
return readyConfig,nil
})
複製代碼
類配置 agollo 的 demo:
package main
import (
"fmt"
"github.com/zouyx/agollo/v3"
"github.com/zouyx/agollo/v3/env/config"
)
func InitAgolloConfig() error {
readyConfig := &config.AppConfig{
AppID: "test",
Cluster: "default",
NamespaceName: "application",
IP: "localhost:8080",
}
agollo.InitCustomConfig(func() (*config.AppConfig, error) {
return readyConfig, nil
})
err := agollo.Start()
if err != nil {
fmt.Errorf("%v", err)
return err
}
return nil
}
func main(){
//Init Apollo
err := config.InitAgolloConfig()
if err != nil {
fmt.Errorf("初始化Apollo失敗", err)
panic(err)
}
fmt.Println("初始化Apollo配置成功")
//Use your apollo key to test
value := agollo.GetStringValue("key", "")
fmt.Println(value)
}
複製代碼
Linux/Mac
export AGOLLO_CONF=/a/conf.properties
複製代碼
Windows
set AGOLLO_CONF=c:/a/conf.properties
複製代碼
配置文件內容與app.properties內容同樣
1.開發:請確保 app.properties 文件存在於workingdir目錄下
2.打包後:請確保 app.properties 文件存在於與打包程序同級目錄下,參考1.3.必要配置。
目前只支持json形式,其中字段包括:
appId :應用的身份信息,是從服務端獲取配置的一個重要信息。
cluster :須要鏈接的集羣,默認default
namespaceName :命名空間,默認:application(具體定義參考:namespace),多namespace使用英文逗號分割, 非key/value配置(json,properties,yml等),則配置爲:namespace.文件類型。如:namespace.json
ip :Apollo的CONFIG_SERVICE的ip,非META_SERVICE地址
配置例子以下:
通常配置
{
"appId": "test",
"cluster": "dev",
"namespaceName": "application",
"ip": "localhost:8888"
}
複製代碼
多namespace配置
{
"appId": "test",
"cluster": "dev",
"namespaceName": "application, applications1",
"ip": "localhost:8888"
}
複製代碼
非key/value namespace配置
{
"appId": "test",
"cluster": "dev",
"namespaceName": "application.json,a.yml",
"ip": "localhost:8888"
}
複製代碼
參考:
場景:啓動程序不依賴加載Apollo的配置。
func main() {
go agollo.Start()
}
複製代碼
場景:啓動程序依賴加載 Apollo 的配置。例:初始化程序基礎配置。
func main() {
agollo.Start()
}
複製代碼
func main() {
agollo.StartWithLogger(loggerInterface)
}
複製代碼
func main() {
agollo.StartWithCache(cacheInterface)
}
複製代碼
func main() {
agollo.SetLogger(loggerInterface)
agollo.SetCache(cacheInterface)
agollo.Start()
}
複製代碼
func main() {
event := agollo.ListenChangeEvent()
changeEvent := <-event
bytes, _ := json.Marshal(changeEvent)
fmt.Println("event:", string(bytes))
}
複製代碼
agollo.GetStringValue(Key,DefaultValue)
複製代碼
agollo.GetIntValue(Key,DefaultValue)
複製代碼
agollo.GetFloatValue(Key,DefaultValue)
複製代碼
agollo.GetBoolValue(Key,DefaultValue)
複製代碼
config := agollo.GetConfig(namespace)
複製代碼
config.GetStringValue(Key,DefaultValue)
複製代碼
config.GetIntValue(Key,DefaultValue)
複製代碼
config.GetFloatValue(Key,DefaultValue)
複製代碼
config.GetBoolValue(Key,DefaultValue)
複製代碼
複製如下代碼至項目中,並在其中引用日誌組件的方法進行打印 log
type DefaultLogger struct {
}
func (this *DefaultLogger)Debugf(format string, params ...interface{}) {
}
func (this *DefaultLogger)Infof(format string, params ...interface{}) {
}
func (this *DefaultLogger)Warnf(format string, params ...interface{}) error {
return nil
}
func (this *DefaultLogger)Errorf(format string, params ...interface{}) error {
return nil
}
func (this *DefaultLogger)Debug(v ...interface{}) {
}
func (this *DefaultLogger)Info(v ...interface{}){
}
func (this *DefaultLogger)Warn(v ...interface{}) error{
return nil
}
func (this *DefaultLogger)Error(v ...interface{}) error{
return nil
}
複製代碼
啓動
func main() {
agollo.SetLogger(&DefaultLogger{})
agollo.Start()
}
複製代碼
//DefaultCache 默認緩存
type DefaultCache struct {
defaultCache sync.Map
}
//Set 獲取緩存
func (d *DefaultCache)Set(key string, value []byte, expireSeconds int) (err error) {
d.defaultCache.Store(key,value)
return nil
}
//EntryCount 獲取實體數量
func (d *DefaultCache)EntryCount() (entryCount int64){
count:=int64(0)
d.defaultCache.Range(func(key, value interface{}) bool {
count++
return true
})
return count
}
//Get 獲取緩存
func (d *DefaultCache)Get(key string) (value []byte, err error){
v, ok := d.defaultCache.Load(key)
if !ok{
return nil,errors.New("load default cache fail")
}
return v.([]byte),nil
}
//Range 遍歷緩存
func (d *DefaultCache)Range(f func(key, value interface{}) bool){
d.defaultCache.Range(f)
}
//Del 刪除緩存
func (d *DefaultCache)Del(key string) (affected bool) {
d.defaultCache.Delete(key)
return true
}
//Clear 清除全部緩存
func (d *DefaultCache)Clear() {
d.defaultCache=sync.Map{}
}
//DefaultCacheFactory 構造默認緩存組件工廠類
type DefaultCacheFactory struct {
}
//Create 建立默認緩存組件
func (d *DefaultCacheFactory) Create()CacheInterface {
return &DefaultCache{}
}
複製代碼
agollo.SetCache(&DefaultCacheFactory{})
agollo.Start()
複製代碼
官方資訊*最新技術*獨家解讀