155 lines
3.0 KiB
Go
155 lines
3.0 KiB
Go
package koanf_nacos_provider
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/nacos-group/nacos-sdk-go/clients"
|
|
"github.com/nacos-group/nacos-sdk-go/clients/config_client"
|
|
"github.com/nacos-group/nacos-sdk-go/common/constant"
|
|
"github.com/nacos-group/nacos-sdk-go/vo"
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
type Config struct {
|
|
Host string
|
|
Port uint64
|
|
NamespaceId string
|
|
Group string
|
|
ConfigName string
|
|
}
|
|
|
|
type Nacos struct {
|
|
client config_client.IConfigClient
|
|
config Config
|
|
}
|
|
|
|
// validateConfig
|
|
// @description: validate config
|
|
// @param config
|
|
// @return error
|
|
func validateConfig(config *Config) error {
|
|
if config.Host == "" {
|
|
return errors.New("host is empty")
|
|
}
|
|
if config.Port <= 0 {
|
|
return errors.New("port is empty")
|
|
}
|
|
if config.NamespaceId == "" {
|
|
config.NamespaceId = "public"
|
|
}
|
|
if config.Group == "" {
|
|
config.Group = "DEFAULT_GROUP"
|
|
}
|
|
if config.ConfigName == "" {
|
|
return errors.New("config name is empty")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Provider
|
|
// @description: create nacos provider
|
|
// @param config
|
|
// @return *Nacos
|
|
func Provider(config Config) *Nacos {
|
|
|
|
// validate config
|
|
if err := validateConfig(&config); err != nil {
|
|
return nil
|
|
}
|
|
|
|
// create nacos config client
|
|
clientConf := constant.ClientConfig{
|
|
NamespaceId: config.NamespaceId,
|
|
TimeoutMs: 5000,
|
|
NotLoadCacheAtStart: true,
|
|
LogLevel: "error",
|
|
}
|
|
serverConfigs := []constant.ServerConfig{
|
|
{
|
|
IpAddr: config.Host,
|
|
ContextPath: "/nacos",
|
|
Port: config.Port,
|
|
},
|
|
}
|
|
|
|
nclient, err := clients.NewConfigClient(vo.NacosClientParam{
|
|
ClientConfig: &clientConf,
|
|
ServerConfigs: serverConfigs,
|
|
})
|
|
|
|
// create client failed
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
return &Nacos{nclient, config}
|
|
}
|
|
|
|
// Read
|
|
// @description: read config from remote
|
|
// @receiver n
|
|
// @return map[string]interface{}
|
|
// @return error
|
|
func (n Nacos) Read() (result map[string]interface{}, err error) {
|
|
if n.client == nil {
|
|
return nil, errors.New("nacos client is nil")
|
|
}
|
|
|
|
data, err := n.client.GetConfig(vo.ConfigParam{
|
|
DataId: n.config.ConfigName,
|
|
Group: n.config.Group,
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err = yaml.Unmarshal([]byte(data), &result); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// ReadBytes
|
|
// @description: read config from remote
|
|
// @receiver n
|
|
// @return result
|
|
// @return err
|
|
func (n Nacos) ReadBytes() (result []byte, err error) {
|
|
if n.client == nil {
|
|
return nil, errors.New("nacos client is nil")
|
|
}
|
|
|
|
data, err := n.client.GetConfig(vo.ConfigParam{
|
|
DataId: n.config.ConfigName,
|
|
Group: n.config.Group,
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return []byte(data), nil
|
|
}
|
|
|
|
// Watch
|
|
// @description: watch config change
|
|
// @receiver n
|
|
// @param cb
|
|
// @return error
|
|
func (n Nacos) Watch(cb func(event interface{}, err error)) error {
|
|
if n.client == nil {
|
|
return errors.New("nacos client is nil")
|
|
}
|
|
|
|
err := n.client.ListenConfig(vo.ConfigParam{
|
|
DataId: n.config.ConfigName,
|
|
Group: n.config.Group,
|
|
OnChange: func(namespace, group, dataId, data string) {
|
|
cb(data, nil)
|
|
},
|
|
})
|
|
|
|
return err
|
|
}
|