/
service_loader.go
52 lines (45 loc) · 1001 Bytes
/
service_loader.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
package client
import (
"fmt"
"nsx/registry"
"time"
)
type NsxServiceLoader struct {
uris []string
uri2Addrs map[string][]string
registry registry.Registry
onReload OnReload
}
type OnReload func(uri string, mewServoceAddrs []string)
func NewNsxServiceLoader(uris []string, registry registry.Registry, onReload OnReload) *NsxServiceLoader {
l := &NsxServiceLoader{
uris: uris,
uri2Addrs: make(map[string][]string),
registry: registry,
onReload: onReload,
}
l.RefreshAddr()
go func() {
t := time.NewTicker(2 * time.Second)
for {
select {
case <-t.C:
l.RefreshAddr()
}
}
}()
return l
}
// 刷新拉取最新的可用服务地址
func (l *NsxServiceLoader) RefreshAddr() {
for _, uri := range l.uris {
addrs, err := l.registry.GetService(uri)
if err != nil || len(addrs) == 0 {
fmt.Printf("load %s failed: %v\n", uri, err)
continue
}
l.uri2Addrs[uri] = addrs // 更新
l.onReload(uri, addrs)
time.Sleep(1 * time.Second)
}
}