6 Commits

Author SHA1 Message Date
e384306728 更新 'go.mod' 2022-05-25 18:46:00 +08:00
LeeX
1a0b2e62cc 2022-05-13 16:47:58 +08:00
YoyoFx
5b276dc208 Merge pull request #2 from yoyofxteam/dev
readme update
2021-07-30 11:15:35 +08:00
yoyofx
e39cfe4cdd notify event on remote config changed 2021-07-30 11:07:27 +08:00
YoyoFx
14b8a67811 Merge pull request #1 from yoyofxteam/dev
notify event on remote config changed
2021-07-30 09:44:59 +08:00
yoyofx
887c8e78ea notify event on remote config changed 2021-07-29 19:30:03 +08:00
8 changed files with 126 additions and 42 deletions

19
.gitignore vendored Normal file
View File

@@ -0,0 +1,19 @@
### Go template
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
.idea
vendor/
logs
go.sum

View File

@@ -3,7 +3,7 @@
Golang configuration,use to Viper reading from remote Nacos config systems. Viper remote for Naocs. Golang configuration,use to Viper reading from remote Nacos config systems. Viper remote for Naocs.
```go ```go
runtime_viper := viper.New() config_viper := viper.New()
remote.SetOptions(&remote.Option{ remote.SetOptions(&remote.Option{
Url: "localhost", Url: "localhost",
@@ -14,13 +14,30 @@ remote.SetOptions(&remote.Option{
Auth: nil, Auth: nil,
}) })
remote_viper := viper.New()
err := remote_viper.AddRemoteProvider("nacos", "localhost", "") err := remote_viper.AddRemoteProvider("nacos", "localhost", "")
remote_viper.SetConfigType("yaml") remote_viper.SetConfigType("yaml")
err = remote_viper.ReadRemoteConfig() //sync get remote configs to remote_viper instance memory . for example , remote_viper.GetString(key)
_ = remote_viper.ReadRemoteConfig() //sync get remote configs to remote_viper instance memory . for example , remote_viper.GetString(key) if err == nil {
_ = remote_viper.WatchRemoteConfigOnChannel() //async watch , auto refresh configs. config_viper = remote_viper
fmt.Println("used remote viper")
provider := remote.NewRemoteProvider("yaml")
respChan := provider.WatchRemoteConfigOnChannel(config_viper)
appName := remote_viper.GetString("key") // sync get config by key go func(rc <-chan bool) {
for {
<-rc
fmt.Printf("remote async: %s", config_viper.GetString("yoyogo.application.name"))
}
}(respChan)
}
fmt.Println(appName) go func() {
for {
time.Sleep(time.Second * 30) // delay after each request
appName = config_viper.GetString("yoyogo.application.name")
fmt.Println("sync:" + appName)
}
}()
``` ```

View File

