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