/
interface.go
111 lines (93 loc) · 2.19 KB
/
interface.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package grpc_service
import (
"context"
"errors"
"fmt"
"google.golang.org/grpc"
)
type RegisterInterface interface {
Register(ctx context.Context, service Metadata, endpoint string) error
Unregister(ctx context.Context, service Metadata, endpoint string) error
Close() error
}
var (
instance RegisterInterface = &nop{}
errorDefaultRegisterNotSet = errors.New("default register not set")
)
func SetDefaultRegister(r RegisterInterface) {
instance = r
}
// Register 使用默认注册器注册服务
func Register(ctx context.Context, endpoint string, mds ...Metadata) error {
if instance == nil {
return errorDefaultRegisterNotSet
}
for _, md := range mds {
err := instance.Register(ctx, md, endpoint)
if err != nil {
return err
}
}
return nil
}
// Unregister 使用默认注册器注销服务
func Unregister(ctx context.Context, endpoint string, mds ...Metadata) error {
if instance == nil {
return errorDefaultRegisterNotSet
}
for _, md := range mds {
err := instance.Unregister(ctx, md, endpoint)
if err != nil {
return err
}
}
return nil
}
// Close 关闭默认注册器
func Close() error {
return instance.Close()
}
type ServiceInfo struct {
Item Metadata
Endpoints map[string]struct{}
}
func (e *ServiceInfo) Put(endpoint string) {
if e.Endpoints == nil {
e.Endpoints = map[string]struct{}{endpoint: {}}
} else {
e.Endpoints[endpoint] = struct{}{}
}
}
func (e *ServiceInfo) Del(endpoint string) {
delete(e.Endpoints, endpoint)
}
func (e *ServiceInfo) IsEmpty() bool {
return len(e.Endpoints) == 0
}
type Metadata interface {
ServiceDesc() *grpc.ServiceDesc
Version() string
UniqueKey() string
}
var _ Metadata = &metadata{}
func NewServiceMetadata(sd *grpc.ServiceDesc, svcVersion string) Metadata {
return &metadata{
sd: sd,
version: svcVersion,
uniqueKey: fmt.Sprintf("/%s/%s/%s", sd.Metadata, sd.ServiceName, svcVersion),
}
}
type metadata struct {
sd *grpc.ServiceDesc
version string
uniqueKey string
}
func (m *metadata) ServiceDesc() *grpc.ServiceDesc {
return m.sd
}
func (m *metadata) Version() string {
return m.version
}
func (m *metadata) UniqueKey() string {
return m.uniqueKey
}