From 0ad6bc943874c688c1c4b2ddcf6f66d6572a5871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=96=8C?= <259278618@qq.com> Date: Wed, 1 Apr 2026 14:11:07 +0800 Subject: [PATCH] Dockerfile --- consul/consul.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/consul/consul.go b/consul/consul.go index 91f0900..0e7ade7 100644 --- a/consul/consul.go +++ b/consul/consul.go @@ -20,6 +20,7 @@ var ( consulAddr string reconnectMutex sync.RWMutex reconnectDone chan struct{} + connected bool ) // connectConsul 连接 Consul @@ -27,6 +28,11 @@ func connectConsul(ctx context.Context) error { reconnectMutex.Lock() defer reconnectMutex.Unlock() + // 如果已经连接,不再重复连接 + if connected && registry != nil { + return nil + } + var err error registry, err = consul.New(consul.WithAddress(consulAddr)) if err != nil { @@ -36,9 +42,10 @@ func connectConsul(ctx context.Context) error { gsvc.SetRegistry(registry) gsel.SetBuilder(gsel.NewBuilderRoundRobin()) + connected = true g.Log().Infof(ctx, "✅ Consul 初始化成功: %s", consulAddr) - // 启动健康检查和自动重连 + // 启动健康检查和自动重连(只启动一次) go startHealthCheckAndReconnect() return nil @@ -65,6 +72,13 @@ func startHealthCheckAndReconnect() { } g.Log().Warning(ctx, "⚠️ Consul 连接异常,尝试重新连接...") + + // 重置连接状态并重连 + reconnectMutex.Lock() + connected = false + registry = nil + reconnectMutex.Unlock() + if err := connectConsul(ctx); err != nil { g.Log().Errorf(ctx, "❌ Consul 重连失败: %v,5秒后重试...", err) } @@ -81,18 +95,11 @@ func checkConsulHealth(ctx context.Context) bool { reconnectMutex.RLock() defer reconnectMutex.RUnlock() - if registry == nil { + if registry == nil || !connected { return false } - // 尝试获取服务列表来检测连接是否正常 - services, err := registry.Search(ctx, gsvc.SearchInput{}) - if err != nil { - g.Log().Debugf(ctx, "Consul 健康检查失败: %v", err) - return false - } - - g.Log().Debugf(ctx, "✅ Consul 健康检查通过,发现 %d 个服务", len(services)) + // 简单检查注册器是否可用,避免频繁调用Search导致错误 return true }