Files
koanf-nacos-provider/nacos.go

155 lines
3.0 KiB
Go
Raw Normal View History

2023-12-21 14:53:54 +08:00
package koanf_nacos_provider
2023-12-21 14:27:05 +08:00
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
2024-01-03 10:36:20 +08:00
func Provider(config Config) (*Nacos, error) {
2023-12-21 14:27:05 +08:00
// validate config
if err := validateConfig(&config); err != nil {
2024-01-03 10:36:20 +08:00
return nil, err
2023-12-21 14:27:05 +08:00
}
// 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 {
2024-01-03 10:36:20 +08:00
return nil, err
2023-12-21 14:27:05 +08:00
}
2024-01-03 10:36:20 +08:00
return &Nacos{nclient, config}, nil
2023-12-21 14:27:05 +08:00
}
// 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
}