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-05 15:31:11 +08:00
|
|
|
e.nodes = &sync.Map{}
|
2025-06-17 18:24:33 +08:00
|
|
|
e.etcdRegistryImpl, err = newServiceRegistryImpl(endpoints, me.EtcdRootKey(), username, password, e, me.EtcdKey(), string(bs))
|
|
|
|
|
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) {
|
2025-06-17 18:24:33 +08:00
|
|
|
//log.DebugF("更新前.nodes ptr:%d", &r.nodes)
|
2025-06-05 15:31:11 +08:00
|
|
|
r.nodes = newNodes
|
2025-06-17 18:24:33 +08:00
|
|
|
//r.nodes.Range(func(key, value interface{}) bool {
|
|
|
|
// bV, _ := json.Marshal(value)
|
|
|
|
// log.DebugF("has node key:%s value:%s", key, string(bV))
|
|
|
|
// return true
|
|
|
|
//})
|
|
|
|
//log.DebugF("更新所有节点信息.nodes ptr:%d", &r.nodes)
|
2025-05-25 20:02:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// 获取当前根节点下所有节点信息
|
2025-06-17 18:24:33 +08:00
|
|
|
func (r *Registry[T]) RangeNode(cb func(key string, value *T) bool) {
|
|
|
|
//log.DebugF("循环处理.nodes ptr:%d", &r.nodes)
|
|
|
|
r.nodes.Range(func(key, value interface{}) bool {
|
|
|
|
k, _ := key.(string)
|
|
|
|
if node, ok := value.(T); ok {
|
|
|
|
return cb(k, &node)
|
|
|
|
} else {
|
|
|
|
//log.DebugF("转换失败.key:%v", key)
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
})
|
2025-05-25 20:02:15 +08:00
|
|
|
}
|
|
|
|
|
2025-05-28 17:52:28 +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
|
|
|
}
|