80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
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()
|
|
}
|
|
}
|