code: func (sd *etcdServiceDiscovery) Init() error {
  	sd.running = true
  	var cli *clientv3.Client
  	var err error
  	if sd.cli == nil {
  		cli, err = clientv3.New(clientv3.Config{
  			Endpoints:   sd.etcdEndpoints,
  			DialTimeout: sd.etcdDialTimeout,
  		})
  		if err != nil {
  			return err
  		}
  		sd.cli = cli
  	}
  
  	// namespaced etcd :)
  	sd.cli.KV = namespace.NewKV(sd.cli.KV, sd.etcdPrefix)
  	sd.cli.Watcher = namespace.NewWatcher(sd.cli.Watcher, sd.etcdPrefix)
  	sd.cli.Lease = namespace.NewLease(sd.cli.Lease, sd.etcdPrefix)
  
  	err = sd.bootstrap()
  	if err != nil {
  		return err
  	}
  
  	// update servers
  	syncServersTicker := time.NewTicker(sd.syncServersInterval)
  	go func() {
  		for sd.running {
  			select {
  			case <-syncServersTicker.C:
  				err := sd.SyncServers()
  				if err != nil {
  					logger.Log.Errorf("error resyncing servers: %s", err.Error())
  				}
  			case <-sd.stopChan:
  				return
  			}
  		}
  	}()
  
  	go sd.watchEtcdChanges()
  	return nil
  }
docs: // Init starts the service discovery client