package etcd import ( "encoding/json" "fmt" "github.com/fox/fox/log" "sync" ) type Registry[T INode] struct { *etcdRegistryImpl nodes *sync.Map me T } 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 } e := &Registry[T]{} e.etcdRegistryImpl, err = newServiceRegistryImpl(endpoints, me.EtcdRootKey(), username, password, e, me.EtcdKey(), string(bs)) e.nodes = &sync.Map{} return e, err } // 保存当前服务 func (r *Registry[T]) saveNode(newNodes *sync.Map, jsonBytes []byte) { var tmp = new(T) if err := json.Unmarshal(jsonBytes, tmp); err != nil { log.ErrorF(err.Error()) } newNodes.Store((*tmp).MapKey(), *tmp) } // 保存当前服务 func (r *Registry[T]) replace(newNodes *sync.Map) { r.nodes = newNodes } // 获取当前根节点下所有节点信息 func (r *Registry[T]) GetNodes() *sync.Map { return r.nodes } // 根据inode的mapKey()查找对应的节点 func (r *Registry[T]) FindNode(key string) (T, error) { var tmp = new(T) v, ok := r.nodes.Load(key) if !ok { return *tmp, fmt.Errorf("%v not exist", key) } if node, ok := v.(T); ok { return node, nil } return *tmp, fmt.Errorf("%v 类型转换失败", key) }