code: func (c etcdClient) GetServices(prefix string) ([]*Service, error) {
  	ctx, cancel := context.WithTimeout(c.ctx, etcdTimeout)
  	defer cancel()
  
  	path := prefix
  	r, err := c.client.Get(ctx, path, etcdcv3.WithPrefix())
  	if err != nil {
  		return nil, err
  	}
  
  	var svcs []*Service
  	bx := make(map[Service]bool)
  	for _, n := range r.Kvs {
  		svc := new(Service)
  		if err := json.Unmarshal(n.Value, svc); err != nil {
  			return nil, fmt.Errorf("%s: %s", n.Key, err.Error())
  		}
  		b := Service{Host: svc.Host, Port: svc.Port, Priority: svc.Priority, Weight: svc.Weight, Text: svc.Text, Key: string(n.Key)}
  		if _, ok := bx[b]; ok {
  			// skip the service if already added to service list.
  			// the same service might be found in multiple etcd nodes.
  			continue
  		}
  		bx[b] = true
  
  		svc.Key = string(n.Key)
  		if svc.Priority == 0 {
  			svc.Priority = priority
  		}
  		svcs = append(svcs, svc)
  	}
  
  	return svcs, nil
  }
docs: // GetService return all Service records stored in etcd stored anywhere under the given key (recursively)