-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomms.go
131 lines (108 loc) · 3.61 KB
/
comms.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package goserver
import (
"context"
"fmt"
"math/rand"
"github.com/brotherlogic/goserver/utils"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
dpb "github.com/brotherlogic/discovery/proto"
)
// FDialServer dial a specific job
func (s *GoServer) FDialServer(ctx context.Context, servername string) (*grpc.ClientConn, error) {
if servername == "discovery" {
return s.FDial(fmt.Sprintf("%v:%v", utils.LocalIP, utils.RegistryPort))
}
conn, err := s.FDial(utils.LocalDiscover)
if err != nil {
return nil, err
}
defer conn.Close()
registry := dpb.NewDiscoveryServiceV2Client(conn)
val, err := registry.Get(ctx, &dpb.GetRequest{Job: servername})
if err != nil {
return nil, err
}
// Pick a server at random
servernum := rand.Intn(len(val.GetServices()))
return s.FDial(fmt.Sprintf("%v:%v", val.GetServices()[servernum].GetIp(), val.GetServices()[servernum].GetPort()))
}
// FFind finds all servers
func (s *GoServer) FFind(ctx context.Context, servername string) ([]string, error) {
if servername == "discovery" {
return []string{}, fmt.Errorf("Cannot multi dial discovery")
}
conn, err := s.FDial(utils.LocalDiscover)
if err != nil {
return []string{}, err
}
defer conn.Close()
registry := dpb.NewDiscoveryServiceV2Client(conn)
val, err := registry.Get(ctx, &dpb.GetRequest{Job: servername})
if err != nil {
return []string{}, err
}
// Pick a server at random
ret := []string{}
for _, entry := range val.GetServices() {
ret = append(ret, fmt.Sprintf("%v:%v", entry.Identifier, entry.Port))
}
return ret, nil
}
// FDialSpecificServer dial a specific job on a specific host
func (s *GoServer) FDialSpecificServer(ctx context.Context, servername string, host string) (*grpc.ClientConn, error) {
if servername == "discovery" {
return s.FDial(fmt.Sprintf("%v:%v", utils.LocalIP, utils.RegistryPort))
}
conn, err := s.FDial(utils.LocalDiscover)
if err != nil {
return nil, err
}
defer conn.Close()
registry := dpb.NewDiscoveryServiceV2Client(conn)
val, err := registry.Get(ctx, &dpb.GetRequest{Job: servername, Server: host})
if err != nil {
return nil, err
}
if len(val.GetServices()) == 0 {
return nil, fmt.Errorf("Cannot locate server: %v,%v", servername, host)
}
// Pick a server at random
return s.FDial(fmt.Sprintf("%v:%v", val.GetServices()[0].GetIp(), val.GetServices()[0].GetPort()))
}
// FFindSpecificServer dial a specific job on a specific host
func (s *GoServer) FFindSpecificServer(ctx context.Context, servername string, host string) (*dpb.RegistryEntry, error) {
if servername == "discovery" {
return &dpb.RegistryEntry{Ip: utils.LocalIP, Port: utils.RegistryPort}, nil
}
conn, err := s.FDial(utils.LocalDiscover)
if err != nil {
return nil, err
}
defer conn.Close()
registry := dpb.NewDiscoveryServiceV2Client(conn)
val, err := registry.Get(ctx, &dpb.GetRequest{Job: servername, Server: host})
if err != nil {
return nil, err
}
if len(val.GetServices()) == 0 {
return nil, fmt.Errorf("Cannot locate server: %v,%v", servername, host)
}
// Pick a server at random
return val.GetServices()[0], nil
}
// FDial fundamental dial
func (s *GoServer) FDial(host string) (*grpc.ClientConn, error) {
return grpc.Dial(host, grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithChainUnaryInterceptor(
s.clientInterceptor,
))
}
// FPDial fundamental dial
func (s *GoServer) FPDial(host string, opts ...grpc.DialOption) (*grpc.ClientConn, error) {
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
opts = append(opts, grpc.WithChainUnaryInterceptor(
s.clientInterceptor,
))
return grpc.Dial(host, opts...)
}