package infra import ( "context" "log" "time" "git.apinb.com/bsm-sdk/core/print" "git.apinb.com/bsm-sdk/core/utils" clientv3 "go.etcd.io/etcd/client/v3" ) var ( Service service RootPrefix string = "/bsm_services/" ) type service struct{} func (s *service) Register(cli *clientv3.Client, serviceName string, port int) error { lease := clientv3.NewLease(cli) grantResp, err := lease.Grant(context.TODO(), 5) if err != nil { return err } serviceAddr := utils.GetLocationIP() + ":" + utils.Int2String(port) key := RootPrefix + serviceName + "/" + utils.Int642String(time.Now().UnixNano()) _, err = cli.KV.Put(context.TODO(), key, serviceAddr, clientv3.WithLease(grantResp.ID)) if err != nil { return err } keepAliveChan, err := lease.KeepAlive(context.TODO(), grantResp.ID) if err != nil { return err } print.Info("[BSM Register] Service Key: %s", key) print.Info("[BSM Register] Service Val: %s", serviceAddr) print.Success("[BSM Register] Service Register Complete.") go func() { for keepAliveResp := range keepAliveChan { if keepAliveResp == nil { log.Println("LeaseKeepAlive", "Failed") return } } }() return nil }