From 20f9fe12b042969c78d60c876646b42f4a8856c4 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 14:34:27 +0800 Subject: [PATCH] =?UTF-8?q?gateway=E5=88=86=E9=85=8D=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- consul/consul.go | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/consul/consul.go b/consul/consul.go index a2a61cf..638ec2f 100644 --- a/consul/consul.go +++ b/consul/consul.go @@ -41,7 +41,15 @@ func getLocalIP() (string, error) { return "", fmt.Errorf("无法找到本地IP地址") } - +func getInstanceAddrByIp(ctx context.Context, ip string, services []gsvc.Service) (addr string) { + for _, s := range services { + if s.GetEndpoints()[0].Host() == addr { + addr = s.GetEndpoints()[0].String() + return + } + } + return +} func GetInstanceAddr(ctx context.Context, name string) (addr string, err error) { watch, err := gsvc.GetRegistry().Watch(ctx, name) service, err := watch.Proceed() @@ -49,17 +57,21 @@ func GetInstanceAddr(ctx context.Context, name string) (addr string, err error) err = errors.New("获取customerService服务实例失败!") return } - //优先使用gateway同IP的服务实例 + //优先使用客户端IP获取实例(前后端在同一台机器调试) + addr = getInstanceAddrByIp(ctx, g.RequestFromCtx(ctx).GetRemoteIp(), service) + if !g.IsEmpty(addr) { + return + } + //优先使用gateway同IP的服务实例(前后端不同机器调试) addr, err = getLocalIP() if err != nil { return } - for _, s := range service { - if s.GetEndpoints()[0].Host() == addr { - addr = s.GetEndpoints()[0].String() - return - } + addr = getInstanceAddrByIp(ctx, addr, service) + if !g.IsEmpty(addr) { + return } + //随机获取一个服务实例 maxService := grand.N(0, len(service)-1) addr = service[maxService].GetEndpoints()[0].String() return