/
builer.go
50 lines (45 loc) · 1.15 KB
/
builer.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
package discov
import (
"fmt"
"github.com/lsm1998/tinygo/pkg/etcdx"
"github.com/sirupsen/logrus"
"go.etcd.io/etcd/client/v3"
"google.golang.org/grpc/resolver"
)
type Builder struct {
watcher *etcdx.Watcher
domain string
}
// NewBuilder TODO 将 client,domain 用 options 包裹起来,以统一写法
func NewBuilder(client *clientv3.Client, domain string) *Builder {
if domain != "" {
logrus.Infof("domain:%s direct connection", domain)
}
r := &Builder{
watcher: etcdx.NewWatcher(client),
domain: domain,
}
resolver.Register(r)
return r
}
func (b *Builder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
r := &Resolver{
cc: cc,
}
prefix := fmt.Sprintf("/%s%s/", "docer_discov", target.URL.Path)
if b.domain != "" {
r.Update([]string{b.domain})
return r, nil
}
notify := etcdx.Notify(func(_ *clientv3.Event, address []string) {
logrus.Infof("target: %s, grpc address change to %+v", prefix, address)
r.Update(address)
})
b.watcher.SetPrefix(prefix)
b.watcher.AddEvent(notify)
go b.watcher.Run()
return r, nil
}
func (b *Builder) Scheme() string {
return schema
}