From e673885c64d5645c2c38e10ddfd922657afdc4cb Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 08 十二月 2023 11:31:03 +0800 Subject: [PATCH] 使用ip初始化雪花算法 --- pkg/snowflake/snowflake.go | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 38 insertions(+), 12 deletions(-) diff --git a/pkg/snowflake/snowflake.go b/pkg/snowflake/snowflake.go index 52420db..049b307 100644 --- a/pkg/snowflake/snowflake.go +++ b/pkg/snowflake/snowflake.go @@ -23,21 +23,47 @@ func InitWithIP() { // 浣跨敤 LookupIP 鑾峰彇涓绘満鐨� IP 鍦板潃鍒楄〃 - addrs, err := net.LookupIP("localhost") + // 鑾峰彇鏈満鎵�鏈夌綉缁滄帴鍙� + interfaces, err := net.Interfaces() if err != nil { - logx.Errorf("snowflake can not generate, init error, get ip error:%v", err) - panic(fmt.Sprintf("snowflake can not generate, init error, get ip error:%v", err)) - } - var ip string - // 閬嶅巻 IP 鍦板潃鍒楄〃 - for _, addr := range addrs { - // 鍒ゆ柇 IP 鍦板潃鐨勭増鏈槸 IPv4 杩樻槸 IPv6 - if ipNet := addr.To4(); ipNet != nil { - ip = ipNet.String() - logx.Errorf("IPv4 Address: %s\n", ipNet.String()) - } + 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) -- Gitblit v1.8.0