|
@@ -157,11 +157,18 @@ func DestoryServiceMeta(ip string, port int32) {
|
|
|
func ApplyWithNotUse(serviceName string) (string, string, error) {
|
|
|
txn := mdb.Txn(true)
|
|
|
defer txn.Commit()
|
|
|
- item, err := txn.First("servicemeta", "name_used", serviceName, false)
|
|
|
+ //TODO 这个框架的First,多列索引有问题,换种思路实现
|
|
|
+ rs, err := txn.Get("servicemeta", "name", serviceName)
|
|
|
if err != nil {
|
|
|
log.Fatalln("applywithnotuse error ", err.Error())
|
|
|
return "", "", errors.New("没有可用服务")
|
|
|
}
|
|
|
+ filter := memdb.NewFilterIterator(rs, seqFilterFactory())
|
|
|
+ item := filter.Next()
|
|
|
+ if item == nil {
|
|
|
+ log.Fatalln("applywithnotuse error 找不到可用服务")
|
|
|
+ return "", "", errors.New("没有可用服务")
|
|
|
+ }
|
|
|
sm := item.(*ServiceMeta)
|
|
|
sm.Used = true
|
|
|
sm.LastUseTime = time.Now().Unix()
|
|
@@ -196,17 +203,13 @@ func ApplyWithRandom(serviceName string) (string, string, error) {
|
|
|
if err != nil {
|
|
|
return "", "", errors.New("没有可用服务")
|
|
|
}
|
|
|
- addrs := map[string]bool{}
|
|
|
+ addrs := make([][2]string, 0, 0)
|
|
|
for obj := rs.Next(); obj != nil; obj = rs.Next() {
|
|
|
meta := obj.(*ServiceMeta)
|
|
|
- addrs[meta.Addr] = true
|
|
|
- }
|
|
|
- addrArray := make([]string, 0, 0)
|
|
|
- for k, _ := range addrs {
|
|
|
- addrArray = append(addrArray, k)
|
|
|
+ addrs = append(addrs, [2]string{meta.Addr, meta.Id})
|
|
|
}
|
|
|
- index := rand.Intn(len(addrArray))
|
|
|
- return addrArray[index], "", nil
|
|
|
+ index := rand.Intn(len(addrs))
|
|
|
+ return addrs[index][0], addrs[index][1], nil
|
|
|
}
|
|
|
|
|
|
//释放资源
|
|
@@ -214,8 +217,7 @@ func Release(serviceId string) {
|
|
|
txn := mdb.Txn(true)
|
|
|
defer txn.Commit()
|
|
|
item, err := txn.First("servicemeta", "id", serviceId)
|
|
|
- if err != nil {
|
|
|
- log.Fatalln("release error", err.Error())
|
|
|
+ if err != nil || item == nil {
|
|
|
return
|
|
|
}
|
|
|
sm := item.(*ServiceMeta)
|
|
@@ -273,6 +275,17 @@ func timeoutFilterFactory(timeout int64) func(interface{}) bool {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+//过滤器工厂
|
|
|
+func seqFilterFactory() func(interface{}) bool {
|
|
|
+ return func(raw interface{}) bool {
|
|
|
+ obj, ok := raw.(*ServiceMeta)
|
|
|
+ if !ok {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return obj.Used
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
//
|
|
|
//func main() {
|
|
|
// InitDb()
|