From 1b85b42e780d796ee5767ab05e5e95412d64ef9e Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Mon, 13 Apr 2026 14:50:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BD=BF=E7=94=A8=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=8F=98=E9=87=8F=E4=BB=A3=E6=9B=BFIP=E5=93=88?= =?UTF-8?q?=E5=B8=8C=E7=94=9F=E6=88=90=E8=8A=82=E7=82=B9ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/gfdb/gfdb.go | 31 +++++-------------------- utils/utils.go | 60 ++++++++----------------------------------------- 2 files changed, 15 insertions(+), 76 deletions(-) diff --git a/db/gfdb/gfdb.go b/db/gfdb/gfdb.go index 0c06dce..d44a9f2 100644 --- a/db/gfdb/gfdb.go +++ b/db/gfdb/gfdb.go @@ -5,7 +5,6 @@ import ( "database/sql" "encoding/json" "fmt" - "hash/fnv" "regexp" "strings" "time" @@ -18,6 +17,7 @@ import ( "github.com/gogf/gf/v2/database/gredis" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gcache" + "github.com/gogf/gf/v2/os/genv" "github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" @@ -158,37 +158,18 @@ func catchSQLHook() gdb.HookHandler { } } -func getNodeIdFromIPPort(ctx context.Context) int64 { - // 获取本地IP - ip, err := utils.GetLocalIP() - if err != nil { - return 0 - } - // 获取端口 - port := g.Cfg().MustGet(ctx, "server.address").String() - // 拼接字符串 - addr := fmt.Sprintf("%s%s", ip, port) - - // 计算哈希(保证唯一且稳定) - h := fnv.New64a() - h.Write([]byte(addr)) - hashVal := h.Sum64() - - // 取模 1024 → 得到 0~1023 的合法 node - return int64(hashVal % 1024) -} - // ==================== Insert钩子 ==================== - func insertHook(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result, err error) { userInfo, err := utils.GetUserInfo(ctx) if err != nil { return nil, err } - nodeId := getNodeIdFromIPPort(ctx) - if nodeId == 0 { - return nil, fmt.Errorf("nodeId cannot be empty") + + nodeId := genv.Get("APP_NODE", "").Int64() + if g.IsEmpty(nodeId) { + nodeId = 1 } + node, err := snowflake.NewNode(nodeId) if err != nil { return nil, err diff --git a/utils/utils.go b/utils/utils.go index d7e934a..32a75ba 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -444,60 +444,18 @@ LOOP: goto LOOP } -// GetLocalIP 获取本地IP ✅ 阿里云 ECS✅ 腾讯云 CVM✅ 华为云✅ 物理机✅ Docker 容器✅ K8s Pod✅ 虚拟机 -func GetLocalIP() (string, error) { - // 先获取所有网卡 - ifaces, err := net.Interfaces() +// IsLocalIP 判断是否是本地IP +func IsLocalIP(ip string) bool { + addrs, err := net.InterfaceAddrs() if err != nil { - return "", err + return false } - - // 遍历网卡,找符合条件的 - 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 + for _, addr := range addrs { + ipNet, ok := addr.(*net.IPNet) + if ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil { + if ipNet.IP.String() == ip { + return true } - - 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