package qgrpc import ( "context" "github.com/coreos/etcd/clientv3" "unitechdev/golib/tlog" "path" "time" ) func etcdGrantWrapper(cli *clientv3.Client) (clientv3.LeaseID, error) { resp, err := cli.Grant(context.Background(), 5) if err != nil { return 0, err } return resp.ID, nil } func (self *Server) register() (err error) { if len(self.userCfg.Prefix) < 1 || len(self.userCfg.Addr) < 1 { tlog.Info("qgrpc server||register||prefix or addr less than 1 char") return nil } if self.etcdId, err = etcdGrantWrapper(self.etcdCli); err != nil { return err } for _, server := range self.userCfg.Servers { addr := self.userCfg.GetAddr() etcdKey := path.Join(self.userCfg.Prefix, server, addr) if _, err = self.etcdCli.Put(context.Background(), etcdKey, addr, clientv3.WithLease(self.etcdId)); err != nil { return err } } ch, err := self.etcdCli.KeepAlive(context.Background(), self.etcdId) if err != nil { tlog.Error(err) } go self.keepalive(ch) return err } func (self *Server) keepalive(ch <-chan *clientv3.LeaseKeepAliveResponse) { for { resp := <-ch if resp == nil { tlog.Error("qgrpc server||keepalive||nil response") self.Revoke() time.Sleep(time.Second) self.register() return } } }