func NewEtcdEndpoint(c *config.Config) (*EtcdEndpoint, error) { cfg := etcd.Config{ Endpoints: c.EtcdServers(), Transport: etcd.DefaultTransport, HeaderTimeoutPerRequest: time.Second, } logger := steno.NewLogger("router.endpoint") logger.Infof("endpoint etcd config: %v", cfg) client, err := etcd.New(cfg) if err != nil { logger.Infof("create etcd client error: %s", err.Error()) return &EtcdEndpoint{}, err } keysAPI := etcd.NewKeysAPI(client) etcdEndpoint := &EtcdEndpoint{ KeysAPI: keysAPI, Path: fmt.Sprintf("%s/%s/%s", c.EtcdPrefix, c.Namespace, c.Service), Codec: latest.Codec, Namespace: c.Namespace, Service: c.Service, Logger: logger, } info, err := etcdEndpoint.getEtcdEndpoint() if err != nil { logger.Infof("get endpoint client error: %s", err.Error()) return etcdEndpoint, err } err = etcdEndpoint.updateEndpoint(info) if err != nil { logger.Infof("update endpoint client error: %s", err.Error()) return etcdEndpoint, err } go etcdEndpoint.watchEtcdEndPoint(info) return etcdEndpoint, nil }