fox/etcd/etcd.go

59 lines
1.3 KiB
Go
Raw Normal View History

2025-05-25 20:02:15 +08:00
package etcd
import (
"encoding/json"
"fmt"
"github.com/fox/fox/log"
"sync"
)
type Registry[T INode] struct {
*etcdRegistryImpl
2025-06-05 15:31:11 +08:00
nodes *sync.Map
2025-06-16 22:00:26 +08:00
me T
2025-05-25 20:02:15 +08:00
}
2025-06-16 22:00:26 +08:00
func NewRegistry[T INode](endpoints []string, username, password string, me T) (*Registry[T], error) {
bs, err := json.Marshal(me)
if err != nil {
return nil, err
}
2025-05-25 20:02:15 +08:00
e := &Registry[T]{}
2025-06-16 22:00:26 +08:00
e.etcdRegistryImpl, err = newServiceRegistryImpl(endpoints, me.EtcdRootKey(), username, password, e, me.EtcdKey(), string(bs))
2025-06-05 15:31:11 +08:00
e.nodes = &sync.Map{}
2025-05-25 20:02:15 +08:00
return e, err
}
2025-06-05 15:31:11 +08:00
// 保存当前服务
func (r *Registry[T]) saveNode(newNodes *sync.Map, jsonBytes []byte) {
2025-06-16 22:00:26 +08:00
var tmp = new(T)
if err := json.Unmarshal(jsonBytes, tmp); err != nil {
2025-05-25 20:02:15 +08:00
log.ErrorF(err.Error())
}
2025-06-16 22:06:59 +08:00
newNodes.Store((*tmp).MapKey(), *tmp)
2025-06-05 15:31:11 +08:00
}
// 保存当前服务
func (r *Registry[T]) replace(newNodes *sync.Map) {
r.nodes = newNodes
2025-05-25 20:02:15 +08:00
}
// 获取当前根节点下所有节点信息
2025-05-25 23:13:59 +08:00
func (r *Registry[T]) GetNodes() *sync.Map {
2025-06-05 15:31:11 +08:00
return r.nodes
2025-05-25 20:02:15 +08:00
}
// 根据inode的mapKey()查找对应的节点
2025-06-16 22:06:59 +08:00
func (r *Registry[T]) FindNode(key string) (T, error) {
2025-06-16 22:00:26 +08:00
var tmp = new(T)
2025-05-25 23:13:59 +08:00
v, ok := r.nodes.Load(key)
2025-05-25 20:02:15 +08:00
if !ok {
2025-06-16 22:06:59 +08:00
return *tmp, fmt.Errorf("%v not exist", key)
2025-05-25 20:02:15 +08:00
}
2025-06-16 22:06:59 +08:00
if node, ok := v.(T); ok {
return node, nil
2025-05-25 20:02:15 +08:00
}
2025-06-16 22:06:59 +08:00
return *tmp, fmt.Errorf("%v 类型转换失败", key)
2025-05-25 20:02:15 +08:00
}