You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.6 KiB
81 lines
1.6 KiB
package config |
|
|
|
import ( |
|
"context" |
|
"path/filepath" |
|
"strings" |
|
|
|
"github.com/nacos-group/nacos-sdk-go/clients/config_client" |
|
"github.com/nacos-group/nacos-sdk-go/vo" |
|
|
|
"github.com/go-kratos/kratos/v2/config" |
|
) |
|
|
|
type Option func(*options) |
|
|
|
type options struct { |
|
group string |
|
dataID string |
|
} |
|
|
|
// WithGroup With nacos config group. |
|
func WithGroup(group string) Option { |
|
return func(o *options) { |
|
o.group = group |
|
} |
|
} |
|
|
|
// WithDataID With nacos config data id. |
|
func WithDataID(dataID string) Option { |
|
return func(o *options) { |
|
o.dataID = dataID |
|
} |
|
} |
|
|
|
type Config struct { |
|
opts options |
|
client config_client.IConfigClient |
|
} |
|
|
|
func NewConfigSource(client config_client.IConfigClient, opts ...Option) config.Source { |
|
_options := options{} |
|
for _, o := range opts { |
|
o(&_options) |
|
} |
|
return &Config{client: client, opts: _options} |
|
} |
|
|
|
func (c *Config) Load() ([]*config.KeyValue, error) { |
|
content, err := c.client.GetConfig(vo.ConfigParam{ |
|
DataId: c.opts.dataID, |
|
Group: c.opts.group, |
|
}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
k := c.opts.dataID |
|
return []*config.KeyValue{ |
|
{ |
|
Key: k, |
|
Value: []byte(content), |
|
Format: strings.TrimPrefix(filepath.Ext(k), "."), |
|
}, |
|
}, nil |
|
} |
|
|
|
func (c *Config) Watch() (config.Watcher, error) { |
|
watcher := newWatcher(context.Background(), c.opts.dataID, c.opts.group, c.client.CancelListenConfig) |
|
err := c.client.ListenConfig(vo.ConfigParam{ |
|
DataId: c.opts.dataID, |
|
Group: c.opts.group, |
|
OnChange: func(_, group, dataId, data string) { |
|
if dataId == watcher.dataID && group == watcher.group { |
|
watcher.content <- data |
|
} |
|
}, |
|
}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return watcher, nil |
|
}
|
|
|