-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrpcserver.go
95 lines (79 loc) · 1.85 KB
/
rpcserver.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
package registry
import (
"context"
"log"
"net"
"github.com/werbenhu/chash"
"google.golang.org/grpc"
)
// RpcServer is a gRPC server for service discovery
type RpcServer struct {
addr string
rpc *grpc.Server
}
// NewRpcServer creates a new RpcServer object
func NewRpcServer() *RpcServer {
return &RpcServer{}
}
// Match assigns a service to a key using the consistent hashing algorithm
func (s *RpcServer) Match(ctx context.Context, req *MatchRequest) (*MatchResponse, error) {
group, err := chash.GetGroup(req.Group)
if err != nil {
return nil, err
}
_, payload, err := group.Match(req.Key)
if err != nil {
return nil, err
}
m := &Member{}
if err := m.Unmarshal(payload); err != nil {
return nil, err
}
return &MatchResponse{
Id: m.Service.Id,
Group: m.Service.Group,
Addr: m.Service.Addr,
}, nil
}
// Members returns a list of services in a group
func (s *RpcServer) Members(ctx context.Context, req *MembersRequest) (*MembersResponse, error) {
group, err := chash.GetGroup(req.Group)
if err != nil {
return nil, err
}
elements := group.GetElements()
services := make([]*MatchResponse, 0)
for _, element := range elements {
m := &Member{}
if err := m.Unmarshal(element.Payload); err == nil {
service := &MatchResponse{
Id: m.Service.Id,
Group: m.Service.Group,
Addr: m.Service.Addr,
}
services = append(services, service)
}
}
return &MembersResponse{
Services: services,
}, nil
}
// Start starts the gRPC server
func (s *RpcServer) Start(addr string) error {
var err error
s.addr = addr
listener, err := net.Listen("tcp", s.addr)
if err != nil {
return err
}
s.rpc = grpc.NewServer()
RegisterRServer(s.rpc, s)
return s.rpc.Serve(listener)
}
// Stop stops the gRPC server
func (s *RpcServer) Stop() {
if s.rpc != nil {
s.rpc.Stop()
log.Printf("[DEBUG] Rpc server is stoped.\n")
}
}