示例#1
0
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
}