-
Notifications
You must be signed in to change notification settings - Fork 0
/
register.go
85 lines (77 loc) · 1.95 KB
/
register.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
package xk8s
import (
"github.com/coder2z/g-saber/xlog"
"github.com/coder2z/g-server/xregistry"
"google.golang.org/grpc/resolver"
"sync"
"time"
)
// grpc.Dial("k8s://namespace/servicename:portname")
// grpc.Dial("k8s://namespace/servicename:port")
// grpc.Dial("k8s:///servicename:portname") // namespace=default
// grpc.Dial("k8s:///servicename:port")
type k8sBuilder struct {
sync.Mutex
rs map[string]xregistry.Discovery
}
func RegisterBuilder() error {
b := &k8sBuilder{
rs: map[string]xregistry.Discovery{},
}
resolver.Register(b)
xlog.Info("Application Starting",
xlog.FieldComponentName("XRegistry"),
xlog.FieldMethod("XRegistry.XK8S.RegisterBuilder"),
xlog.FieldDescription("Service use K8S registration discovery initialization"),
)
return nil
}
func (b *k8sBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
var (
err error
discovery xregistry.Discovery
namespaces = target.Authority
)
if namespaces == "" {
namespaces = "default"
}
if discovery, err = b.getDiscovery(namespaces); err != nil {
return nil, err
}
ch, err := discovery.Discover(target.Endpoint)
if err != nil {
return nil, err
}
select {
case i := <-ch:
xregistry.UpdateAddress(i, cc)
case <-time.After(time.Minute):
xlog.Warn("Application Starting",
xlog.FieldComponentName("XRegistry"),
xlog.FieldMethod("XRegistry.XK8S.Build"),
xlog.FieldDescription("Server discover not resolve success in one minute"),
xlog.Any("target", target),
)
}
go func() {
for i := range ch {
xregistry.UpdateAddress(i, cc)
}
}()
return &xregistry.NoopResolver{}, nil
}
func (b *k8sBuilder) getDiscovery(namespace string) (r xregistry.Discovery, err error) {
b.Lock()
defer b.Unlock()
if r = b.rs[namespace]; r != nil {
return
}
if r, err = newDiscovery(namespace); err != nil {
return
}
b.rs[namespace] = r
return
}
func (b *k8sBuilder) Scheme() string {
return "k8s"
}