mirror of
https://github.com/charlienet/go-mixed.git
synced 2025-07-18 00:22:41 +08:00
config
This commit is contained in:
7
configure/config.toml
Normal file
7
configure/config.toml
Normal file
@ -0,0 +1,7 @@
|
||||
Mode = "dev"
|
||||
|
||||
[Nacos]
|
||||
Address = "192.168.2.121"
|
||||
Port = 8848
|
||||
Namespace = "8560b58d-87d0-4b85-8ac5-f2d308c6669e"
|
||||
Group = "dev"
|
44
configure/configure.go
Normal file
44
configure/configure.go
Normal file
@ -0,0 +1,44 @@
|
||||
package configure
|
||||
|
||||
import (
|
||||
"github.com/charlienet/go-mixed/expr"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
type Configure interface {
|
||||
GetString(string, string) string
|
||||
}
|
||||
|
||||
type NotifyFunc func(Configure)
|
||||
|
||||
type conf struct {
|
||||
viper *viper.Viper //
|
||||
nacos *nacos //
|
||||
onChangeNotifies map[string][]NotifyFunc // 已经注册的配置变更通知
|
||||
nacosOptions *NacosOptions //
|
||||
useNacos bool //
|
||||
}
|
||||
|
||||
func (c *conf) GetString(key string, defaultValue string) string {
|
||||
if c.viper.IsSet(key) {
|
||||
return c.viper.GetString(key)
|
||||
}
|
||||
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
func (c *conf) GetInt(key string, defaultValue int) int {
|
||||
return expr.Ternary(c.viper.IsSet(key), c.viper.GetInt(key), defaultValue)
|
||||
}
|
||||
|
||||
func (c *conf) Load(dataId string, v any, onChanged ...NotifyFunc) error {
|
||||
if err := c.nacos.Load(dataId, v); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(onChanged) > 0 {
|
||||
c.onChangeNotifies[dataId] = onChanged
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
100
configure/configure_builder.go
Normal file
100
configure/configure_builder.go
Normal file
@ -0,0 +1,100 @@
|
||||
package configure
|
||||
|
||||
import (
|
||||
"github.com/fsnotify/fsnotify"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
func New() *conf { return &conf{viper: viper.New(), onChangeNotifies: make(map[string][]NotifyFunc)} }
|
||||
|
||||
func (c *conf) AddConfigPath(in ...string) *conf {
|
||||
for _, v := range in {
|
||||
c.viper.AddConfigPath(v)
|
||||
}
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *conf) SetConfigName(in string) *conf {
|
||||
c.viper.SetConfigName(in)
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *conf) SetConfigFile(f string) *conf {
|
||||
c.viper.SetConfigFile(f)
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *conf) SetDefault(key string, value any) *conf {
|
||||
c.viper.SetDefault(key, value)
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *conf) AutomaticEnv() *conf {
|
||||
c.viper.AutomaticEnv()
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *conf) Read() (*conf, error) {
|
||||
// 从本地配置读取
|
||||
if err := c.viper.ReadInConfig(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
c.viper.WatchConfig()
|
||||
c.viper.OnConfigChange(c.OnViperChanged)
|
||||
|
||||
// 初始化Nacos客户端
|
||||
if err := c.createNacosClient(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (c *conf) OnViperChanged(in fsnotify.Event) {
|
||||
|
||||
}
|
||||
|
||||
func (c *conf) createNacosClient() error {
|
||||
opt := c.getNacosOptions()
|
||||
if opt == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
nc, err := createNacosClient(opt.Address, opt.Port, opt.Namespace, opt.Group)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c.nacos = &nacos{client: nc, group: opt.Group, onChanged: c.onNacosChanged}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *conf) onNacosChanged(dataId, data string) {
|
||||
if fs, ok := c.onChangeNotifies[dataId]; ok {
|
||||
for _, f := range fs {
|
||||
if f != nil {
|
||||
f(c)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *conf) getNacosOptions() *NacosOptions {
|
||||
if c.nacosOptions != nil {
|
||||
return c.nacosOptions
|
||||
}
|
||||
|
||||
if c.useNacos {
|
||||
return &NacosOptions{
|
||||
Address: c.GetString(AddressKey, "127.0.0.1"),
|
||||
Port: c.GetInt(PortKey, 8848),
|
||||
Namespace: c.GetString(Namespace, ""),
|
||||
Group: c.GetString(Group, ""),
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
42
configure/configure_test.go
Normal file
42
configure/configure_test.go
Normal file
@ -0,0 +1,42 @@
|
||||
package configure_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/charlienet/go-mixed/configure"
|
||||
"github.com/charlienet/go-mixed/json"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestLoadSpecifiedFile(t *testing.T) {
|
||||
conf, err := configure.New().SetConfigFile("config.toml").Read()
|
||||
t.Log(err)
|
||||
|
||||
assert.Equal(t, "192.168.2.121", conf.GetString("nacos.address", ""))
|
||||
_ = conf
|
||||
}
|
||||
|
||||
func TestNewConfigure(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
func TestNacos(t *testing.T) {
|
||||
conf, err := configure.
|
||||
New().
|
||||
AddConfigPath(".").
|
||||
WithNacos().
|
||||
Read()
|
||||
|
||||
assert.Nil(t, err)
|
||||
|
||||
t.Log(conf.GetString("nacos.address", ""))
|
||||
|
||||
type redis struct {
|
||||
Addrs string
|
||||
}
|
||||
|
||||
r := &redis{}
|
||||
|
||||
t.Log(conf.Load("redis", r))
|
||||
t.Log(json.StructToJsonIndent(r))
|
||||
}
|
96
configure/nacos.go
Normal file
96
configure/nacos.go
Normal file
@ -0,0 +1,96 @@
|
||||
package configure
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/nacos-group/nacos-sdk-go/v2/clients"
|
||||
"github.com/nacos-group/nacos-sdk-go/v2/clients/config_client"
|
||||
"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
|
||||
"github.com/nacos-group/nacos-sdk-go/v2/vo"
|
||||
)
|
||||
|
||||
const (
|
||||
AddressKey = "Nacos.Address"
|
||||
PortKey = "Nacos.Port"
|
||||
Namespace = "Nacos.Namespace"
|
||||
Group = "Nacos.Group"
|
||||
)
|
||||
|
||||
type nacos struct {
|
||||
client config_client.IConfigClient
|
||||
onChanged func(string, string)
|
||||
group string
|
||||
}
|
||||
|
||||
type NacosOptions struct {
|
||||
Address string
|
||||
Port int
|
||||
Namespace string
|
||||
Group string
|
||||
}
|
||||
|
||||
func (c *conf) WithNacosOptions(options *NacosOptions) *conf {
|
||||
c.nacosOptions = options
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *conf) WithNacos() *conf {
|
||||
c.useNacos = true
|
||||
return c
|
||||
}
|
||||
|
||||
func (n *nacos) Load(dataId string, v any) error {
|
||||
voParam := vo.ConfigParam{
|
||||
DataId: dataId,
|
||||
Group: n.group,
|
||||
OnChange: n.onChange,
|
||||
}
|
||||
|
||||
content, err := n.client.GetConfig(voParam)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(content) == 0 {
|
||||
return fmt.Errorf("parameters not configured:%s", dataId)
|
||||
}
|
||||
|
||||
if err := json.Unmarshal([]byte(content), v); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
n.client.ListenConfig(voParam)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n *nacos) onChange(namespace, group, dataId, data string) {
|
||||
n.onChanged(dataId, data)
|
||||
}
|
||||
|
||||
func createNacosClient(addr string, port int, namespace, group string) (config_client.IConfigClient, error) {
|
||||
sc := []constant.ServerConfig{{
|
||||
IpAddr: addr,
|
||||
Port: uint64(port),
|
||||
}}
|
||||
|
||||
cc := constant.ClientConfig{
|
||||
NamespaceId: namespace,
|
||||
TimeoutMs: 5000,
|
||||
LogDir: "logs",
|
||||
CacheDir: "cache",
|
||||
LogLevel: "info",
|
||||
NotLoadCacheAtStart: true,
|
||||
}
|
||||
|
||||
configClient, err := clients.CreateConfigClient(map[string]any{
|
||||
"serverConfigs": sc,
|
||||
"clientConfig": cc,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return configClient, nil
|
||||
}
|
Reference in New Issue
Block a user