Commit 70bbc95943a8aee1869afbd42d27f6c230cbb8ef
1 parent
8d983031
fix: 修复服务器无法重新续租etcd的bug
Showing
3 changed files
with
55 additions
and
29 deletions
Show diff stats
cmd/gameserver/plugin/plugin.go
@@ -35,9 +35,8 @@ func LoginRpc(msg components.IMessage) (int32, interface{}) { | @@ -35,9 +35,8 @@ func LoginRpc(msg components.IMessage) (int32, interface{}) { | ||
35 | role.SetProperty("Device", req.Device) | 35 | role.SetProperty("Device", req.Device) |
36 | 36 | ||
37 | return 0, &pb.RoleRsp{ | 37 | return 0, &pb.RoleRsp{ |
38 | - Role: role.Role, | ||
39 | - Hero: role.GetAllHero(), | ||
40 | - Team: role.GetAllTeam(), | ||
41 | - Equips: []*pb.Equipment{role.Equip.Equip}, | 38 | + Role: role.Role, |
39 | + Hero: role.GetAllHero(), | ||
40 | + Team: role.GetAllTeam(), | ||
42 | } | 41 | } |
43 | } | 42 | } |
common/etcd/etcd.go
@@ -10,24 +10,26 @@ import ( | @@ -10,24 +10,26 @@ import ( | ||
10 | ) | 10 | ) |
11 | 11 | ||
12 | type EtcdClient struct { | 12 | type EtcdClient struct { |
13 | - etcd *clientv3.Client | 13 | + etcd *clientv3.Client |
14 | + lease clientv3.Lease | ||
14 | } | 15 | } |
15 | 16 | ||
16 | func NewEtcdClient(conf *common.Etcd) (*EtcdClient, error) { | 17 | func NewEtcdClient(conf *common.Etcd) (*EtcdClient, error) { |
17 | cli, err := clientv3.New(clientv3.Config{ | 18 | cli, err := clientv3.New(clientv3.Config{ |
18 | Endpoints: conf.Endpoints, | 19 | Endpoints: conf.Endpoints, |
19 | - DialTimeout: time.Duration(conf.DialTimeout) * time.Second, | 20 | + DialTimeout: time.Duration(conf.DialTimeout) * time.Second, |
20 | }) | 21 | }) |
21 | if err != nil { | 22 | if err != nil { |
22 | logger.Error("etcd init err: %v", err) | 23 | logger.Error("etcd init err: %v", err) |
23 | return nil, err | 24 | return nil, err |
24 | } | 25 | } |
25 | return &EtcdClient{ | 26 | return &EtcdClient{ |
26 | - etcd: cli, | 27 | + etcd: cli, |
28 | + lease: clientv3.NewLease(cli), | ||
27 | }, nil | 29 | }, nil |
28 | } | 30 | } |
29 | 31 | ||
30 | -func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { | 32 | +func (e *EtcdClient) PutWithPrefix(prefix, key, val string) { |
31 | _, err := e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val) | 33 | _, err := e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val) |
32 | if err != nil { | 34 | if err != nil { |
33 | logger.Error("PutWithPrefix err: %v", err) | 35 | logger.Error("PutWithPrefix err: %v", err) |
@@ -35,43 +37,68 @@ func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { | @@ -35,43 +37,68 @@ func (e *EtcdClient)PutWithPrefix(prefix, key, val string) { | ||
35 | } | 37 | } |
36 | } | 38 | } |
37 | 39 | ||
38 | -func (e *EtcdClient)PutWithLeasePrefix(prefix, key, val string, ttl int64) error { | ||
39 | - lease := clientv3.NewLease(e.etcd) | ||
40 | - leaseResp, err := lease.Grant(context.TODO(), ttl) | 40 | +func (e *EtcdClient) leaseKey(prefix, key, val string, ttl int64) (clientv3.LeaseID, error) { |
41 | + leaseResp, err := e.lease.Grant(context.TODO(), ttl) | ||
41 | if err != nil { | 42 | if err != nil { |
42 | logger.Error("PutWithLeasePrefix 设置租约时间失败:%v\n", err) | 43 | logger.Error("PutWithLeasePrefix 设置租约时间失败:%v\n", err) |
43 | - return err | 44 | + return 0, err |
44 | } | 45 | } |
45 | 46 | ||
46 | _, err = e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val, clientv3.WithLease(leaseResp.ID)) | 47 | _, err = e.etcd.Put(context.TODO(), fmt.Sprintf("/%s/%s/", prefix, key), val, clientv3.WithLease(leaseResp.ID)) |
47 | if err != nil { | 48 | if err != nil { |
48 | logger.Error("PutWithLeasePrefix err: %v", err) | 49 | logger.Error("PutWithLeasePrefix err: %v", err) |
49 | - return err | 50 | + return 0, err |
50 | } | 51 | } |
52 | + return leaseResp.ID, nil | ||
53 | +} | ||
51 | 54 | ||
52 | - keepRespChan, err := lease.KeepAlive(context.TODO(), leaseResp.ID) | 55 | +func (e *EtcdClient) PutWithLeasePrefix(prefix, key, val string, ttl int64) error { |
56 | + logger.Debug("etcd register...") | ||
57 | + leaseID, err := e.leaseKey(prefix, key, val, ttl) | ||
53 | if err != nil { | 58 | if err != nil { |
54 | - logger.Error("keepalive err: %v", err) | ||
55 | - return err | 59 | + logger.Error(err) |
60 | + panic(err) | ||
56 | } | 61 | } |
57 | go func() { | 62 | go func() { |
58 | for { | 63 | for { |
59 | - select { | ||
60 | - case _ = <-keepRespChan: | ||
61 | - if keepRespChan == nil { | ||
62 | - fmt.Println("租约已经失效") | ||
63 | - goto END | ||
64 | - } else { //每秒会续租一次,所以就会受到一次应答 | ||
65 | - //fmt.Println("收到自动续租应答:", keepResp.ID) | 64 | + if leaseID == 0 { |
65 | + leaseID, err = e.leaseKey(prefix, key, val, ttl) | ||
66 | + if err != nil { | ||
67 | + logger.Error("leaseKey err: %v", err) | ||
68 | + continue | ||
66 | } | 69 | } |
67 | } | 70 | } |
71 | + | ||
72 | + keepRespChan, err := e.lease.KeepAlive(context.TODO(), leaseID) | ||
73 | + if err != nil { | ||
74 | + logger.Error("keepalive err: %v", err) | ||
75 | + continue | ||
76 | + } | ||
77 | + | ||
78 | + EXIT: | ||
79 | + for { | ||
80 | + select { | ||
81 | + case keepChan := <-keepRespChan: | ||
82 | + if keepChan == nil { | ||
83 | + logger.Debug("租约已经失效") | ||
84 | + leaseID = 0 | ||
85 | + break EXIT | ||
86 | + } else { | ||
87 | + //每秒会续租一次,所以就会受到一次应答 | ||
88 | + //fmt.Println("收到自动续租应答:", keepResp.ID) | ||
89 | + } | ||
90 | + logger.Debug(keepChan) | ||
91 | + } | ||
92 | + } | ||
93 | + | ||
94 | + logger.Debug("exit keepRspChan for select") | ||
68 | } | 95 | } |
69 | - END: | ||
70 | }() | 96 | }() |
97 | + | ||
71 | return nil | 98 | return nil |
72 | } | 99 | } |
73 | 100 | ||
74 | -func (e *EtcdClient)Get(key string) map[string]string { | 101 | +func (e *EtcdClient) Get(key string) map[string]string { |
75 | ctx, cancel := context.WithTimeout(context.Background(), time.Second) | 102 | ctx, cancel := context.WithTimeout(context.Background(), time.Second) |
76 | resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", key)) | 103 | resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", key)) |
77 | cancel() | 104 | cancel() |
@@ -86,7 +113,7 @@ func (e *EtcdClient)Get(key string) map[string]string { | @@ -86,7 +113,7 @@ func (e *EtcdClient)Get(key string) map[string]string { | ||
86 | return m | 113 | return m |
87 | } | 114 | } |
88 | 115 | ||
89 | -func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { | 116 | +func (e *EtcdClient) GetByPrefix(prefix string) map[string]string { |
90 | ctx, cancel := context.WithTimeout(context.Background(), time.Second) | 117 | ctx, cancel := context.WithTimeout(context.Background(), time.Second) |
91 | resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", prefix), clientv3.WithPrefix()) | 118 | resp, err := e.etcd.Get(ctx, fmt.Sprintf("/%s/", prefix), clientv3.WithPrefix()) |
92 | cancel() | 119 | cancel() |
@@ -101,6 +128,6 @@ func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { | @@ -101,6 +128,6 @@ func (e *EtcdClient)GetByPrefix(prefix string) map[string]string { | ||
101 | return m | 128 | return m |
102 | } | 129 | } |
103 | 130 | ||
104 | -func (e *EtcdClient)Close() { | 131 | +func (e *EtcdClient) Close() { |
105 | e.etcd.Close() | 132 | e.etcd.Close() |
106 | -} | ||
107 | \ No newline at end of file | 133 | \ No newline at end of file |
134 | +} |