Files
crawlab/backend/services/register/register.go
Jeremy 7e406261c2 bug fix register.go
fix data race because of register solve issue https://github.com/crawlab-team/crawlab/issues/308
2019-11-19 17:03:46 +08:00

129 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package register
import (
"github.com/apex/log"
"github.com/spf13/viper"
"net"
"reflect"
"runtime/debug"
"sync"
)
type Register interface {
// 注册的key类型
GetType() string
// 注册的key的值唯一标识节点
GetKey() (string, error)
// 注册的节点IP
GetIp() (string, error)
// 注册节点的mac地址
GetMac() (string, error)
}
// ===================== mac 地址注册 =====================
type MacRegister struct{}
func (mac *MacRegister) GetType() string {
return "mac"
}
func (mac *MacRegister) GetKey() (string, error) {
return mac.GetMac()
}
func (mac *MacRegister) GetMac() (string, error) {
return getMac()
}
func (mac *MacRegister) GetIp() (string, error) {
return getIp()
}
// ===================== ip 地址注册 =====================
type IpRegister struct {
Ip string
}
func (ip *IpRegister) GetType() string {
return "ip"
}
func (ip *IpRegister) GetKey() (string, error) {
return ip.Ip, nil
}
func (ip *IpRegister) GetIp() (string, error) {
return ip.Ip, nil
}
func (ip *IpRegister) GetMac() (string, error) {
return getMac()
}
// ===================== 公共方法 =====================
// 获取本机的IP地址
// TODO: 考虑多个IP地址的情况
func getIp() (string, error) {
addrList, err := net.InterfaceAddrs()
if err != nil {
return "", err
}
for _, value := range addrList {
if ipNet, ok := value.(*net.IPNet); ok && !ipNet.IP.IsLoopback() {
if ipNet.IP.To4() != nil {
return ipNet.IP.String(), nil
}
}
}
return "", nil
}
func getMac() (string, error) {
interfaces, err := net.Interfaces()
if err != nil {
log.Errorf("get interfaces error:" + err.Error())
debug.PrintStack()
return "", err
}
for _, inter := range interfaces {
if inter.HardwareAddr != nil {
mac := inter.HardwareAddr.String()
return mac, nil
}
}
return "", nil
}
// ===================== 获得注册简单工厂 =====================
var register Register
// 获得注册器
var once sync.Once
func GetRegister() Register {
once.Do(func() {
if register != nil {
register = register
}
registerType := viper.GetString("server.register.type")
if registerType == "mac" {
register = &MacRegister{}
} else {
ip := viper.GetString("server.register.ip")
if ip == "" {
log.Error("server.register.ip is empty")
debug.PrintStack()
register = nil
}
register = &IpRegister{
Ip: ip,
}
}
log.Info("register type is :" + reflect.TypeOf(register).String())
})
return register
}