You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.4 KiB
72 lines
1.4 KiB
package etcd |
|
|
|
import ( |
|
"encoding/json" |
|
"errors" |
|
"fmt" |
|
"strings" |
|
|
|
"google.golang.org/grpc/resolver" |
|
) |
|
|
|
// Server registry format |
|
type Server struct { |
|
Name string `json:"name"` |
|
Addr string `json:"addr"` // 地址 |
|
Attrs map[string]string `json:"attrs"` // attributes |
|
} |
|
|
|
func SplitPath(path string) (Server, error) { |
|
server := Server{} |
|
strs := strings.Split(path, "/") |
|
if len(strs) == 0 { |
|
return server, errors.New("invalid path") |
|
} |
|
|
|
server.Addr = strs[len(strs)-1] |
|
|
|
return server, nil |
|
} |
|
|
|
// Exist helper function |
|
func Exist(l []resolver.Address, addr resolver.Address) bool { |
|
for i := range l { |
|
if l[i].Addr == addr.Addr { |
|
return true |
|
} |
|
} |
|
|
|
return false |
|
} |
|
|
|
// Remove helper function |
|
func Remove(s []resolver.Address, addr resolver.Address) ([]resolver.Address, bool) { |
|
for i := range s { |
|
if s[i].Addr == addr.Addr { |
|
s[i] = s[len(s)-1] |
|
return s[:len(s)-1], true |
|
} |
|
} |
|
return nil, false |
|
} |
|
|
|
func BuildResolverUrl(app string) string { |
|
return "etcd:///" + app |
|
} |
|
|
|
func BuildPrefix(server Server) string { |
|
return fmt.Sprintf("/%s/", server.Name) |
|
} |
|
|
|
func BuildRegisterPath(server Server) string { |
|
return fmt.Sprintf("%s%s", BuildPrefix(server), server.Addr) |
|
} |
|
|
|
func ParseValue(value []byte) (Server, error) { |
|
server := Server{} |
|
if err := json.Unmarshal(value, &server); err != nil { |
|
return server, err |
|
} |
|
|
|
return server, nil |
|
}
|
|
|