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.
59 lines
1.2 KiB
59 lines
1.2 KiB
package discovery |
|
|
|
import ( |
|
"context" |
|
"sig-pub/pkg/zlog" |
|
"strconv" |
|
|
|
"google.golang.org/grpc/resolver" |
|
) |
|
|
|
type Registry interface { |
|
// Registry server instance |
|
Registry(ctx context.Context, server Server) (err error) |
|
} |
|
|
|
type GrpcResolver interface { |
|
DialUrl(serviceName string) string |
|
// Resolver get grpc dial resolver |
|
Resolver() (builder resolver.Builder, err error) |
|
} |
|
|
|
type Resolver interface { |
|
// ResolveAll get service all instance |
|
ResolveAll(ctx context.Context, serviceName string) (servers []Server, err error) |
|
// Watch when service instance change, send current all instances to channel |
|
Watch(ctx context.Context, serviceName string) (ch chan []Server, err error) |
|
} |
|
|
|
type Discovery interface { |
|
Registry |
|
Resolver |
|
GrpcResolver |
|
} |
|
|
|
// Server registry format |
|
type Server struct { |
|
Name string `json:"name"` |
|
Addr string `json:"addr"` // 地址 |
|
Attrs map[string]string `json:"attrs"` // attributes |
|
} |
|
|
|
func (s Server) GetWeight() (weight int) { |
|
weight = 1 |
|
if len(s.Attrs) == 0 { |
|
return |
|
} |
|
|
|
v, ok := s.Attrs["weight"] |
|
if !ok { |
|
return |
|
} |
|
w, err := strconv.Atoi(v) |
|
if err != nil { |
|
zlog.Warning("failed parse discovery server attr weight: ", v) |
|
return |
|
} |
|
weight = w |
|
return |
|
}
|
|
|