package servicediscovery import ( "fmt" consul "github.com/hashicorp/consul/api" "service/library/configcenter" "service/library/logger" ) type ConsulSD struct { client *consul.Client serviceName string } var defaultConsulSD *ConsulSD func GetDefaultConsulSD() *ConsulSD { return defaultConsulSD } func Init(cfg *configcenter.ConsulServiceDiscovery) error { if len(cfg.Host) <= 0 { return fmt.Errorf("invalid host: %v", cfg.Host) } if len(cfg.ServiceName) <= 0 { return fmt.Errorf("invalid service_name: %v", cfg.ServiceName) } config := consul.DefaultConfig() config.Address = cfg.Host client, err := consul.NewClient(config) if err != nil { return err } defaultConsulSD = &ConsulSD{ client: client, serviceName: cfg.ServiceName, } return nil } // 注册服务 func Register(ip string, port int) error { csd := GetDefaultConsulSD() var ( key = fmt.Sprintf(`upstreams/%s/%s:%d`, csd.serviceName, ip, port) value = fmt.Sprintf(`{"weight":1, "max_fails":2, "fail_timeout":10}`) ) r, err := csd.client.KV().Put( &consul.KVPair{ Key: key, Value: []byte(value), }, nil, ) if err != nil { return err } logger.Info("Service Register success, %v, %v", key, r.RequestTime.String()) return nil } // 注销服务 func DeRegister(ip string, port int) error { csd := GetDefaultConsulSD() var ( key = fmt.Sprintf(`upstreams/%s/%s:%d`, csd.serviceName, ip, port) value = fmt.Sprintf(`{"weight":1, "max_fails":2, "fail_timeout":10, "down": 1}`) ) r, err := csd.client.KV().Put( &consul.KVPair{ Key: key, Value: []byte(value), }, nil, ) if err != nil { return err } logger.Info("Service DeRegister success, %v, %v", key, r.RequestTime.String()) return nil }