package service import ( "fmt" cmap "github.com/orcaman/concurrent-map/v2" "strings" ) const prefixKeyService = "/cluster" func init() { newServiceMgr() } var mgr *serviceMgr type serviceMgr struct { services cmap.ConcurrentMap[string, IService] //rpcMsg cmap.ConcurrentMap[string, *mq.RpcMessage] } func newServiceMgr() { mgr = &serviceMgr{ services: cmap.New[IService](), //rpcMsg: cmap.New[*mq.RpcMessage](), } } func getServiceTypeByName(serviceName string) (string, bool) { names := strings.Split(serviceName, serviceTypeSet) if len(names) > 0 { return names[0], true } return "", false } func FindServiceByType(serviceType string) []IService { services := make([]IService, 0) mgr.services.IterCb(func(key string, service IService) { if type_, ok := getServiceTypeByName(key); ok && type_ == serviceType { services = append(services, service) } }) return services } func FindServiceByName(serviceName string) (IService, bool) { return mgr.services.Get(serviceName) } //func Send(msg *Message, src, dst string) error { // if s, ok := FindServiceByName(src); ok { // return s.Send(msg, dst) // } // return fmt.Errorf("src service:%v is not exist", src) //} //func Call(funcName, src, dst string, duration time.Duration, args ...interface{}) ([]interface{}, error) { // if s, ok := FindServiceByName(src); ok { // return s.Call(funcName, dst, duration, args...) // } // return nil, fmt.Errorf("src service:%v is not exist", src) //} func etcdServiceName(serviceType, serviceName string) string { return fmt.Sprintf("%v/%v/%v", prefixKeyService, serviceType, serviceName) } func registerService(s IService) { mgr.services.Set(s.Name(), s) } func unregisterService(name string) { if s, ok := mgr.services.Get(name); ok { s.NotifyStop() mgr.services.Remove(name) s.WaitStop() } }