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.
87 lines
1.8 KiB
87 lines
1.8 KiB
6 years ago
|
package paladin
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"flag"
|
||
|
|
||
|
"github.com/bilibili/Kratos/pkg/log"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// DefaultClient default client.
|
||
|
DefaultClient Client
|
||
|
confPath string
|
||
|
vars = make(map[string][]Setter) // NOTE: no thread safe
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
flag.StringVar(&confPath, "conf", "", "default config path")
|
||
|
}
|
||
|
|
||
|
// Init init config client.
|
||
|
func Init() (err error) {
|
||
|
if confPath != "" {
|
||
|
DefaultClient, err = NewFile(confPath)
|
||
|
} else {
|
||
|
// TODO: config service
|
||
|
return
|
||
|
}
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
go func() {
|
||
|
for event := range DefaultClient.WatchEvent(context.Background()) {
|
||
|
if event.Event != EventUpdate && event.Event != EventAdd {
|
||
|
continue
|
||
|
}
|
||
|
if sets, ok := vars[event.Key]; ok {
|
||
|
for _, s := range sets {
|
||
|
if err := s.Set(event.Value); err != nil {
|
||
|
log.Error("paladin: vars:%v event:%v error(%v)", s, event, err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Watch watch on a key. The configuration implements the setter interface, which is invoked when the configuration changes.
|
||
|
func Watch(key string, s Setter) error {
|
||
|
v := DefaultClient.Get(key)
|
||
|
str, err := v.Raw()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := s.Set(str); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
vars[key] = append(vars[key], s)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// WatchEvent watch on multi keys. Events are returned when the configuration changes.
|
||
|
func WatchEvent(ctx context.Context, keys ...string) <-chan Event {
|
||
|
return DefaultClient.WatchEvent(ctx, keys...)
|
||
|
}
|
||
|
|
||
|
// Get return value by key.
|
||
|
func Get(key string) *Value {
|
||
|
return DefaultClient.Get(key)
|
||
|
}
|
||
|
|
||
|
// GetAll return all config map.
|
||
|
func GetAll() *Map {
|
||
|
return DefaultClient.GetAll()
|
||
|
}
|
||
|
|
||
|
// Keys return values key.
|
||
|
func Keys() []string {
|
||
|
return DefaultClient.GetAll().Keys()
|
||
|
}
|
||
|
|
||
|
// Close close watcher.
|
||
|
func Close() error {
|
||
|
return DefaultClient.Close()
|
||
|
}
|