From 20bbbcc1d14536ddaa498ac84a6008828df8dc1c Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期三, 13 十二月 2023 20:23:11 +0800 Subject: [PATCH] 往plc写目标数时,优先往写入地址写,没有写入地址再往读取地址写 --- pkg/snowflake/snowflake.go | 78 +++++++++++++++++++++++++++++++++++++- 1 files changed, 75 insertions(+), 3 deletions(-) diff --git a/pkg/snowflake/snowflake.go b/pkg/snowflake/snowflake.go index ad86994..f0f6442 100644 --- a/pkg/snowflake/snowflake.go +++ b/pkg/snowflake/snowflake.go @@ -1,11 +1,85 @@ package snowflake import ( + "apsClient/pkg/logx" "errors" + "fmt" + "hash/fnv" + "net" "strconv" "sync" "time" ) + +var idGenerater *IdWorker + +func init() { + // 浣跨敤 LookupIP 鑾峰彇涓绘満鐨� IP 鍦板潃鍒楄〃 + // 鑾峰彇鏈満鎵�鏈夌綉缁滄帴鍙� + interfaces, err := net.Interfaces() + if err != nil { + logx.Errorf("snowflake InitWithIP error:%v", err) + return + } + + var ip string + // 閬嶅巻鎵�鏈夌綉缁滄帴鍙� + for _, iface := range interfaces { + // 鎺掗櫎涓�浜涚壒娈婄殑鎺ュ彛锛屼緥濡� loopback 鎺ュ彛 + if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 { + // 鑾峰彇鎺ュ彛鐨勬墍鏈夊湴鍧� + addrs, err := iface.Addrs() + if err != nil { + logx.Errorf("snowflake InitWithIP error:%v", err) + continue + } + // 閬嶅巻鎺ュ彛鐨勬墍鏈夊湴鍧� + for _, addr := range addrs { + // 妫�鏌ュ湴鍧�绫诲瀷鏄惁鏄� IP 鍦板潃 + if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { + // 鍒ゆ柇 IP 鍦板潃鐨勭増鏈槸 IPv4 杩樻槸 IPv6 + if ipNet.IP.To4() != nil { + fmt.Printf("IPv4 Address: %s\n", ipNet.IP.String()) + if ipNet.IP.String() != "127.0.0.1" { + ip = ipNet.IP.String() + goto getIpOK + } + } else { + fmt.Printf("IPv6 Address: %s\n", ipNet.IP.String()) + } + } + } + } + } +getIpOK: + if ip == "" { + logx.Errorf("snowflake InitWithIP can not find Ip") + return + } + ipNumber, err := ipToNumber(ip) + if err != nil { + logx.Errorf("snowflake can not generate, init error, ip to number error :%v", err) + panic(fmt.Sprintf("snowflake can not generate, init error, ip to number error :%v", err)) + } + idGenerater, err = NewIdWorker(ipNumber) + if err != nil { + logx.Errorf("snowflake can not generate, init error :%v", err) + panic(fmt.Sprintf("snowflake can not generate, init error :%v", err)) + } +} + +func ipToNumber(ip string) (int64, error) { + // 灏� IP 鍦板潃瀛楃涓茶В鏋愪负 net.IP 绫诲瀷 + parsedIP := net.ParseIP(ip) + if parsedIP == nil { + return 0, fmt.Errorf("invalid IP address:%v", ip) + } + + // 浣跨敤 FNV-1a 鏁e垪绠楁硶璁$畻鍝堝笇鍊� + hash := fnv.New32a() + hash.Write(parsedIP) + return int64(hash.Sum32() % 1024), nil // 鍙栦綑鏁扮‘淇濈粨鏋滃湪 1 鍒� 1023 涔嬮棿 +} const ( CEpoch = 1474802888000 @@ -97,9 +171,7 @@ return } -var idGenerater, _ = NewIdWorker(0) - -func GenerateId() int64 { +func GenerateID() int64 { start: id, err := idGenerater.NextId() if err != nil { -- Gitblit v1.8.0