/
client_manager.go
72 lines (64 loc) · 1.72 KB
/
client_manager.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
package rpc
import (
"errors"
"fmt"
"github.com/501miles/go-tiny/model"
"github.com/501miles/go-tiny/rpc/message"
"google.golang.org/grpc"
"math/rand"
"sync"
"time"
)
type ClientManager struct {
lock sync.RWMutex
serviceRPCClientDict map[uint32]*ServiceRPCClient
serviceRPCClientNameDict map[string][]*ServiceRPCClient
}
func NewClientManager() *ClientManager {
return &ClientManager{
serviceRPCClientDict: map[uint32]*ServiceRPCClient{},
serviceRPCClientNameDict: map[string][]*ServiceRPCClient{},
}
}
func (cm * ClientManager) AddMService(s model.Service) error {
cm.lock.Lock()
defer cm.lock.Unlock()
if s.InstanceId <= 0 {
return errors.New("error service < 0")
}
sc := &ServiceRPCClient{
ServiceName: s.Name,
ServiceInstanceId: s.InstanceId,
}
address := fmt.Sprintf("%s:%d", s.Address, s.Port)
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
return fmt.Errorf("faild to connect: %v", err)
}
client := message.NewGatewayServiceClient(conn)
sc.Client = &client
cm.serviceRPCClientDict[s.InstanceId] = sc
if list, ok := cm.serviceRPCClientNameDict[s.Name]; ok {
list = append(list, sc)
cm.serviceRPCClientNameDict[s.Name] = list
}else{
cm.serviceRPCClientNameDict[s.Name] = []*ServiceRPCClient{sc}
}
return nil
}
func (cm * ClientManager) GetRPCClientByInstanceId(id uint32) *ServiceRPCClient {
cm.lock.RLock()
defer cm.lock.RUnlock()
return cm.serviceRPCClientDict[id]
}
func (cm *ClientManager) GetRPCClientByName(name string) *ServiceRPCClient {
//获取策略:随机
cm.lock.RLock()
defer cm.lock.RUnlock()
if sc, ok := cm.serviceRPCClientNameDict[name]; ok {
s := rand.NewSource(time.Now().Unix())
r := rand.New(s)
return sc[r.Intn(len(sc))]
}
return nil
}