66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
![]() |
package etcd
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"github.com/fox/fox/log"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
type resultT[T any] struct {
|
||
|
Value T
|
||
|
Err error
|
||
|
}
|
||
|
|
||
|
type Registry[T INode] struct {
|
||
|
*etcdRegistryImpl
|
||
|
nodes sync.Map
|
||
|
}
|
||
|
|
||
|
func NewRegistry[T INode](endpoints []string, rootKey, username, password string) (*Registry[T], error) {
|
||
|
var err error
|
||
|
e := &Registry[T]{}
|
||
|
e.etcdRegistryImpl, err = newServiceRegistryImpl(endpoints, rootKey, username, password, e.saveNode)
|
||
|
return e, err
|
||
|
}
|
||
|
|
||
|
func (e *Registry[T]) Register(node INode) error {
|
||
|
bs, err := json.Marshal(node)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return e.etcdRegistryImpl.Register(node.EtcdKey(), string(bs))
|
||
|
}
|
||
|
|
||
|
// 获取当前服务
|
||
|
func (sr *Registry[T]) saveNode(jsonBytes []byte) {
|
||
|
var tmp = resultT[T]{Err: nil}
|
||
|
if err := json.Unmarshal(jsonBytes, &tmp.Value); err != nil {
|
||
|
log.ErrorF(err.Error())
|
||
|
}
|
||
|
sr.nodes.Store(tmp.Value.MapKey(), tmp.Value)
|
||
|
}
|
||
|
|
||
|
// 获取当前根节点下所有节点信息
|
||
|
func (sr *Registry[T]) GetNodes() []T {
|
||
|
var nodes []T
|
||
|
sr.nodes.Range(func(k, v interface{}) bool {
|
||
|
nodes = append(nodes, v.(T))
|
||
|
return true
|
||
|
})
|
||
|
return nodes
|
||
|
}
|
||
|
|
||
|
// 获取当前根节点下所有节点信息
|
||
|
func (sr *Registry[T]) FindNode(key string) (T, error) {
|
||
|
var tmp = resultT[T]{Err: nil}
|
||
|
v, ok := sr.nodes.Load(key)
|
||
|
if !ok {
|
||
|
return tmp.Value, fmt.Errorf("%v not exist", key)
|
||
|
}
|
||
|
if tmp.Value, ok = v.(T); ok {
|
||
|
return tmp.Value, nil
|
||
|
}
|
||
|
return tmp.Value, fmt.Errorf("%v 类型转换失败", key)
|
||
|
}
|