refactor: 使用IP端口哈希生成雪花算法节点ID
This commit is contained in:
@@ -443,3 +443,62 @@ LOOP:
|
||||
time.Sleep(time.Second)
|
||||
goto LOOP
|
||||
}
|
||||
|
||||
// GetLocalIP 获取本地IP ✅ 阿里云 ECS✅ 腾讯云 CVM✅ 华为云✅ 物理机✅ Docker 容器✅ K8s Pod✅ 虚拟机
|
||||
func GetLocalIP() (string, error) {
|
||||
// 先获取所有网卡
|
||||
ifaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// 遍历网卡,找符合条件的
|
||||
for _, iface := range ifaces {
|
||||
// 跳过 禁用、回环、虚拟网卡
|
||||
if iface.Flags&net.FlagUp == 0 || // 网卡未启用
|
||||
iface.Flags&net.FlagLoopback != 0 || // 回环地址
|
||||
strings.Contains(iface.Name, "docker") || // docker 网卡
|
||||
strings.Contains(iface.Name, "veth") || // 容器虚拟网卡
|
||||
strings.Contains(iface.Name, "bridge") || // 网桥
|
||||
strings.Contains(iface.Name, "lo") { // 本地回环
|
||||
continue
|
||||
}
|
||||
|
||||
// 获取网卡地址
|
||||
addrs, err := iface.Addrs()
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
ipNet, ok := addr.(*net.IPNet)
|
||||
if !ok || ipNet.IP.IsLoopback() {
|
||||
continue
|
||||
}
|
||||
|
||||
ip := ipNet.IP
|
||||
if ip.To4() != nil && isPrivateIP(ip) { // 只取内网 IPv4
|
||||
return ip.String(), nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "", errors.New("cannot find valid local private IP")
|
||||
}
|
||||
|
||||
// 判断是否内网IP(生产必须)
|
||||
func isPrivateIP(ip net.IP) bool {
|
||||
privateIPBlocks := []string{
|
||||
"10.0.0.0/8",
|
||||
"172.16.0.0/12",
|
||||
"192.168.0.0/16",
|
||||
}
|
||||
|
||||
for _, block := range privateIPBlocks {
|
||||
_, ipNet, err := net.ParseCIDR(block)
|
||||
if err == nil && ipNet.Contains(ip) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user