85 lines
1.7 KiB
Go
85 lines
1.7 KiB
Go
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
|
|
}
|