@@ -1,6 +1,7 @@
package nacos_viper_remote package nacos_viper_remote
import ( import (
"bytes"
"fmt" "fmt"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
@@ -16,9 +17,9 @@ func NewRemoteProvider(configType string) *ViperRemoteProvider {
configSet: "yoyogo.cloud.discovery.metadata"} configSet: "yoyogo.cloud.discovery.metadata"}
} }
func (provider *ViperRemoteProvider) GetProvider(runtime_viper *viper.Viper) *viper.Viper { func (provider *ViperRemoteProvider) GetProvider(runtimeViper *viper.Viper) *viper.Viper {
var option *Option var option *Option
err := runtime_viper.Sub(provider.configSet).Unmarshal(&option) err := runtimeViper.Sub(provider.configSet).Unmarshal(&option)
if err != nil { if err != nil {
panic(err) panic(err)
return nil return nil
@@ -32,7 +33,7 @@ func (provider *ViperRemoteProvider) GetProvider(runtime_viper *viper.Viper) *vi
remote_viper.SetConfigType(provider.configType) remote_viper.SetConfigType(provider.configType)
err = remote_viper.ReadRemoteConfig() err = remote_viper.ReadRemoteConfig()
if err == nil { if err == nil {
err = remote_viper.WatchRemoteConfigOnChannel() //err = remote_viper.WatchRemoteConfigOnChannel()
if err == nil { if err == nil {
fmt.Println("used remote viper") fmt.Println("used remote viper")
return remote_viper return remote_viper
@@ -40,5 +41,22 @@ func (provider *ViperRemoteProvider) GetProvider(runtime_viper *viper.Viper) *vi
} else { } else {
panic(err) panic(err)
} }
return runtime_viper return runtimeViper
}
func (provider *ViperRemoteProvider) WatchRemoteConfigOnChannel(remoteViper *viper.Viper) <-chan bool {
updater := make(chan bool)
respChan, _ := viper.RemoteConfig.WatchChannel(DefaultRemoteProvider())
go func(rc <-chan *viper.RemoteResponse) {
for {
b := <-rc
reader := bytes.NewReader(b.Value)
_ = remoteViper.ReadConfig(reader)
// configuration on changed
updater <- true
}
}(respChan)
return updater
} }

View File

@@ -2,8 +2,8 @@ package main
import ( import (
"fmt" "fmt"
remote "github.com/Echo7659/nacos-viper-remote"
"github.com/spf13/viper" "github.com/spf13/viper"
remote "github.com/yoyofxteam/nacos-viper-remote"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
@@ -32,14 +32,21 @@ func main() {
remote_viper := viper.New() remote_viper := viper.New()
err := remote_viper.AddRemoteProvider("nacos", "localhost", "") err := remote_viper.AddRemoteProvider("nacos", "localhost", "")
remote_viper.SetConfigType("yaml") remote_viper.SetConfigType("yaml")
err = remote_viper.ReadRemoteConfig() err = remote_viper.ReadRemoteConfig()
if err == nil { if err == nil {
err = remote_viper.WatchRemoteConfigOnChannel() config_viper = remote_viper
if err == nil { fmt.Println("used remote viper")
config_viper = remote_viper provider := remote.NewRemoteProvider("yaml")
fmt.Println("used remote viper") respChan := provider.WatchRemoteConfigOnChannel(config_viper)
}
go func(rc <-chan bool) {
for {
<-rc
fmt.Printf("remote async: %s", config_viper.GetString("yoyogo.application.name"))
}
}(respChan)
} }
appName := config_viper.GetString("yoyogo.application.name") appName := config_viper.GetString("yoyogo.application.name")
@@ -50,7 +57,7 @@ func main() {
for { for {
time.Sleep(time.Second * 30) // delay after each request time.Sleep(time.Second * 30) // delay after each request
appName = config_viper.GetString("yoyogo.application.name") appName = config_viper.GetString("yoyogo.application.name")
fmt.Println(appName) fmt.Println("sync:" + appName)
} }
}() }()

6
go.mod
View File

@@ -1,8 +1,8 @@
module github.com/yoyofxteam/nacos-viper-remote module git.echol.cn/loser/nacos-viper-remote
go 1.14 go 1.14
require ( require (
github.com/nacos-group/nacos-sdk-go v1.0.7 github.com/nacos-group/nacos-sdk-go/v2 v2.0.0
github.com/spf13/viper v1.8.1 github.com/spf13/viper v1.10.1
) )

View File

@@ -2,11 +2,11 @@ package nacos_viper_remote
import ( import (
"fmt" "fmt"
"github.com/nacos-group/nacos-sdk-go/clients" "github.com/nacos-group/nacos-sdk-go/v2/clients"
"github.com/nacos-group/nacos-sdk-go/clients/config_client" "github.com/nacos-group/nacos-sdk-go/v2/clients/config_client"
"github.com/nacos-group/nacos-sdk-go/common/constant" "github.com/nacos-group/nacos-sdk-go/v2/common/constant"
"github.com/nacos-group/nacos-sdk-go/common/logger" "github.com/nacos-group/nacos-sdk-go/v2/common/logger"
"github.com/nacos-group/nacos-sdk-go/vo" "github.com/nacos-group/nacos-sdk-go/v2/vo"
"github.com/spf13/viper" "github.com/spf13/viper"
"strings" "strings"
) )
@@ -30,8 +30,8 @@ func NewNacosConfigManager(option *Option) (*nacosConfigManager, error) {
NamespaceId: option.NamespaceId, NamespaceId: option.NamespaceId,
TimeoutMs: 5000, TimeoutMs: 5000,
NotLoadCacheAtStart: true, NotLoadCacheAtStart: true,
RotateTime: "1h", LogDir: "logs/nacos/log",
MaxAge: 3, CacheDir: "logs/nacos/cache",
LogLevel: "info", LogLevel: "info",
} }
@@ -44,10 +44,7 @@ func NewNacosConfigManager(option *Option) (*nacosConfigManager, error) {
clientConfig.SecretKey = option.Auth.SecretKey clientConfig.SecretKey = option.Auth.SecretKey
clientConfig.OpenKMS = option.Auth.OpenKMS clientConfig.OpenKMS = option.Auth.OpenKMS
} }
client, err := clients.CreateConfigClient(map[string]interface{}{ client, err := clients.NewConfigClient(vo.NacosClientParam{ClientConfig: &clientConfig, ServerConfigs: serverConfigs})
"serverConfigs": serverConfigs,
"clientConfig": clientConfig,
})
if err != nil { if err != nil {
logger.Error(err.Error()) logger.Error(err.Error())
return nil, err return nil, err

28
nacosprovider.go Normal file
View File

@@ -0,0 +1,28 @@
package nacos_viper_remote
type nacosRemoteProvider struct {
provider string
endpoint string
path string
secretKeyring string
}
func DefaultRemoteProvider() *nacosRemoteProvider {
return &nacosRemoteProvider{provider: "nacos", endpoint: "localhost", path: "", secretKeyring: ""}
}
func (rp nacosRemoteProvider) Provider() string {
return rp.provider
}
func (rp nacosRemoteProvider) Endpoint() string {
return rp.endpoint
}
func (rp nacosRemoteProvider) Path() string {
return rp.path
}
func (rp nacosRemoteProvider) SecretKeyring() string {
return rp.secretKeyring
}

View File

@@ -7,17 +7,20 @@ import (
"io" "io"
) )
var nacosOptions = &Option{} //var nacosOptions = &Option{}
func SetOptions(option *Option) { func SetOptions(option *Option) {
nacosOptions = option manager, _ := NewNacosConfigManager(option)
viper.SupportedRemoteProviders = []string{"nacos"}
viper.RemoteConfig = &remoteConfigProvider{ConfigManager: manager}
} }
type remoteConfigProvider struct { type remoteConfigProvider struct {
ConfigManager *nacosConfigManager
} }
func (rc *remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) { func (rc *remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) {
cmt, err := getConfigManager(rp) cmt, err := rc.getConfigManager(rp)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -37,7 +40,7 @@ func (rc *remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error
} }
func (rc *remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.RemoteResponse, chan bool) { func (rc *remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.RemoteResponse, chan bool) {
cmt, err := getConfigManager(rp) cmt, err := rc.getConfigManager(rp)
if err != nil { if err != nil {
return nil, nil return nil, nil
} }
@@ -52,15 +55,10 @@ func (rc *remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *v
return nil, nil return nil, nil
} }
func getConfigManager(rp viper.RemoteProvider) (interface{}, error) { func (rc *remoteConfigProvider) getConfigManager(rp viper.RemoteProvider) (interface{}, error) {
if rp.Provider() == "nacos" { if rp.Provider() == "nacos" {
return NewNacosConfigManager(nacosOptions) return rc.ConfigManager, nil
} else { } else {
return nil, errors.New("The Nacos configuration manager is not supported!") return nil, errors.New("The Nacos configuration manager is not supported!")
} }
} }
func init() {
viper.SupportedRemoteProviders = []string{"nacos"}
viper.RemoteConfig = &remoteConfigProvider{}
}