使用Viper讀取Nacos配置(開源)

YOYOFx發表於2021-04-30

使用Viper讀取Nacos配置(開源)

一、前言

目前Viper支援的Remote遠端讀取配置如 etcd, consul;目前還沒有對Nacos進行支援,本文中將開源一個Nacos的Viper支援庫, 開源地址在文章的最下方.
實現這個倉庫的主要目的是為了,最終整合到我們的yoyogo框架中。

二、什麼是Viper

Viper是適用於Go應用程式的完整配置解決方案。它被設計用於在應用程式中工作,並且可以處理所有型別的配置需求和格式。

2.1 它支援以下特性:

  • 設定預設值
  • 從JSON、TOML、YAML、HCL、envfile和Java properties格式的配置檔案讀取配置資訊
  • 實時監控和重新讀取配置檔案(可選)
  • 從環境變數中讀取
  • 從遠端配置系統remote(etcd或Consul)讀取並監控配置變化
  • 從命令列引數讀取配置
  • 從buffer讀取配置
  • 顯式配置值

2.2 讀取本地檔案

viper.SetConfigFile("./config.yaml")   // 指定配置檔案路徑
viper.SetConfigName("config")          // 配置檔名稱(無副檔名)
viper.SetConfigType("yaml")            // 如果配置檔案的名稱中沒有副檔名,則需要配置此項
viper.AddConfigPath("/etc/appname/")   // 查詢配置檔案所在的路徑
viper.AddConfigPath("$HOME/.appname")  // 多次呼叫以新增多個搜尋路徑
viper.AddConfigPath(".")               // 還可以在工作目錄中查詢配置
err := viper.ReadInConfig()            // 查詢並讀取配置檔案
if err != nil {                        // 處理讀取配置檔案的錯誤
	panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

本篇文章重點著重於remote部分,Nacos的支援.

Viper remote

在Viper中啟用遠端支援,需要在程式碼中匿名匯入viper/remote這個包。

import _ "github.com/spf13/viper/remote"

通過remote,Viper將支援讀取從Key/Value儲存( 例如etcd或Consul或本文中的Nacos ).

Viper載入配置值的優先順序

磁碟上的配置檔案 > 命令列標誌位 > 環境變數 > 遠端Key/Value儲存 > 預設值

Nacos 支援

引用我們的開源庫 https://github.com/yoyofxteam/nacos-viper-remote

import (
	"github.com/spf13/viper"
	remote "github.com/yoyofxteam/nacos-viper-remote"
)

在專案中使用:

runtime_viper := viper.New()
// 配置 Viper for Nacos 的遠端倉庫引數
remote.SetOptions(&remote.Option{
   Url:         "localhost",            // nacos server 多地址需要地址用;號隔開,如 Url: "loc1;loc2;loc3"
   Port:        80,                     // nacos server埠號
   NamespaceId: "public",               // nacos namespace
   GroupName:   "DEFAULT_GROUP",        // nacos group
   Config: 	remote.Config{ DataId: "config_dev" }, // nacos DataID
   Auth:        nil,                    // 如果需要驗證登入,需要此引數
})

err := remote_viper.AddRemoteProvider("nacos", "localhost", "")
remote_viper.SetConfigType("yaml")

_ = remote_viper.ReadRemoteConfig()             //sync get remote configs to remote_viper instance memory . for example , remote_viper.GetString(key)
_ = remote_viper.WatchRemoteConfigOnChannel()   //非同步監聽Nacos中的配置變化,如發生配置更改,會直接同步到 viper例項中。

appName := remote_viper.GetString("key")   // sync get config by key

fmt.Println(appName)

// 這裡不是必須的,只為了監控Demo中的配置變化,並列印出來
go func() {
    for {
        time.Sleep(time.Second * 30) // 每30秒檢查配置是否發生變化 
        appName = config_viper.GetString("yoyogo.application.name")
        fmt.Println(appName)
    }
}()

最後

實現這個倉庫的主要目的是為了,最終整合到我們的yoyogo框架中。

本文提及的開源庫地址:

nacos-viper-remote

https://github.com/yoyofxteam/nacos-viper-remote

yoyogo

https://github.com/yoyofx/yoyogo

?? YoyoGo is a simple, light and fast , dependency injection based micro-service framework written in Go. Support Nacos ,Consoul ,Etcd ,Eureka ,kubernetes.

相關文章