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 }