-
Notifications
You must be signed in to change notification settings - Fork 0
/
resolver.go
89 lines (73 loc) · 1.71 KB
/
resolver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package loadbalance
import (
"context"
"sync"
// "fmt"
"log"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/attributes"
"google.golang.org/grpc/resolver"
"github.com/bd878/gallery/server/api"
)
type Resolver struct {
mu sync.Mutex
clientConn resolver.ClientConn
resolverConn *grpc.ClientConn
}
var _ resolver.Builder = (*Resolver)(nil)
func (r *Resolver) Build(
target resolver.Target,
cc resolver.ClientConn,
_ resolver.BuildOptions,
) (resolver.Resolver, error) {
var err error
r.clientConn = cc
r.resolverConn, err = grpc.Dial(
target.Endpoint(),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
return nil, err
}
r.ResolveNow(resolver.ResolveNowOptions{})
return r, nil
}
const Name = "messages"
func (r *Resolver) Scheme() string {
return Name
}
func init() {
resolver.Register(&Resolver{})
}
var _ resolver.Resolver = (*Resolver)(nil)
func (r *Resolver) ResolveNow(resolver.ResolveNowOptions) {
r.mu.Lock()
defer r.mu.Unlock()
client := api.NewMessagesServiceClient(r.resolverConn)
ctx := context.Background()
res, err := client.GetServers(ctx, &api.GetMessagesServersRequest{})
if err != nil {
return
}
var addrs []resolver.Address
for _, server := range res.Servers {
addrs = append(addrs, resolver.Address{
Addr: server.RpcAddr,
Attributes: attributes.New(
"is_leader",
server.IsLeader,
),
})
}
r.clientConn.UpdateState(resolver.State{
Endpoints: []resolver.Endpoint{{
Addresses: addrs,
}},
})
}
func (r *Resolver) Close() {
if err := r.resolverConn.Close(); err != nil {
log.Println(err)
}
}