From 15b781e2e4f10d68b44bcdbe3e0a327e6113851d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Wed, 3 Dec 2025 09:03:02 +0800 Subject: [PATCH] =?UTF-8?q?consul=E5=9C=B0=E5=9D=80=E5=88=86=E9=85=8D?= =?UTF-8?q?=E4=BC=98=E5=85=88=E8=B0=83=E7=94=A8gateway=E5=90=8CIP=E7=9A=84?= =?UTF-8?q?=E5=BE=AE=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- consul/consul.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/consul/consul.go b/consul/consul.go index ba019c8..8b1c00a 100644 --- a/consul/consul.go +++ b/consul/consul.go @@ -3,6 +3,9 @@ package consul import ( "context" "errors" + "fmt" + "net" + "github.com/gogf/gf/contrib/registry/consul/v2" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/gsel" @@ -19,6 +22,26 @@ func init() { gsvc.SetRegistry(registry) gsel.SetBuilder(gsel.NewBuilderRoundRobin()) } +func getLocalIP() (string, error) { + // 获取本机所有网络接口 + addrs, err := net.InterfaceAddrs() + if err != nil { + return "", err + } + + for _, addr := range addrs { + // 检查是否是IP地址 + if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { + if ipNet.IP.To4() != nil { + // 返回第一个非回环的IPv4地址 + return ipNet.IP.String(), nil + } + } + } + + return "", fmt.Errorf("无法找到本地IP地址") +} + func GetInstanceAddr(ctx context.Context, name string) (addr string, err error) { watch, err := gsvc.GetRegistry().Watch(ctx, name) service, err := watch.Proceed() @@ -28,6 +51,17 @@ func GetInstanceAddr(ctx context.Context, name string) (addr string, err error) } maxService := grand.N(0, len(service)-1) maxEndpoints := grand.N(0, len(service[maxService].GetEndpoints())-1) + //优先使用gateway同IP的服务实例 + addr, err = getLocalIP() + if err != nil { + return + } + for _, point := range service[maxService].GetEndpoints() { + if point.Host() == addr { + addr = point.String() + return + } + } addr = service[maxService].GetEndpoints()[maxEndpoints].String() return }